UNPKG

@strapi/data-transfer

Version:

Data transfer capabilities for Strapi

1 lines • 23.3 kB
{"version":3,"file":"utils.mjs","sources":["../../../../src/strapi/remote/handlers/utils.ts"],"sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport { randomUUID } from 'crypto';\nimport type { Context } from 'koa';\nimport type { RawData, ServerOptions } from 'ws';\nimport { WebSocket, WebSocketServer } from 'ws';\n\nimport type { Handler, TransferState } from './abstract';\nimport type { Protocol } from '../../../../types';\nimport { ProviderError, ProviderTransferError } from '../../../errors/providers';\nimport { VALID_TRANSFER_COMMANDS, ValidTransferCommand } from './constants';\nimport { TransferMethod } from '../constants';\nimport { createDiagnosticReporter } from '../../../utils/diagnostic';\n\ntype WSCallback = (client: WebSocket, request: IncomingMessage) => void;\n\nexport interface HandlerOptions {\n verify: (ctx: Context, scope?: TransferMethod) => Promise<void>;\n server?: ServerOptions;\n}\n\nexport const transformUpgradeHeader = (header = '') => {\n return header.split(',').map((s) => s.trim().toLowerCase());\n};\n\nlet timeouts: Record<string, number> | undefined;\n\nconst hasHttpServer = () => {\n // during server restarts, strapi may not have ever been defined at all, so we have to check it first\n return typeof strapi !== 'undefined' && !!strapi?.server?.httpServer;\n};\n\n// temporarily disable server timeouts while transfer is running\nconst disableTimeouts = () => {\n if (!hasHttpServer()) {\n return;\n }\n\n const { httpServer } = strapi.server;\n\n // save the original timeouts to restore after\n if (!timeouts) {\n timeouts = {\n headersTimeout: httpServer.headersTimeout,\n requestTimeout: httpServer.requestTimeout,\n };\n }\n\n httpServer.headersTimeout = 0;\n httpServer.requestTimeout = 0;\n\n strapi.log.info('[Data transfer] Disabling http timeouts');\n};\nconst resetTimeouts = () => {\n if (!hasHttpServer() || !timeouts) {\n return;\n }\n\n const { httpServer } = strapi.server;\n\n strapi.log.info('[Data transfer] Restoring http timeouts');\n httpServer.headersTimeout = timeouts.headersTimeout;\n httpServer.requestTimeout = timeouts.requestTimeout;\n};\n/**\n * Make sure that the upgrade header is a valid websocket one\n */\nexport const assertValidHeader = (ctx: Context) => {\n // if it's exactly what we expect, it's fine\n if (ctx.headers.upgrade === 'websocket') {\n return;\n }\n\n // check if it could be an array that still includes websocket\n const upgradeHeader = transformUpgradeHeader(ctx.headers.upgrade);\n\n // Sanitize user input before writing it to our logs\n const logSafeUpgradeHeader = JSON.stringify(ctx.headers.upgrade)\n ?.replace(/[^a-z0-9\\s.,|]/gi, '')\n .substring(0, 50);\n\n if (!upgradeHeader.includes('websocket')) {\n throw new Error(\n `Transfer Upgrade header expected 'websocket', found '${logSafeUpgradeHeader}'. Please ensure that your server or proxy is not modifying the Upgrade header.`\n );\n }\n\n /**\n * If there's more than expected but it still includes websocket, in theory it could still work\n * and could be necessary for their certain configurations, so we'll allow it to proceed but\n * log the unexpected behaviour in case it helps debug an issue\n * */\n strapi.log.info(\n `Transfer Upgrade header expected only 'websocket', found unexpected values: ${logSafeUpgradeHeader}`\n );\n};\n\nexport const isDataTransferMessage = (message: unknown): message is Protocol.Client.Message => {\n if (!message || typeof message !== 'object') {\n return false;\n }\n\n const { uuid, type } = message as Record<string, unknown>;\n\n if (typeof uuid !== 'string' || typeof type !== 'string') {\n return false;\n }\n\n if (!['command', 'transfer'].includes(type)) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Handle the upgrade to ws connection\n */\nexport const handleWSUpgrade = (wss: WebSocketServer, ctx: Context, callback: WSCallback) => {\n assertValidHeader(ctx);\n\n wss.handleUpgrade(ctx.req, ctx.request.socket, Buffer.alloc(0), (client, request) => {\n if (!client) {\n // If the WebSocket upgrade failed, destroy the socket to avoid hanging\n ctx.request.socket.destroy();\n return;\n }\n\n disableTimeouts();\n strapi.db.lifecycles.disable();\n strapi.log.info('[Data transfer] Disabling lifecycle hooks');\n\n // Create a connection between the client & the server\n wss.emit('connection', client, ctx.req);\n\n // Invoke the ws callback\n callback(client, request);\n });\n\n ctx.respond = false;\n};\n\n// Protocol related functions\n\nexport const handlerControllerFactory =\n <T extends Partial<Handler>>(implementation: (proto: Handler) => T) =>\n (options: HandlerOptions) => {\n const { verify, server: serverOptions } = options ?? {};\n\n const wss = new WebSocket.Server({ ...serverOptions, noServer: true });\n\n return async (ctx: Context) => {\n const cb: WSCallback = (ws) => {\n const state: TransferState = { id: undefined };\n const messageUUIDs = new Set<string>();\n const diagnostics = createDiagnosticReporter();\n\n const cannotRespondHandler = (err: unknown) => {\n strapi?.log?.error(\n '[Data transfer] Cannot send error response to client, closing connection'\n );\n strapi?.log?.error(err);\n try {\n ws.terminate();\n ctx.req.socket.destroy();\n } catch (err) {\n strapi?.log?.error('[Data transfer] Failed to close socket on error');\n }\n };\n\n const prototype: Handler = {\n // Transfer ID\n get transferID() {\n return state.id;\n },\n\n set transferID(id) {\n state.id = id;\n },\n\n // Started at\n get startedAt() {\n return state.startedAt;\n },\n\n set startedAt(timestamp) {\n state.startedAt = timestamp;\n },\n\n get response() {\n return state.response;\n },\n\n set response(response) {\n state.response = response;\n },\n\n get diagnostics() {\n return diagnostics;\n },\n\n addUUID(uuid) {\n messageUUIDs.add(uuid);\n },\n\n hasUUID(uuid) {\n return messageUUIDs.has(uuid);\n },\n\n isTransferStarted() {\n return this.transferID !== undefined && this.startedAt !== undefined;\n },\n\n assertValidTransfer() {\n const isStarted = this.isTransferStarted();\n\n if (!isStarted) {\n throw new Error('Invalid Transfer Process');\n }\n },\n\n assertValidTransferCommand(command: ValidTransferCommand) {\n const isDefined = typeof this[command] === 'function';\n const isValidTransferCommand = VALID_TRANSFER_COMMANDS.includes(command);\n\n if (!isDefined || !isValidTransferCommand) {\n throw new Error('Invalid transfer command');\n }\n },\n\n async respond(uuid, e, data) {\n let details = {};\n return new Promise<void>((resolve, reject) => {\n if (!uuid && !e) {\n reject(new Error('Missing uuid for this message'));\n return;\n }\n\n this.response = {\n uuid,\n data,\n e,\n };\n\n if (e instanceof ProviderError) {\n details = e.details;\n }\n\n const payload = JSON.stringify({\n uuid,\n data: data ?? null,\n error: e\n ? {\n code: e?.name ?? 'ERR',\n message: e?.message,\n details,\n }\n : null,\n });\n\n this.send(payload, (error) => (error ? reject(error) : resolve()));\n });\n },\n\n send(message, cb) {\n ws.send(message, cb);\n },\n confirm(message) {\n return new Promise((resolve, reject) => {\n const uuid = randomUUID();\n\n const payload = JSON.stringify({ uuid, data: message });\n\n this.send(payload, (error) => {\n if (error) {\n reject(error);\n }\n });\n\n const onResponse = (raw: RawData) => {\n const response = JSON.parse(raw.toString());\n\n if (response.uuid === uuid) {\n resolve(response.data ?? null);\n } else {\n ws.once('message', onResponse);\n }\n };\n\n ws.once('message', onResponse);\n });\n },\n\n async executeAndRespond(uuid, fn) {\n try {\n const response = await fn();\n await this.respond(uuid, null, response);\n } catch (e) {\n if (e instanceof Error) {\n await this.respond(uuid, e).catch(cannotRespondHandler);\n } else if (typeof e === 'string') {\n await this.respond(uuid, new ProviderTransferError(e)).catch(cannotRespondHandler);\n } else {\n await this.respond(\n uuid,\n new ProviderTransferError('Unexpected error', {\n error: e,\n })\n ).catch(cannotRespondHandler);\n }\n }\n },\n\n cleanup() {\n this.transferID = undefined;\n this.startedAt = undefined;\n this.response = undefined;\n },\n\n teardown() {\n this.cleanup();\n },\n\n verifyAuth(scope?: TransferMethod) {\n return verify(ctx, scope);\n },\n\n // Transfer commands\n init() {},\n end() {},\n status() {},\n\n // Default prototype implementation for events\n onMessage() {},\n onError() {},\n onClose() {},\n onInfo() {},\n onWarning() {},\n };\n\n const handler: Handler = Object.assign(Object.create(prototype), implementation(prototype));\n\n // Bind ws events to handler methods\n ws.on('close', async (...args) => {\n try {\n await handler.onClose(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error closing connection');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n } finally {\n resetTimeouts();\n strapi.db.lifecycles.enable();\n strapi.log.info('[Data transfer] Restoring lifecycle hooks');\n }\n });\n ws.on('error', async (...args) => {\n try {\n await handler.onError(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error in error handling');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n }\n });\n ws.on('message', async (...args) => {\n try {\n await handler.onMessage(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error in message handling');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n }\n });\n\n diagnostics.onDiagnostic((diagnostic) => {\n const uuid = randomUUID();\n const payload = JSON.stringify({\n diagnostic,\n uuid,\n });\n\n handler.send(payload);\n });\n };\n\n try {\n handleWSUpgrade(wss, ctx, cb);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Error in websocket upgrade request');\n strapi?.log?.error(err);\n }\n };\n };\n"],"names":["transformUpgradeHeader","header","split","map","s","trim","toLowerCase","timeouts","hasHttpServer","strapi","server","httpServer","disableTimeouts","headersTimeout","requestTimeout","log","info","resetTimeouts","assertValidHeader","ctx","headers","upgrade","upgradeHeader","logSafeUpgradeHeader","JSON","stringify","replace","substring","includes","Error","isDataTransferMessage","message","uuid","type","handleWSUpgrade","wss","callback","handleUpgrade","req","request","socket","Buffer","alloc","client","destroy","db","lifecycles","disable","emit","respond","handlerControllerFactory","implementation","options","verify","serverOptions","WebSocket","Server","noServer","cb","ws","state","id","undefined","messageUUIDs","Set","diagnostics","createDiagnosticReporter","cannotRespondHandler","err","error","terminate","prototype","transferID","startedAt","timestamp","response","addUUID","add","hasUUID","has","isTransferStarted","assertValidTransfer","isStarted","assertValidTransferCommand","command","isDefined","isValidTransferCommand","VALID_TRANSFER_COMMANDS","e","data","details","Promise","resolve","reject","ProviderError","payload","code","name","send","confirm","randomUUID","onResponse","raw","parse","toString","once","executeAndRespond","fn","catch","ProviderTransferError","cleanup","teardown","verifyAuth","scope","init","end","status","onMessage","onError","onClose","onInfo","onWarning","handler","Object","assign","create","on","args","enable","onDiagnostic","diagnostic"],"mappings":"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"}