Skip to content

Latest commit

History

72 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

StrapIO

module for working with socket.io with predefined rules. StrapIO will look at Role permission on each action. StrapIO is looking for all roles which have access to the given contenttype and action type.

UPDATE v2: You need to subscribe first before you receive any data. socket.emit('subscribe', 'article') article is the content-type.

using Strapi v3?

you need to install strapio v2. Version 3 will not work with strapi below 4.

Installation

npm i strapio

src/index.js

bootstrap({strapi}){process.nextTick(()=>{strapi.StrapIO=(require("strapio"))(strapi);});},

Configuration socket.io

bootstrap({strapi}){process.nextTick(()=>{strapi.StrapIO=(require("strapio"))(strapi,{path: "/other/path/",cors: {origin: "*",methods: ["GET","POST"]},});});},

Usage

server

api/<content-type>/controllers/<content-type>.js

module.exports={asynccreate(ctx){letentity;if(ctx.is("multipart")){const{ data, files }=parseMultipartData(ctx);entity=awaitstrapi.services.CONTENTTYPE.create(data,{ files });}else{entity=awaitstrapi.services.CONTENTTYPE.create(ctx.request.body);}strapi.StrapIO.emit(this,"create",entity);// or send custom eventstrapi.StrapIO.emitRaw("myroom","myevent",entity);returnsanitizeEntity(entity,{model: strapi.models.CONTENTTYPE});},asyncupdate(ctx){const{ id }=ctx.params;letentity;if(ctx.is("multipart")){const{ data, files }=parseMultipartData(ctx);entity=awaitstrapi.services.CONTENTTYPE.update({ id },data,{
files,});}else{entity=awaitstrapi.services.CONTENTTYPE.update({ id },ctx.request.body);}strapi.StrapIO.emit(this,"update",entity);returnsanitizeEntity(entity,{model: strapi.models.CONTENTTYPE});},};

Client

constio=require("socket.io-client");// Handshake required, token will be verified against strapiconstsocket=io.connect(API_URL,{query: { token },});socket.emit("subscribe","article");// article is the room which the client joinssocket.on("find",(data)=>{console.log("article:",data);//do something});socket.on("update",(data)=>{// do something});

Client, Web

<scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.2.0/socket.io.js"></script><script>// Handshake required, token will be verified against strapi(function(){constsocket=io("http://localhost:1337/",{path: "/sockettest/",query: {
token,},});socket.emit("subscribe","article");// article is the room which the client joinssocket.emit("subscribe","myroom");// custom roomsocket.on("find",(data)=>{//do something});socket.on("update",(data)=>{// do something});socket.on("myevent",(data)=>{});})();</script>

Full example project

debugging

  • DEBUG=strapio npm run develop
  • DEBUG=* npm run develop

Test

Currently tested with strapi v4

Plugin for strapi

You can install strapio with a plugin npm i strapi-plugin-socket-io.

Contribute

just do it over github or chat with me @Discord

About

Socket.IO Implementation for Strapi

Resources

Stars

31 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages