Update koa <> socket.io integation to improve fake koa context and allow current app middleware

This commit is contained in:
Andrew Kingston 2023-04-20 08:02:49 +01:00
parent d3827cdceb
commit c82451f888
5 changed files with 17 additions and 16 deletions

View File

@ -10,7 +10,7 @@ export const createWebsocket = context => {
const host = location.hostname const host = location.hostname
const port = location.port || (tls ? 443 : 80) const port = location.port || (tls ? 443 : 80)
const socket = io(`${proto}//${host}:${port}`, { const socket = io(`${proto}//${host}:${port}`, {
path: "/socket/spreadsheet", path: "/socket/grid",
// Cap reconnection attempts to 3 (total of 15 seconds before giving up) // Cap reconnection attempts to 3 (total of 15 seconds before giving up)
reconnectionAttempts: 3, reconnectionAttempts: 3,
// Delay reconnection attempt by 5 seconds // Delay reconnection attempt by 5 seconds
@ -48,10 +48,10 @@ export const createWebsocket = context => {
users.actions.removeUser(user) users.actions.removeUser(user)
}) })
socket.on("connect_error", err => { socket.on("connect_error", err => {
console.log("Failed to connect to websocket:", err.message) console.log("Failed to connect to grid websocket:", err.message)
}) })
// Change websocket connection when dataspace changes // Change websocket connection when table changes
tableId.subscribe(connectToTable) tableId.subscribe(connectToTable)
// Notify selected cell changes // Notify selected cell changes

View File

@ -2,7 +2,7 @@ import { quotas } from "@budibase/pro"
import * as internal from "./internal" import * as internal from "./internal"
import * as external from "./external" import * as external from "./external"
import { isExternalTable } from "../../../integrations/utils" import { isExternalTable } from "../../../integrations/utils"
import { spreadsheetSocket } from "../../../websockets" import { gridSocket } from "../../../websockets"
import { Ctx } from "@budibase/types" import { Ctx } from "@budibase/types"
import * as utils from "./utils" import * as utils from "./utils"
@ -50,7 +50,7 @@ export async function patch(ctx: any): Promise<any> {
ctx.body = row ctx.body = row
// Notify websocket change // Notify websocket change
spreadsheetSocket?.emit("row-update", { id: row._id }) gridSocket?.emit("row-update", { id: row._id })
} catch (err) { } catch (err) {
ctx.throw(400, err) ctx.throw(400, err)
} }
@ -75,7 +75,7 @@ export const save = async (ctx: any) => {
ctx.body = row ctx.body = row
// Notify websocket change // Notify websocket change
spreadsheetSocket?.emit("row-update", { id: row._id }) gridSocket?.emit("row-update", { id: row._id })
} }
export async function fetchView(ctx: any) { export async function fetchView(ctx: any) {
const tableId = getTableId(ctx) const tableId = getTableId(ctx)
@ -115,7 +115,7 @@ export async function destroy(ctx: any) {
for (let row of rows) { for (let row of rows) {
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row) ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row)
// Notify websocket change // Notify websocket change
spreadsheetSocket?.emit("row-update", { id: row._id }) gridSocket?.emit("row-update", { id: row._id })
} }
} else { } else {
let resp = await quotas.addQuery(() => pickApi(tableId).destroy(ctx), { let resp = await quotas.addQuery(() => pickApi(tableId).destroy(ctx), {
@ -126,7 +126,7 @@ export async function destroy(ctx: any) {
row = resp.row row = resp.row
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row) ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row)
// Notify websocket change // Notify websocket change
spreadsheetSocket?.emit("row-update", { id: row._id }) gridSocket?.emit("row-update", { id: row._id })
} }
ctx.status = 200 ctx.status = 200
// for automations include the row that was deleted // for automations include the row that was deleted

View File

@ -4,9 +4,9 @@ import { permissions } from "@budibase/backend-core"
import http from "http" import http from "http"
import Koa from "koa" import Koa from "koa"
export default class SpreadsheetSocket extends Socket { export default class GridSocket extends Socket {
constructor(app: Koa, server: http.Server) { constructor(app: Koa, server: http.Server) {
super(app, server, "/socket/spreadsheet", [authorized(permissions.BUILDER)]) super(app, server, "/socket/grid", [authorized(permissions.BUILDER)])
this.io.on("connection", socket => { this.io.on("connection", socket => {
const user = socket.data.user const user = socket.data.user

View File

@ -1,14 +1,14 @@
import http from "http" import http from "http"
import Koa from "koa" import Koa from "koa"
import SpreadsheetSocket from "./spreadsheet" import GridSocket from "./grid"
import ClientAppSocket from "./client" import ClientAppSocket from "./client"
let clientAppSocket: ClientAppSocket let clientAppSocket: ClientAppSocket
let spreadsheetSocket: SpreadsheetSocket let gridSocket: GridSocket
export const initialise = (app: Koa, server: http.Server) => { export const initialise = (app: Koa, server: http.Server) => {
clientAppSocket = new ClientAppSocket(app, server) clientAppSocket = new ClientAppSocket(app, server)
spreadsheetSocket = new SpreadsheetSocket(app, server) gridSocket = new GridSocket(app, server)
} }
export { clientAppSocket, spreadsheetSocket } export { clientAppSocket, gridSocket }

View File

@ -26,7 +26,7 @@ export default class Socket {
const middlewares = [ const middlewares = [
userAgent, userAgent,
authenticate, authenticate,
// currentApp, currentApp,
...(additionalMiddlewares || []), ...(additionalMiddlewares || []),
] ]
@ -46,7 +46,9 @@ export default class Socket {
}, },
// Needed for koa-useragent middleware // Needed for koa-useragent middleware
headers: socket.request.headers,
header: socket.request.headers, header: socket.request.headers,
path: "/socket/grid",
} }
// Run all koa middlewares // Run all koa middlewares
@ -60,7 +62,6 @@ export default class Socket {
socket.data.user = { socket.data.user = {
id: ctx.user._id, id: ctx.user._id,
email: ctx.user.email, email: ctx.user.email,
selectedCellId: null,
} }
next() next()
} }