@openclaw/crabline 0.1.16 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/dist/src/openclaw/bridges/whatsapp.js +21 -1
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/private-file.js +87 -30
- package/dist/src/openclaw/private-file.js.map +1 -1
- package/dist/src/openclaw/shared.d.ts +9 -0
- package/dist/src/openclaw/shared.js +2 -1
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/platform/process-owned-lock.d.ts +5 -2
- package/dist/src/platform/process-owned-lock.js +20 -10
- package/dist/src/platform/process-owned-lock.js.map +1 -1
- package/dist/src/servers/discord.js +25 -35
- package/dist/src/servers/discord.js.map +1 -1
- package/dist/src/servers/http.d.ts +3 -0
- package/dist/src/servers/http.js +15 -0
- package/dist/src/servers/http.js.map +1 -1
- package/dist/src/servers/matrix.js +8 -8
- package/dist/src/servers/matrix.js.map +1 -1
- package/dist/src/servers/mattermost.js +7 -10
- package/dist/src/servers/mattermost.js.map +1 -1
- package/dist/src/servers/recorder.d.ts +16 -6
- package/dist/src/servers/recorder.js +52 -12
- package/dist/src/servers/recorder.js.map +1 -1
- package/dist/src/servers/signal.js +8 -8
- package/dist/src/servers/signal.js.map +1 -1
- package/dist/src/servers/slack.js +8 -8
- package/dist/src/servers/slack.js.map +1 -1
- package/dist/src/servers/telegram.d.ts +2 -2
- package/dist/src/servers/telegram.js +8 -8
- package/dist/src/servers/telegram.js.map +1 -1
- package/dist/src/servers/whatsapp-baileys-websocket.d.ts +15 -0
- package/dist/src/servers/whatsapp-baileys-websocket.js +32 -2
- package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
- package/dist/src/servers/whatsapp.js +189 -29
- package/dist/src/servers/whatsapp.js.map +1 -1
- package/dist/src/servers/zalo.js +8 -7
- package/dist/src/servers/zalo.js.map +1 -1
- package/docs/channel-setup.md +65 -1
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../src/servers/signal.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { isIP } from \"node:net\";\nimport path from \"node:path\";\nimport {\n adminAuthError,\n closeServer,\n drainRequestBody,\n formatUrlHost,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n jsonResponse,\n parseUnknownRequestBody,\n queryRecord,\n readInteger,\n readTrimmedString,\n RequestBodyTooLargeError,\n type ServerRequestEvent,\n writeResponse,\n} from \"./http.js\";\nimport {\n recordCommittedServerEvent,\n recordServerEvent,\n ServerRecorderCommittedError,\n type ServerEventObserver,\n} from \"./recorder.js\";\nimport { resolveMaxPendingInboundEvents } from \"./pending-events.js\";\n\ntype SignalServerState = {\n account: string;\n adminToken: string;\n clients: Set<ServerResponse>;\n clientBuffers: Map<ServerResponse, SignalClientBuffer>;\n maxPendingInboundEvents: number;\n maxSseClients: number;\n lastCommittedTimestamp: number | undefined;\n nextEventSequence: number;\n nextTimestamp: number;\n onEvent: ServerEventObserver | undefined;\n pendingEventBytes: number;\n pendingEvents: SignalSseChunk[];\n pendingTimestampCommits: Promise<void>;\n pendingSseClients: number;\n recorderPath: string;\n};\n\ntype SignalClientBuffer = {\n bytes: number;\n draining: boolean;\n events: SignalSseChunk[];\n inFlight: SignalSseChunk[];\n};\ntype SignalSseChunk = {\n data: string;\n recipients?: Set<ServerResponse> | undefined;\n sequence?: number | undefined;\n};\nconst SIGNAL_CLI_SSE_KEEPALIVE_MS = 15_000;\nconst DEFAULT_MAX_SIGNAL_SSE_CLIENTS = 32;\nconst MAX_SIGNAL_SSE_BUFFER_BYTES = 2 * 1024 * 1024;\nconst SIGNAL_PHONE_NUMBER_RE = /^\\+[1-9]\\d{2,14}$/u;\nconst SIGNAL_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;\ntype SignalSseWriteResult = \"accepted\" | \"queued\" | \"rejected\";\ntype SignalRpcResult =\n | {\n accepted: true;\n record: true;\n response: Response;\n timestamp: number;\n }\n | {\n accepted: false;\n record: boolean;\n response: Response;\n };\ntype SignalRecorderEvent = ServerRequestEvent & {\n accepted?: boolean | undefined;\n};\n\nexport type SignalServerManifest = {\n account: string;\n adminToken: string;\n baseUrl: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n eventsUrl: string;\n rpcUrl: string;\n };\n env: Record<string, never>;\n provider: \"signal\";\n recorderPath: string;\n version: 1;\n};\n\nexport type StartedSignalServer = {\n close(): Promise<void>;\n manifest: SignalServerManifest;\n};\n\nexport type StartSignalServerParams = {\n account?: string | undefined;\n adminToken?: string | undefined;\n allowedHosts?: string[] | undefined;\n host?: string | undefined;\n onEvent?: ServerEventObserver | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n maxPendingInboundEvents?: number | undefined;\n maxSseClients?: number | undefined;\n};\n\nasync function appendEvent(\n state: SignalServerState,\n event: SignalRecorderEvent,\n committed = false,\n): Promise<void> {\n const params = { event, onEvent: state.onEvent, recorderPath: state.recorderPath };\n await (committed ? recordCommittedServerEvent(params) : recordServerEvent(params));\n}\n\nfunction rpcResponse(id: unknown, result: unknown): Response {\n return jsonResponse({ id: id ?? null, jsonrpc: \"2.0\", result });\n}\n\nfunction rpcError(code: number, message: string, id: unknown = null, status = 400): Response {\n return jsonResponse(\n {\n error: { code, message },\n id: id ?? null,\n jsonrpc: \"2.0\",\n },\n status,\n );\n}\n\nfunction removeSignalClient(\n state: SignalServerState,\n client: ServerResponse,\n destroy: boolean,\n): void {\n const buffer = state.clientBuffers.get(client);\n state.clients.delete(client);\n state.clientBuffers.delete(client);\n const bufferedEvents = new Set<SignalSseChunk>([\n ...state.pendingEvents,\n ...[...state.clientBuffers.values()].flatMap((entry) => [...entry.inFlight, ...entry.events]),\n ...(buffer ? [...buffer.inFlight, ...buffer.events] : []),\n ]);\n for (const event of bufferedEvents) {\n event.recipients?.delete(client);\n }\n if (buffer) {\n const restoredEvents = [...new Set([...buffer.inFlight, ...buffer.events])].filter(\n (event) =>\n event.sequence !== undefined &&\n event.recipients?.size === 0 &&\n !isSignalEventBuffered(state, event),\n );\n if (restoredEvents.length > 0) {\n state.pendingEvents.push(...restoredEvents);\n state.pendingEvents.sort(\n (left, right) => (left.sequence ?? Number.MAX_SAFE_INTEGER) - (right.sequence ?? 0),\n );\n state.pendingEventBytes += restoredEvents.reduce(\n (total, event) => total + Buffer.byteLength(event.data),\n 0,\n );\n }\n }\n if (destroy) {\n client.destroy();\n }\n if (state.pendingEvents.length > 0 && state.clients.size > 0) {\n queueMicrotask(() => flushPendingSignalEvents(state));\n }\n}\n\nfunction evictSignalClient(state: SignalServerState, client: ServerResponse): void {\n removeSignalClient(state, client, true);\n}\n\nfunction scheduleSignalDrain(state: SignalServerState, client: ServerResponse): void {\n const buffer = state.clientBuffers.get(client);\n if (!buffer || buffer.draining || client.destroyed || client.writableEnded) {\n return;\n }\n buffer.draining = true;\n client.once(\"drain\", () => {\n const current = state.clientBuffers.get(client);\n if (current) {\n current.bytes -= current.inFlight.reduce(\n (total, event) => total + Buffer.byteLength(event.data),\n 0,\n );\n current.inFlight.length = 0;\n current.draining = false;\n flushSignalClientEvents(state, client);\n const remaining = state.clientBuffers.get(client);\n if (remaining && remaining.events.length === 0 && !client.writableNeedDrain) {\n flushPendingSignalEvents(state);\n }\n }\n });\n}\n\nfunction queueSignalClientEvent(\n state: SignalServerState,\n client: ServerResponse,\n event: SignalSseChunk,\n): SignalSseWriteResult {\n const buffer = state.clientBuffers.get(client);\n const eventBytes = Buffer.byteLength(event.data);\n const alreadyBuffered = isSignalEventBuffered(state, event);\n const pendingEventBytes = state.pendingEvents.includes(event) ? 0 : eventBytes;\n if (\n !buffer ||\n (!alreadyBuffered && signalBufferedEventCount(state) >= state.maxPendingInboundEvents) ||\n state.pendingEventBytes + buffer.bytes + pendingEventBytes > MAX_SIGNAL_SSE_BUFFER_BYTES\n ) {\n evictSignalClient(state, client);\n return \"rejected\";\n }\n buffer.events.push(event);\n buffer.bytes += eventBytes;\n event.recipients?.add(client);\n scheduleSignalDrain(state, client);\n return \"queued\";\n}\n\nfunction writeSignalSse(\n state: SignalServerState,\n client: ServerResponse,\n event: SignalSseChunk,\n): SignalSseWriteResult {\n if (client.destroyed) {\n removeSignalClient(state, client, false);\n return \"rejected\";\n }\n if (client.writableEnded) {\n evictSignalClient(state, client);\n return \"rejected\";\n }\n const eventBytes = Buffer.byteLength(event.data);\n if (eventBytes > MAX_SIGNAL_SSE_BUFFER_BYTES) {\n return \"rejected\";\n }\n const buffer = state.clientBuffers.get(client);\n if (client.writableNeedDrain || buffer?.draining || buffer?.events.length) {\n return queueSignalClientEvent(state, client, event);\n }\n if (client.writableLength + eventBytes > MAX_SIGNAL_SSE_BUFFER_BYTES) {\n evictSignalClient(state, client);\n return \"rejected\";\n }\n const accepted = client.write(event.data);\n event.recipients?.add(client);\n if (!accepted) {\n if (buffer) {\n buffer.inFlight.push(event);\n buffer.bytes += eventBytes;\n }\n scheduleSignalDrain(state, client);\n }\n return \"accepted\";\n}\n\nfunction maxSignalClientBufferBytes(state: SignalServerState): number {\n let maxBytes = 0;\n for (const buffer of state.clientBuffers.values()) {\n maxBytes = Math.max(maxBytes, buffer.bytes);\n }\n return maxBytes;\n}\n\nfunction isSignalEventBuffered(state: SignalServerState, event: SignalSseChunk): boolean {\n return (\n state.pendingEvents.includes(event) ||\n [...state.clientBuffers.values()].some(\n (buffer) => buffer.inFlight.includes(event) || buffer.events.includes(event),\n )\n );\n}\n\nfunction signalBufferedEventCount(state: SignalServerState): number {\n const sequences = new Set<number>();\n for (const event of state.pendingEvents) {\n if (event.sequence !== undefined) {\n sequences.add(event.sequence);\n }\n }\n for (const buffer of state.clientBuffers.values()) {\n for (const event of [...buffer.inFlight, ...buffer.events]) {\n if (event.sequence !== undefined) {\n sequences.add(event.sequence);\n }\n }\n }\n return sequences.size;\n}\n\nfunction queueSignalEvent(state: SignalServerState, event: SignalSseChunk): boolean {\n const eventBytes = Buffer.byteLength(event.data);\n if (\n eventBytes > MAX_SIGNAL_SSE_BUFFER_BYTES ||\n state.pendingEventBytes + maxSignalClientBufferBytes(state) + eventBytes >\n MAX_SIGNAL_SSE_BUFFER_BYTES ||\n (!isSignalEventBuffered(state, event) &&\n signalBufferedEventCount(state) >= state.maxPendingInboundEvents)\n ) {\n return false;\n }\n state.pendingEvents.push(event);\n state.pendingEventBytes += eventBytes;\n return true;\n}\n\nfunction replayExclusiveSignalEvents(state: SignalServerState, client: ServerResponse): void {\n const events = new Map<number, SignalSseChunk>();\n for (const [owner, buffer] of state.clientBuffers) {\n if (owner === client) {\n continue;\n }\n for (const event of [...buffer.inFlight, ...buffer.events]) {\n if (\n event.sequence !== undefined &&\n event.recipients?.size === 1 &&\n event.recipients.has(owner)\n ) {\n events.set(event.sequence, event);\n }\n }\n }\n for (const event of [...events.values()].sort(\n (left, right) => left.sequence! - right.sequence!,\n )) {\n if (writeSignalSse(state, client, event) === \"rejected\") {\n break;\n }\n }\n}\n\nfunction flushSignalClientEvents(state: SignalServerState, client: ServerResponse): void {\n while (!client.writableNeedDrain) {\n const buffer = state.clientBuffers.get(client);\n if (!buffer || buffer.events.length === 0) {\n break;\n }\n const event = buffer.events.shift()!;\n if (!client.write(event.data)) {\n buffer.inFlight.push(event);\n scheduleSignalDrain(state, client);\n break;\n }\n buffer.bytes -= Buffer.byteLength(event.data);\n }\n}\n\nfunction flushPendingSignalEvents(state: SignalServerState): void {\n while (state.pendingEvents.length > 0 && state.clients.size > 0) {\n const event = state.pendingEvents[0]!;\n for (const client of [...state.clients]) {\n if (!event.recipients?.has(client)) {\n writeSignalSse(state, client, event);\n }\n }\n if (\n state.clients.size === 0 ||\n [...state.clients].some((client) => !event.recipients?.has(client))\n ) {\n break;\n }\n state.pendingEvents.shift();\n state.pendingEventBytes -= Buffer.byteLength(event.data);\n }\n}\n\nfunction emitSignalEvent(state: SignalServerState, payload: unknown): boolean {\n const event: SignalSseChunk = {\n data: `event:receive\\ndata:${JSON.stringify(payload)}\\n\\n`,\n recipients: new Set(),\n sequence: state.nextEventSequence++,\n };\n if (state.clients.size === 0 || state.pendingEvents.length > 0) {\n return queueSignalEvent(state, event);\n }\n let delivered = false;\n for (const client of state.clients) {\n const result = writeSignalSse(state, client, event);\n delivered = result === \"accepted\" || result === \"queued\" || delivered;\n }\n return delivered || queueSignalEvent(state, event);\n}\n\nfunction normalizeSignalPhoneNumber(value: unknown): string | undefined {\n const number = readTrimmedString(value)?.replace(/[\\s().-]/gu, \"\");\n return number && SIGNAL_PHONE_NUMBER_RE.test(number) ? number : undefined;\n}\n\nfunction isSignalDirectRecipient(value: unknown): boolean {\n const recipient = readSignalRpcString(value);\n if (!recipient) {\n return false;\n }\n if (SIGNAL_UUID_RE.test(recipient)) {\n return true;\n }\n // signal-cli treats recognized prefixes as terminal instead of retrying them as phone numbers.\n if (recipient.startsWith(\"PNI:\")) {\n return SIGNAL_UUID_RE.test(recipient.slice(4));\n }\n if (recipient.startsWith(\"u:\")) {\n return recipient.length > 2;\n }\n return SIGNAL_PHONE_NUMBER_RE.test(recipient);\n}\n\nfunction nextSignalTimestamp(state: SignalServerState): number {\n return Math.max(state.nextTimestamp, (state.lastCommittedTimestamp ?? -1) + 1);\n}\n\nfunction commitSignalTimestamp(state: SignalServerState, timestamp: number): void {\n state.lastCommittedTimestamp = timestamp;\n state.nextTimestamp = Math.max(state.nextTimestamp, timestamp + 1);\n}\n\nasync function handleAdminInbound(params: {\n body: Record<string, unknown>;\n state: SignalServerState;\n}): Promise<Response> {\n const text = typeof params.body.text === \"string\" ? params.body.text : undefined;\n const sourceNumberValue = params.body.sourceNumber ?? params.body.senderId;\n const sourceNumber = normalizeSignalPhoneNumber(sourceNumberValue);\n const sourceUuidValue = readTrimmedString(params.body.sourceUuid);\n const sourceUuid =\n sourceUuidValue && SIGNAL_UUID_RE.test(sourceUuidValue)\n ? sourceUuidValue.toLowerCase()\n : undefined;\n if (sourceNumberValue !== undefined && sourceNumber === undefined) {\n return jsonResponse(\n { error: \"sourceNumber must be an E.164 telephone number\", ok: false },\n 400,\n );\n }\n if (params.body.sourceUuid !== undefined && sourceUuid === undefined) {\n return jsonResponse({ error: \"sourceUuid must be a UUID\", ok: false }, 400);\n }\n if (!text || text.trim().length === 0 || (!sourceNumber && !sourceUuid)) {\n return jsonResponse(\n { error: \"text and at least one source identity are required\", ok: false },\n 400,\n );\n }\n const suppliedTimestamp =\n params.body.timestamp === undefined ? undefined : readInteger(params.body.timestamp);\n if (\n params.body.timestamp !== undefined &&\n (suppliedTimestamp === undefined ||\n suppliedTimestamp < 0 ||\n suppliedTimestamp >= Number.MAX_SAFE_INTEGER)\n ) {\n return jsonResponse(\n { error: \"timestamp must be a non-negative safe integer with room to advance\", ok: false },\n 400,\n );\n }\n if (\n suppliedTimestamp !== undefined &&\n params.state.lastCommittedTimestamp !== undefined &&\n suppliedTimestamp <= params.state.lastCommittedTimestamp\n ) {\n return jsonResponse(\n { error: \"timestamp must be greater than the last committed timestamp\", ok: false },\n 409,\n );\n }\n const timestamp = suppliedTimestamp ?? nextSignalTimestamp(params.state);\n if (timestamp >= Number.MAX_SAFE_INTEGER) {\n return jsonResponse({ error: \"timestamp capacity exhausted\", ok: false }, 503);\n }\n const groupId = readTrimmedString(params.body.groupId);\n const payload = {\n envelope: {\n sourceName: readTrimmedString(params.body.sourceName ?? params.body.senderName),\n ...(sourceNumber ? { sourceNumber } : {}),\n ...(sourceUuid ? { sourceUuid } : {}),\n timestamp,\n dataMessage: {\n message: text,\n timestamp,\n ...(groupId ? { groupInfo: { groupId } } : {}),\n },\n },\n };\n if (!emitSignalEvent(params.state, payload)) {\n return jsonResponse(\n {\n error: `Pending inbound queue is full (${params.state.maxPendingInboundEvents} events)`,\n ok: false,\n },\n 503,\n );\n }\n commitSignalTimestamp(params.state, timestamp);\n return jsonResponse({ event: payload, ok: true });\n}\n\nasync function handleRpc(params: {\n body: Record<string, unknown>;\n state: SignalServerState;\n}): Promise<SignalRpcResult> {\n const hasId = Object.hasOwn(params.body, \"id\");\n const id = params.body.id;\n const validId =\n !hasId ||\n id === null ||\n typeof id === \"string\" ||\n (typeof id === \"number\" &&\n Number.isFinite(id) &&\n (!Number.isInteger(id) || Number.isSafeInteger(id)));\n const method = params.body.method;\n if (typeof method !== \"string\" || !validId) {\n return {\n accepted: false,\n record: false,\n response: rpcError(-32600, \"Invalid Request\", validId ? id : null),\n };\n }\n if (params.body.jsonrpc !== \"2.0\") {\n return {\n accepted: false,\n record: false,\n response: rpcError(-32600, \"Invalid Request\", id),\n };\n }\n const notification = !hasId;\n if (\n params.body.params !== undefined &&\n !Array.isArray(params.body.params) &&\n !isJsonObject(params.body.params)\n ) {\n return {\n accepted: false,\n record: false,\n response: rpcError(-32600, \"Invalid Request\", id),\n };\n }\n if (method === \"version\") {\n return {\n accepted: false,\n record: true,\n response: notification\n ? new Response(null, { status: 204 })\n : rpcResponse(id, { version: \"crabline-signal-1\" }),\n };\n }\n if ([\"send\", \"sendReaction\", \"sendReceipt\", \"sendTyping\"].includes(method)) {\n if (!validSignalRpcParams(method, params.body.params)) {\n return {\n accepted: false,\n record: false,\n response: notification\n ? new Response(null, { status: 204 })\n : rpcError(-32602, \"Invalid params\", id, 200),\n };\n }\n const account = params.body.params.account;\n if (typeof account === \"string\" && account !== params.state.account) {\n return {\n accepted: false,\n record: false,\n response: notification\n ? new Response(null, { status: 204 })\n : rpcError(-32602, \"Specified account does not exist\", id, 200),\n };\n }\n const timestamp = nextSignalTimestamp(params.state);\n if (timestamp >= Number.MAX_SAFE_INTEGER) {\n return {\n accepted: false,\n record: false,\n response: notification\n ? new Response(null, { status: 204 })\n : rpcError(-32603, \"Timestamp capacity exhausted\", id, 200),\n };\n }\n return {\n accepted: true,\n record: true,\n response: notification\n ? new Response(null, { status: 204 })\n : rpcResponse(id, method === \"sendTyping\" ? {} : { timestamp }),\n timestamp,\n };\n }\n return {\n accepted: false,\n record: false,\n response: notification\n ? new Response(null, { status: 204 })\n : jsonResponse({\n error: { code: -32601, message: `Method not found: ${method}` },\n id: id ?? null,\n jsonrpc: \"2.0\",\n }),\n };\n}\n\nfunction hasRecipients(params: Record<string, unknown>): boolean {\n const values = [\n params.recipient,\n params.recipients,\n params.groupId,\n params.groupIds,\n params.username,\n params.usernames,\n ];\n return (\n params.noteToSelf === true ||\n values.some(\n (value) =>\n (typeof value === \"string\" && value.trim().length > 0) ||\n (Array.isArray(value) &&\n value.length > 0 &&\n value.every((entry) => typeof entry === \"string\" && entry.trim().length > 0)),\n )\n );\n}\n\nfunction hasTypingRecipients(params: Record<string, unknown>): boolean {\n if (\n params.noteToSelf !== undefined ||\n params.username !== undefined ||\n params.usernames !== undefined ||\n (params.stop !== undefined && typeof params.stop !== \"boolean\")\n ) {\n return false;\n }\n return [params.recipient, params.recipients, params.groupId, params.groupIds].some(\n (value) =>\n (typeof value === \"string\" && value.trim().length > 0) ||\n (Array.isArray(value) &&\n value.length > 0 &&\n value.every((entry) => typeof entry === \"string\" && entry.trim().length > 0)),\n );\n}\n\nfunction validTimestamp(value: unknown): boolean {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction hasStringArray(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n value.every((entry) => typeof entry === \"string\" && entry.trim().length > 0)\n );\n}\n\nfunction readSignalRpcString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction hasValidSignalRecipientFieldTypes(params: Record<string, unknown>): boolean {\n return [\"recipient\", \"recipients\", \"groupId\", \"groupIds\", \"username\", \"usernames\"].every(\n (field) => {\n const value = params[field];\n return (\n value === undefined ||\n (typeof value === \"string\" && value.trim().length > 0) ||\n hasStringArray(value)\n );\n },\n );\n}\n\nfunction hasValidOptionalSignalString(params: Record<string, unknown>, field: string): boolean {\n return params[field] === undefined || typeof params[field] === \"string\";\n}\n\nfunction hasValidSignalDirectRecipients(params: Record<string, unknown>): boolean {\n return [\"recipient\", \"recipients\"].every((field) => {\n const value = params[field];\n return (\n value === undefined ||\n (Array.isArray(value)\n ? value.length > 0 && value.every(isSignalDirectRecipient)\n : isSignalDirectRecipient(value))\n );\n });\n}\n\nfunction validSignalRpcParams(method: string, value: unknown): value is Record<string, unknown> {\n if (\n !isJsonObject(value) ||\n !hasValidSignalRecipientFieldTypes(value) ||\n !hasValidSignalDirectRecipients(value) ||\n !hasValidOptionalSignalString(value, \"account\") ||\n (value.noteToSelf !== undefined && typeof value.noteToSelf !== \"boolean\")\n ) {\n return false;\n }\n if (method === \"send\") {\n return (\n hasValidOptionalSignalString(value, \"message\") &&\n hasValidOptionalSignalString(value, \"attachment\") &&\n (value.attachments === undefined || hasStringArray(value.attachments)) &&\n hasRecipients(value) &&\n (readSignalRpcString(value.message) !== undefined ||\n readSignalRpcString(value.attachment) !== undefined ||\n hasStringArray(value.attachments))\n );\n }\n if (method === \"sendReaction\") {\n return (\n hasValidOptionalSignalString(value, \"emoji\") &&\n hasValidOptionalSignalString(value, \"targetAuthor\") &&\n hasRecipients(value) &&\n readSignalRpcString(value.emoji) !== undefined &&\n isSignalDirectRecipient(value.targetAuthor) &&\n validTimestamp(value.targetTimestamp)\n );\n }\n if (method === \"sendReceipt\") {\n const targetTimestamps = value.targetTimestamps ?? value.targetTimestamp;\n const timestamps = Array.isArray(targetTimestamps) ? targetTimestamps : [targetTimestamps];\n return (\n hasValidOptionalSignalString(value, \"type\") &&\n (readSignalRpcString(value.recipient) !== undefined ||\n readSignalRpcString(value.username) !== undefined ||\n hasStringArray(value.usernames)) &&\n timestamps.length > 0 &&\n timestamps.every(validTimestamp) &&\n (value.type === undefined || value.type === \"read\" || value.type === \"viewed\")\n );\n }\n return method === \"sendTyping\" && hasTypingRecipients(value);\n}\n\nfunction serializeSignalTimestampCommit<T>(\n state: SignalServerState,\n operation: () => Promise<T>,\n): Promise<T> {\n const run = state.pendingTimestampCommits.catch(() => {}).then(operation);\n state.pendingTimestampCommits = run.then(\n () => undefined,\n () => undefined,\n );\n return run;\n}\n\nfunction processSignalAdminInbound(params: {\n body: Record<string, unknown>;\n state: SignalServerState;\n}): Promise<Response> {\n return serializeSignalTimestampCommit(params.state, () => handleAdminInbound(params));\n}\n\nasync function processSignalRpc(params: {\n body: Record<string, unknown>;\n state: SignalServerState;\n url: URL;\n}): Promise<Response> {\n return serializeSignalTimestampCommit(params.state, async () => {\n const rpc = await handleRpc({ body: params.body, state: params.state });\n if (rpc.record) {\n const event: SignalRecorderEvent = {\n accepted: rpc.accepted,\n at: new Date().toISOString(),\n body: params.body,\n method: \"POST\",\n path: params.url.pathname,\n query: queryRecord(params.url),\n type: \"api\",\n };\n if (rpc.accepted) {\n try {\n await appendEvent(params.state, event);\n } catch (error) {\n if (!(error instanceof ServerRecorderCommittedError)) {\n throw error;\n }\n }\n commitSignalTimestamp(params.state, rpc.timestamp);\n } else {\n await appendEvent(params.state, event, rpc.response.status === 204);\n }\n }\n return rpc.response;\n });\n}\n\nfunction hasSignalJsonContentType(request: IncomingMessage): boolean {\n const contentType = request.headers[\"content-type\"];\n const values = Array.isArray(contentType) ? contentType : [contentType];\n return values.some(\n (value) => value?.split(\";\", 1)[0]?.trim().toLowerCase() === \"application/json\",\n );\n}\n\nasync function handleRequest(params: {\n request: IncomingMessage;\n response: ServerResponse;\n state: SignalServerState;\n}): Promise<void> {\n const url = new URL(params.request.url ?? \"/\", \"http://localhost\");\n if (url.pathname === \"/api/v1/events\" && params.request.method === \"GET\") {\n if (params.state.clients.size + params.state.pendingSseClients >= params.state.maxSseClients) {\n await writeResponse(\n params.response,\n jsonResponse({ error: \"Too many event stream clients\", ok: false }, 503),\n );\n return;\n }\n params.state.pendingSseClients += 1;\n try {\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n method: \"GET\",\n path: url.pathname,\n query: queryRecord(url),\n type: \"api\",\n });\n } finally {\n params.state.pendingSseClients -= 1;\n }\n if (params.request.destroyed || params.response.destroyed) {\n return;\n }\n params.response.writeHead(200, {\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"content-type\": \"text/event-stream\",\n });\n params.response.once(\"close\", () => {\n removeSignalClient(params.state, params.response, false);\n });\n params.state.clients.add(params.response);\n params.state.clientBuffers.set(params.response, {\n bytes: 0,\n draining: false,\n events: [],\n inFlight: [],\n });\n params.response.flushHeaders();\n replayExclusiveSignalEvents(params.state, params.response);\n if (params.state.clients.has(params.response)) {\n flushPendingSignalEvents(params.state);\n }\n return;\n }\n\n let fetchResponse: Response;\n if (url.pathname === \"/crabline/signal/inbound\" && params.request.method === \"POST\") {\n if (!hasAdminToken(params.request, params.state.adminToken)) {\n drainRequestBody(params.request);\n fetchResponse = adminAuthError();\n } else {\n const body = await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n fetchResponse = jsonResponse(\n { error: \"Request body must be a JSON object\", ok: false },\n 400,\n );\n await writeResponse(params.response, fetchResponse);\n return;\n }\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n body,\n method: \"POST\",\n path: url.pathname,\n query: queryRecord(url),\n type: \"admin\",\n });\n fetchResponse = await processSignalAdminInbound({ body, state: params.state });\n }\n } else if (url.pathname === \"/api/v1/check\" && params.request.method === \"GET\") {\n await appendEvent(params.state, {\n accepted: true,\n at: new Date().toISOString(),\n method: \"GET\",\n path: url.pathname,\n query: queryRecord(url),\n type: \"api\",\n });\n fetchResponse = new Response(null, { status: 200 });\n } else if (url.pathname === \"/api/v1/rpc\" && params.request.method === \"POST\") {\n if (!hasSignalJsonContentType(params.request)) {\n drainRequestBody(params.request);\n fetchResponse = new Response(null, { status: 415 });\n } else {\n const body = await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n await writeResponse(params.response, rpcError(-32600, \"Invalid Request\"));\n return;\n }\n fetchResponse = await processSignalRpc({ body, state: params.state, url });\n }\n } else {\n fetchResponse = new Response(\"not found\", { status: 404 });\n }\n await writeResponse(params.response, fetchResponse);\n}\n\nfunction normalizeSignalHost(value: string): string {\n const normalized = value\n .trim()\n .replace(/^\\[(.*)\\]$/u, \"$1\")\n .toLowerCase()\n .replace(/\\.$/u, \"\");\n if (isIP(normalized) !== 6) {\n return normalized;\n }\n const canonical = new URL(`http://[${normalized}]`).hostname.slice(1, -1);\n const mapped = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/u.exec(canonical);\n if (!mapped?.[1] || !mapped[2]) {\n return canonical;\n }\n const high = Number.parseInt(mapped[1], 16);\n const low = Number.parseInt(mapped[2], 16);\n return `${high >>> 8}.${high & 0xff}.${low >>> 8}.${low & 0xff}`;\n}\n\nfunction parseSignalHostHeader(value: string): string | undefined {\n const match = value.startsWith(\"[\")\n ? /^\\[([^\\]]+)\\](?::(\\d{1,5}))?$/u.exec(value)\n : /^([^:]+)(?::(\\d{1,5}))?$/u.exec(value);\n if (!match?.[1]) {\n return undefined;\n }\n const port = match[2] === undefined ? undefined : Number(match[2]);\n if (port !== undefined && port > 65_535) {\n return undefined;\n }\n const hostname = normalizeSignalHost(match[1]);\n if (isIP(hostname) !== 0) {\n return hostname;\n }\n const labels = hostname.split(\".\");\n return hostname.length <= 253 &&\n labels.every((label) => /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/u.test(label))\n ? hostname\n : undefined;\n}\n\nfunction signalRequestHostAllowed(\n request: IncomingMessage,\n bindHost: string,\n allowedHosts: ReadonlySet<string>,\n): boolean {\n const hostHeader = request.headers.host;\n if (!hostHeader) {\n return false;\n }\n const requestedHost = parseSignalHostHeader(hostHeader);\n if (requestedHost === undefined) {\n return false;\n }\n const normalizedBindHost = normalizeSignalHost(bindHost);\n if (allowedHosts.has(requestedHost)) {\n return true;\n }\n if (normalizedBindHost !== \"0.0.0.0\" && normalizedBindHost !== \"::\") {\n return false;\n }\n const localAddress = normalizeSignalHost(request.socket.localAddress ?? \"\");\n return isIP(requestedHost) !== 0 && requestedHost === localAddress;\n}\n\nexport async function startSignalServer(\n params: StartSignalServerParams = {},\n): Promise<StartedSignalServer> {\n const account = normalizeSignalPhoneNumber(params.account ?? \"+15550000000\");\n if (!account) {\n throw new Error(\"account must be an E.164 telephone number.\");\n }\n const state: SignalServerState = {\n account,\n adminToken: params.adminToken ?? randomBytes(24).toString(\"base64url\"),\n clients: new Set(),\n clientBuffers: new Map(),\n lastCommittedTimestamp: undefined,\n maxPendingInboundEvents: resolveMaxPendingInboundEvents(params.maxPendingInboundEvents),\n maxSseClients:\n Number.isSafeInteger(params.maxSseClients) && (params.maxSseClients ?? 0) > 0\n ? params.maxSseClients!\n : DEFAULT_MAX_SIGNAL_SSE_CLIENTS,\n nextEventSequence: 1,\n nextTimestamp: Date.now(),\n onEvent: params.onEvent,\n pendingEventBytes: 0,\n pendingEvents: [],\n pendingTimestampCommits: Promise.resolve(),\n pendingSseClients: 0,\n recorderPath: params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"signal.jsonl\"),\n };\n const host = params.host ?? \"127.0.0.1\";\n const normalizedHost = normalizeSignalHost(host);\n const allowedHosts = new Set([\n ...(normalizedHost === \"0.0.0.0\" || normalizedHost === \"::\" ? [] : [normalizedHost]),\n ...(params.allowedHosts ?? []).map((allowedHost) => normalizeSignalHost(allowedHost)),\n ]);\n const server = createServer((request, response) => {\n if (!signalRequestHostAllowed(request, host, allowedHosts)) {\n drainRequestBody(request);\n void writeResponse(\n response,\n jsonResponse({ error: \"Host header is not allowed\", ok: false }, 400),\n ).catch(() => response.destroy());\n return;\n }\n void handleRequest({ request, response, state }).catch(async (error) => {\n if (!response.headersSent) {\n let errorResponse: Response;\n const isAdminRequest =\n new URL(request.url ?? \"/\", \"http://localhost\").pathname === \"/crabline/signal/inbound\";\n if (error instanceof InvalidJsonBodyError) {\n errorResponse = isAdminRequest\n ? jsonResponse({ error: \"Request body is not valid JSON\", ok: false }, 400)\n : rpcError(-32700, \"Parse error\");\n } else if (error instanceof RequestBodyTooLargeError) {\n errorResponse = isAdminRequest\n ? jsonResponse({ error: \"Request body is too large\", ok: false }, 413)\n : rpcError(-32600, \"Request body is too large\", null, 413);\n } else {\n errorResponse = jsonResponse({ error: \"internal server error\", ok: false }, 500);\n }\n try {\n await writeResponse(response, errorResponse);\n } catch (writeError) {\n response.destroy(\n writeError instanceof Error ? writeError : new Error(String(writeError)),\n );\n }\n } else {\n response.destroy(error instanceof Error ? error : new Error(String(error)));\n }\n });\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(params.port ?? 0, host, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address();\n if (!address || typeof address === \"string\") {\n await closeServer(server);\n throw new Error(\"Unable to resolve Signal local server address.\");\n }\n const keepalive = setInterval(() => {\n for (const client of state.clients) {\n writeSignalSse(state, client, { data: \":\\n\" });\n }\n }, SIGNAL_CLI_SSE_KEEPALIVE_MS);\n keepalive.unref();\n const advertisedHost =\n normalizedHost === \"0.0.0.0\" ? \"127.0.0.1\" : normalizedHost === \"::\" ? \"::1\" : host;\n const baseUrl = `http://${formatUrlHost(advertisedHost)}:${address.port}`;\n return {\n async close() {\n clearInterval(keepalive);\n for (const client of state.clients) {\n client.end();\n }\n await closeServer(server);\n },\n manifest: {\n account: state.account,\n adminToken: state.adminToken,\n baseUrl,\n endpoints: {\n adminInboundUrl: `${baseUrl}/crabline/signal/inbound`,\n apiRoot: baseUrl,\n eventsUrl: `${baseUrl}/api/v1/events`,\n rpcUrl: `${baseUrl}/api/v1/rpc`,\n },\n env: {},\n provider: \"signal\",\n recorderPath: state.recorderPath,\n version: 1,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../src/servers/signal.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { isIP } from \"node:net\";\nimport path from \"node:path\";\nimport {\n adminAuthError,\n closeServer,\n createServerClose,\n drainRequestBody,\n formatUrlHost,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n jsonResponse,\n parseUnknownRequestBody,\n queryRecord,\n readInteger,\n readTrimmedString,\n RequestBodyTooLargeError,\n type ServerRequestEvent,\n writeResponse,\n} from \"./http.js\";\nimport {\n createServerRecorder,\n type ServerRecorder,\n ServerRecorderCommittedError,\n type ServerEventObserver,\n} from \"./recorder.js\";\nimport { resolveMaxPendingInboundEvents } from \"./pending-events.js\";\n\ntype SignalServerState = {\n account: string;\n adminToken: string;\n clients: Set<ServerResponse>;\n clientBuffers: Map<ServerResponse, SignalClientBuffer>;\n maxPendingInboundEvents: number;\n maxSseClients: number;\n lastCommittedTimestamp: number | undefined;\n nextEventSequence: number;\n nextTimestamp: number;\n recorder: ServerRecorder;\n pendingEventBytes: number;\n pendingEvents: SignalSseChunk[];\n pendingTimestampCommits: Promise<void>;\n pendingSseClients: number;\n recorderPath: string;\n};\n\ntype SignalClientBuffer = {\n bytes: number;\n draining: boolean;\n events: SignalSseChunk[];\n inFlight: SignalSseChunk[];\n};\ntype SignalSseChunk = {\n data: string;\n recipients?: Set<ServerResponse> | undefined;\n sequence?: number | undefined;\n};\nconst SIGNAL_CLI_SSE_KEEPALIVE_MS = 15_000;\nconst DEFAULT_MAX_SIGNAL_SSE_CLIENTS = 32;\nconst MAX_SIGNAL_SSE_BUFFER_BYTES = 2 * 1024 * 1024;\nconst SIGNAL_PHONE_NUMBER_RE = /^\\+[1-9]\\d{2,14}$/u;\nconst SIGNAL_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;\ntype SignalSseWriteResult = \"accepted\" | \"queued\" | \"rejected\";\ntype SignalRpcResult =\n | {\n accepted: true;\n record: true;\n response: Response;\n timestamp: number;\n }\n | {\n accepted: false;\n record: boolean;\n response: Response;\n };\ntype SignalRecorderEvent = ServerRequestEvent & {\n accepted?: boolean | undefined;\n};\n\nexport type SignalServerManifest = {\n account: string;\n adminToken: string;\n baseUrl: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n eventsUrl: string;\n rpcUrl: string;\n };\n env: Record<string, never>;\n provider: \"signal\";\n recorderPath: string;\n version: 1;\n};\n\nexport type StartedSignalServer = {\n close(): Promise<void>;\n manifest: SignalServerManifest;\n};\n\nexport type StartSignalServerParams = {\n account?: string | undefined;\n adminToken?: string | undefined;\n allowedHosts?: string[] | undefined;\n host?: string | undefined;\n onEvent?: ServerEventObserver | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n maxPendingInboundEvents?: number | undefined;\n maxSseClients?: number | undefined;\n};\n\nasync function appendEvent(\n state: SignalServerState,\n event: SignalRecorderEvent,\n committed = false,\n): Promise<void> {\n await (committed ? state.recorder.recordCommitted(event) : state.recorder.record(event));\n}\n\nfunction rpcResponse(id: unknown, result: unknown): Response {\n return jsonResponse({ id: id ?? null, jsonrpc: \"2.0\", result });\n}\n\nfunction rpcError(code: number, message: string, id: unknown = null, status = 400): Response {\n return jsonResponse(\n {\n error: { code, message },\n id: id ?? null,\n jsonrpc: \"2.0\",\n },\n status,\n );\n}\n\nfunction removeSignalClient(\n state: SignalServerState,\n client: ServerResponse,\n destroy: boolean,\n): void {\n const buffer = state.clientBuffers.get(client);\n state.clients.delete(client);\n state.clientBuffers.delete(client);\n const bufferedEvents = new Set<SignalSseChunk>([\n ...state.pendingEvents,\n ...[...state.clientBuffers.values()].flatMap((entry) => [...entry.inFlight, ...entry.events]),\n ...(buffer ? [...buffer.inFlight, ...buffer.events] : []),\n ]);\n for (const event of bufferedEvents) {\n event.recipients?.delete(client);\n }\n if (buffer) {\n const restoredEvents = [...new Set([...buffer.inFlight, ...buffer.events])].filter(\n (event) =>\n event.sequence !== undefined &&\n event.recipients?.size === 0 &&\n !isSignalEventBuffered(state, event),\n );\n if (restoredEvents.length > 0) {\n state.pendingEvents.push(...restoredEvents);\n state.pendingEvents.sort(\n (left, right) => (left.sequence ?? Number.MAX_SAFE_INTEGER) - (right.sequence ?? 0),\n );\n state.pendingEventBytes += restoredEvents.reduce(\n (total, event) => total + Buffer.byteLength(event.data),\n 0,\n );\n }\n }\n if (destroy) {\n client.destroy();\n }\n if (state.pendingEvents.length > 0 && state.clients.size > 0) {\n queueMicrotask(() => flushPendingSignalEvents(state));\n }\n}\n\nfunction evictSignalClient(state: SignalServerState, client: ServerResponse): void {\n removeSignalClient(state, client, true);\n}\n\nfunction scheduleSignalDrain(state: SignalServerState, client: ServerResponse): void {\n const buffer = state.clientBuffers.get(client);\n if (!buffer || buffer.draining || client.destroyed || client.writableEnded) {\n return;\n }\n buffer.draining = true;\n client.once(\"drain\", () => {\n const current = state.clientBuffers.get(client);\n if (current) {\n current.bytes -= current.inFlight.reduce(\n (total, event) => total + Buffer.byteLength(event.data),\n 0,\n );\n current.inFlight.length = 0;\n current.draining = false;\n flushSignalClientEvents(state, client);\n const remaining = state.clientBuffers.get(client);\n if (remaining && remaining.events.length === 0 && !client.writableNeedDrain) {\n flushPendingSignalEvents(state);\n }\n }\n });\n}\n\nfunction queueSignalClientEvent(\n state: SignalServerState,\n client: ServerResponse,\n event: SignalSseChunk,\n): SignalSseWriteResult {\n const buffer = state.clientBuffers.get(client);\n const eventBytes = Buffer.byteLength(event.data);\n const alreadyBuffered = isSignalEventBuffered(state, event);\n const pendingEventBytes = state.pendingEvents.includes(event) ? 0 : eventBytes;\n if (\n !buffer ||\n (!alreadyBuffered && signalBufferedEventCount(state) >= state.maxPendingInboundEvents) ||\n state.pendingEventBytes + buffer.bytes + pendingEventBytes > MAX_SIGNAL_SSE_BUFFER_BYTES\n ) {\n evictSignalClient(state, client);\n return \"rejected\";\n }\n buffer.events.push(event);\n buffer.bytes += eventBytes;\n event.recipients?.add(client);\n scheduleSignalDrain(state, client);\n return \"queued\";\n}\n\nfunction writeSignalSse(\n state: SignalServerState,\n client: ServerResponse,\n event: SignalSseChunk,\n): SignalSseWriteResult {\n if (client.destroyed) {\n removeSignalClient(state, client, false);\n return \"rejected\";\n }\n if (client.writableEnded) {\n evictSignalClient(state, client);\n return \"rejected\";\n }\n const eventBytes = Buffer.byteLength(event.data);\n if (eventBytes > MAX_SIGNAL_SSE_BUFFER_BYTES) {\n return \"rejected\";\n }\n const buffer = state.clientBuffers.get(client);\n if (client.writableNeedDrain || buffer?.draining || buffer?.events.length) {\n return queueSignalClientEvent(state, client, event);\n }\n if (client.writableLength + eventBytes > MAX_SIGNAL_SSE_BUFFER_BYTES) {\n evictSignalClient(state, client);\n return \"rejected\";\n }\n const accepted = client.write(event.data);\n event.recipients?.add(client);\n if (!accepted) {\n if (buffer) {\n buffer.inFlight.push(event);\n buffer.bytes += eventBytes;\n }\n scheduleSignalDrain(state, client);\n }\n return \"accepted\";\n}\n\nfunction maxSignalClientBufferBytes(state: SignalServerState): number {\n let maxBytes = 0;\n for (const buffer of state.clientBuffers.values()) {\n maxBytes = Math.max(maxBytes, buffer.bytes);\n }\n return maxBytes;\n}\n\nfunction isSignalEventBuffered(state: SignalServerState, event: SignalSseChunk): boolean {\n return (\n state.pendingEvents.includes(event) ||\n [...state.clientBuffers.values()].some(\n (buffer) => buffer.inFlight.includes(event) || buffer.events.includes(event),\n )\n );\n}\n\nfunction signalBufferedEventCount(state: SignalServerState): number {\n const sequences = new Set<number>();\n for (const event of state.pendingEvents) {\n if (event.sequence !== undefined) {\n sequences.add(event.sequence);\n }\n }\n for (const buffer of state.clientBuffers.values()) {\n for (const event of [...buffer.inFlight, ...buffer.events]) {\n if (event.sequence !== undefined) {\n sequences.add(event.sequence);\n }\n }\n }\n return sequences.size;\n}\n\nfunction queueSignalEvent(state: SignalServerState, event: SignalSseChunk): boolean {\n const eventBytes = Buffer.byteLength(event.data);\n if (\n eventBytes > MAX_SIGNAL_SSE_BUFFER_BYTES ||\n state.pendingEventBytes + maxSignalClientBufferBytes(state) + eventBytes >\n MAX_SIGNAL_SSE_BUFFER_BYTES ||\n (!isSignalEventBuffered(state, event) &&\n signalBufferedEventCount(state) >= state.maxPendingInboundEvents)\n ) {\n return false;\n }\n state.pendingEvents.push(event);\n state.pendingEventBytes += eventBytes;\n return true;\n}\n\nfunction replayExclusiveSignalEvents(state: SignalServerState, client: ServerResponse): void {\n const events = new Map<number, SignalSseChunk>();\n for (const [owner, buffer] of state.clientBuffers) {\n if (owner === client) {\n continue;\n }\n for (const event of [...buffer.inFlight, ...buffer.events]) {\n if (\n event.sequence !== undefined &&\n event.recipients?.size === 1 &&\n event.recipients.has(owner)\n ) {\n events.set(event.sequence, event);\n }\n }\n }\n for (const event of [...events.values()].sort(\n (left, right) => left.sequence! - right.sequence!,\n )) {\n if (writeSignalSse(state, client, event) === \"rejected\") {\n break;\n }\n }\n}\n\nfunction flushSignalClientEvents(state: SignalServerState, client: ServerResponse): void {\n while (!client.writableNeedDrain) {\n const buffer = state.clientBuffers.get(client);\n if (!buffer || buffer.events.length === 0) {\n break;\n }\n const event = buffer.events.shift()!;\n if (!client.write(event.data)) {\n buffer.inFlight.push(event);\n scheduleSignalDrain(state, client);\n break;\n }\n buffer.bytes -= Buffer.byteLength(event.data);\n }\n}\n\nfunction flushPendingSignalEvents(state: SignalServerState): void {\n while (state.pendingEvents.length > 0 && state.clients.size > 0) {\n const event = state.pendingEvents[0]!;\n for (const client of [...state.clients]) {\n if (!event.recipients?.has(client)) {\n writeSignalSse(state, client, event);\n }\n }\n if (\n state.clients.size === 0 ||\n [...state.clients].some((client) => !event.recipients?.has(client))\n ) {\n break;\n }\n state.pendingEvents.shift();\n state.pendingEventBytes -= Buffer.byteLength(event.data);\n }\n}\n\nfunction emitSignalEvent(state: SignalServerState, payload: unknown): boolean {\n const event: SignalSseChunk = {\n data: `event:receive\\ndata:${JSON.stringify(payload)}\\n\\n`,\n recipients: new Set(),\n sequence: state.nextEventSequence++,\n };\n if (state.clients.size === 0 || state.pendingEvents.length > 0) {\n return queueSignalEvent(state, event);\n }\n let delivered = false;\n for (const client of state.clients) {\n const result = writeSignalSse(state, client, event);\n delivered = result === \"accepted\" || result === \"queued\" || delivered;\n }\n return delivered || queueSignalEvent(state, event);\n}\n\nfunction normalizeSignalPhoneNumber(value: unknown): string | undefined {\n const number = readTrimmedString(value)?.replace(/[\\s().-]/gu, \"\");\n return number && SIGNAL_PHONE_NUMBER_RE.test(number) ? number : undefined;\n}\n\nfunction isSignalDirectRecipient(value: unknown): boolean {\n const recipient = readSignalRpcString(value);\n if (!recipient) {\n return false;\n }\n if (SIGNAL_UUID_RE.test(recipient)) {\n return true;\n }\n // signal-cli treats recognized prefixes as terminal instead of retrying them as phone numbers.\n if (recipient.startsWith(\"PNI:\")) {\n return SIGNAL_UUID_RE.test(recipient.slice(4));\n }\n if (recipient.startsWith(\"u:\")) {\n return recipient.length > 2;\n }\n return SIGNAL_PHONE_NUMBER_RE.test(recipient);\n}\n\nfunction nextSignalTimestamp(state: SignalServerState): number {\n return Math.max(state.nextTimestamp, (state.lastCommittedTimestamp ?? -1) + 1);\n}\n\nfunction commitSignalTimestamp(state: SignalServerState, timestamp: number): void {\n state.lastCommittedTimestamp = timestamp;\n state.nextTimestamp = Math.max(state.nextTimestamp, timestamp + 1);\n}\n\nasync function handleAdminInbound(params: {\n body: Record<string, unknown>;\n state: SignalServerState;\n}): Promise<Response> {\n const text = typeof params.body.text === \"string\" ? params.body.text : undefined;\n const sourceNumberValue = params.body.sourceNumber ?? params.body.senderId;\n const sourceNumber = normalizeSignalPhoneNumber(sourceNumberValue);\n const sourceUuidValue = readTrimmedString(params.body.sourceUuid);\n const sourceUuid =\n sourceUuidValue && SIGNAL_UUID_RE.test(sourceUuidValue)\n ? sourceUuidValue.toLowerCase()\n : undefined;\n if (sourceNumberValue !== undefined && sourceNumber === undefined) {\n return jsonResponse(\n { error: \"sourceNumber must be an E.164 telephone number\", ok: false },\n 400,\n );\n }\n if (params.body.sourceUuid !== undefined && sourceUuid === undefined) {\n return jsonResponse({ error: \"sourceUuid must be a UUID\", ok: false }, 400);\n }\n if (!text || text.trim().length === 0 || (!sourceNumber && !sourceUuid)) {\n return jsonResponse(\n { error: \"text and at least one source identity are required\", ok: false },\n 400,\n );\n }\n const suppliedTimestamp =\n params.body.timestamp === undefined ? undefined : readInteger(params.body.timestamp);\n if (\n params.body.timestamp !== undefined &&\n (suppliedTimestamp === undefined ||\n suppliedTimestamp < 0 ||\n suppliedTimestamp >= Number.MAX_SAFE_INTEGER)\n ) {\n return jsonResponse(\n { error: \"timestamp must be a non-negative safe integer with room to advance\", ok: false },\n 400,\n );\n }\n if (\n suppliedTimestamp !== undefined &&\n params.state.lastCommittedTimestamp !== undefined &&\n suppliedTimestamp <= params.state.lastCommittedTimestamp\n ) {\n return jsonResponse(\n { error: \"timestamp must be greater than the last committed timestamp\", ok: false },\n 409,\n );\n }\n const timestamp = suppliedTimestamp ?? nextSignalTimestamp(params.state);\n if (timestamp >= Number.MAX_SAFE_INTEGER) {\n return jsonResponse({ error: \"timestamp capacity exhausted\", ok: false }, 503);\n }\n const groupId = readTrimmedString(params.body.groupId);\n const payload = {\n envelope: {\n sourceName: readTrimmedString(params.body.sourceName ?? params.body.senderName),\n ...(sourceNumber ? { sourceNumber } : {}),\n ...(sourceUuid ? { sourceUuid } : {}),\n timestamp,\n dataMessage: {\n message: text,\n timestamp,\n ...(groupId ? { groupInfo: { groupId } } : {}),\n },\n },\n };\n if (!emitSignalEvent(params.state, payload)) {\n return jsonResponse(\n {\n error: `Pending inbound queue is full (${params.state.maxPendingInboundEvents} events)`,\n ok: false,\n },\n 503,\n );\n }\n commitSignalTimestamp(params.state, timestamp);\n return jsonResponse({ event: payload, ok: true });\n}\n\nasync function handleRpc(params: {\n body: Record<string, unknown>;\n state: SignalServerState;\n}): Promise<SignalRpcResult> {\n const hasId = Object.hasOwn(params.body, \"id\");\n const id = params.body.id;\n const validId =\n !hasId ||\n id === null ||\n typeof id === \"string\" ||\n (typeof id === \"number\" &&\n Number.isFinite(id) &&\n (!Number.isInteger(id) || Number.isSafeInteger(id)));\n const method = params.body.method;\n if (typeof method !== \"string\" || !validId) {\n return {\n accepted: false,\n record: false,\n response: rpcError(-32600, \"Invalid Request\", validId ? id : null),\n };\n }\n if (params.body.jsonrpc !== \"2.0\") {\n return {\n accepted: false,\n record: false,\n response: rpcError(-32600, \"Invalid Request\", id),\n };\n }\n const notification = !hasId;\n if (\n params.body.params !== undefined &&\n !Array.isArray(params.body.params) &&\n !isJsonObject(params.body.params)\n ) {\n return {\n accepted: false,\n record: false,\n response: rpcError(-32600, \"Invalid Request\", id),\n };\n }\n if (method === \"version\") {\n return {\n accepted: false,\n record: true,\n response: notification\n ? new Response(null, { status: 204 })\n : rpcResponse(id, { version: \"crabline-signal-1\" }),\n };\n }\n if ([\"send\", \"sendReaction\", \"sendReceipt\", \"sendTyping\"].includes(method)) {\n if (!validSignalRpcParams(method, params.body.params)) {\n return {\n accepted: false,\n record: false,\n response: notification\n ? new Response(null, { status: 204 })\n : rpcError(-32602, \"Invalid params\", id, 200),\n };\n }\n const account = params.body.params.account;\n if (typeof account === \"string\" && account !== params.state.account) {\n return {\n accepted: false,\n record: false,\n response: notification\n ? new Response(null, { status: 204 })\n : rpcError(-32602, \"Specified account does not exist\", id, 200),\n };\n }\n const timestamp = nextSignalTimestamp(params.state);\n if (timestamp >= Number.MAX_SAFE_INTEGER) {\n return {\n accepted: false,\n record: false,\n response: notification\n ? new Response(null, { status: 204 })\n : rpcError(-32603, \"Timestamp capacity exhausted\", id, 200),\n };\n }\n return {\n accepted: true,\n record: true,\n response: notification\n ? new Response(null, { status: 204 })\n : rpcResponse(id, method === \"sendTyping\" ? {} : { timestamp }),\n timestamp,\n };\n }\n return {\n accepted: false,\n record: false,\n response: notification\n ? new Response(null, { status: 204 })\n : jsonResponse({\n error: { code: -32601, message: `Method not found: ${method}` },\n id: id ?? null,\n jsonrpc: \"2.0\",\n }),\n };\n}\n\nfunction hasRecipients(params: Record<string, unknown>): boolean {\n const values = [\n params.recipient,\n params.recipients,\n params.groupId,\n params.groupIds,\n params.username,\n params.usernames,\n ];\n return (\n params.noteToSelf === true ||\n values.some(\n (value) =>\n (typeof value === \"string\" && value.trim().length > 0) ||\n (Array.isArray(value) &&\n value.length > 0 &&\n value.every((entry) => typeof entry === \"string\" && entry.trim().length > 0)),\n )\n );\n}\n\nfunction hasTypingRecipients(params: Record<string, unknown>): boolean {\n if (\n params.noteToSelf !== undefined ||\n params.username !== undefined ||\n params.usernames !== undefined ||\n (params.stop !== undefined && typeof params.stop !== \"boolean\")\n ) {\n return false;\n }\n return [params.recipient, params.recipients, params.groupId, params.groupIds].some(\n (value) =>\n (typeof value === \"string\" && value.trim().length > 0) ||\n (Array.isArray(value) &&\n value.length > 0 &&\n value.every((entry) => typeof entry === \"string\" && entry.trim().length > 0)),\n );\n}\n\nfunction validTimestamp(value: unknown): boolean {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction hasStringArray(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n value.every((entry) => typeof entry === \"string\" && entry.trim().length > 0)\n );\n}\n\nfunction readSignalRpcString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction hasValidSignalRecipientFieldTypes(params: Record<string, unknown>): boolean {\n return [\"recipient\", \"recipients\", \"groupId\", \"groupIds\", \"username\", \"usernames\"].every(\n (field) => {\n const value = params[field];\n return (\n value === undefined ||\n (typeof value === \"string\" && value.trim().length > 0) ||\n hasStringArray(value)\n );\n },\n );\n}\n\nfunction hasValidOptionalSignalString(params: Record<string, unknown>, field: string): boolean {\n return params[field] === undefined || typeof params[field] === \"string\";\n}\n\nfunction hasValidSignalDirectRecipients(params: Record<string, unknown>): boolean {\n return [\"recipient\", \"recipients\"].every((field) => {\n const value = params[field];\n return (\n value === undefined ||\n (Array.isArray(value)\n ? value.length > 0 && value.every(isSignalDirectRecipient)\n : isSignalDirectRecipient(value))\n );\n });\n}\n\nfunction validSignalRpcParams(method: string, value: unknown): value is Record<string, unknown> {\n if (\n !isJsonObject(value) ||\n !hasValidSignalRecipientFieldTypes(value) ||\n !hasValidSignalDirectRecipients(value) ||\n !hasValidOptionalSignalString(value, \"account\") ||\n (value.noteToSelf !== undefined && typeof value.noteToSelf !== \"boolean\")\n ) {\n return false;\n }\n if (method === \"send\") {\n return (\n hasValidOptionalSignalString(value, \"message\") &&\n hasValidOptionalSignalString(value, \"attachment\") &&\n (value.attachments === undefined || hasStringArray(value.attachments)) &&\n hasRecipients(value) &&\n (readSignalRpcString(value.message) !== undefined ||\n readSignalRpcString(value.attachment) !== undefined ||\n hasStringArray(value.attachments))\n );\n }\n if (method === \"sendReaction\") {\n return (\n hasValidOptionalSignalString(value, \"emoji\") &&\n hasValidOptionalSignalString(value, \"targetAuthor\") &&\n hasRecipients(value) &&\n readSignalRpcString(value.emoji) !== undefined &&\n isSignalDirectRecipient(value.targetAuthor) &&\n validTimestamp(value.targetTimestamp)\n );\n }\n if (method === \"sendReceipt\") {\n const targetTimestamps = value.targetTimestamps ?? value.targetTimestamp;\n const timestamps = Array.isArray(targetTimestamps) ? targetTimestamps : [targetTimestamps];\n return (\n hasValidOptionalSignalString(value, \"type\") &&\n (readSignalRpcString(value.recipient) !== undefined ||\n readSignalRpcString(value.username) !== undefined ||\n hasStringArray(value.usernames)) &&\n timestamps.length > 0 &&\n timestamps.every(validTimestamp) &&\n (value.type === undefined || value.type === \"read\" || value.type === \"viewed\")\n );\n }\n return method === \"sendTyping\" && hasTypingRecipients(value);\n}\n\nfunction serializeSignalTimestampCommit<T>(\n state: SignalServerState,\n operation: () => Promise<T>,\n): Promise<T> {\n const run = state.pendingTimestampCommits.catch(() => {}).then(operation);\n state.pendingTimestampCommits = run.then(\n () => undefined,\n () => undefined,\n );\n return run;\n}\n\nfunction processSignalAdminInbound(params: {\n body: Record<string, unknown>;\n state: SignalServerState;\n}): Promise<Response> {\n return serializeSignalTimestampCommit(params.state, () => handleAdminInbound(params));\n}\n\nasync function processSignalRpc(params: {\n body: Record<string, unknown>;\n state: SignalServerState;\n url: URL;\n}): Promise<Response> {\n return serializeSignalTimestampCommit(params.state, async () => {\n const rpc = await handleRpc({ body: params.body, state: params.state });\n if (rpc.record) {\n const event: SignalRecorderEvent = {\n accepted: rpc.accepted,\n at: new Date().toISOString(),\n body: params.body,\n method: \"POST\",\n path: params.url.pathname,\n query: queryRecord(params.url),\n type: \"api\",\n };\n if (rpc.accepted) {\n try {\n await appendEvent(params.state, event);\n } catch (error) {\n if (!(error instanceof ServerRecorderCommittedError)) {\n throw error;\n }\n }\n commitSignalTimestamp(params.state, rpc.timestamp);\n } else {\n await appendEvent(params.state, event, rpc.response.status === 204);\n }\n }\n return rpc.response;\n });\n}\n\nfunction hasSignalJsonContentType(request: IncomingMessage): boolean {\n const contentType = request.headers[\"content-type\"];\n const values = Array.isArray(contentType) ? contentType : [contentType];\n return values.some(\n (value) => value?.split(\";\", 1)[0]?.trim().toLowerCase() === \"application/json\",\n );\n}\n\nasync function handleRequest(params: {\n request: IncomingMessage;\n response: ServerResponse;\n state: SignalServerState;\n}): Promise<void> {\n const url = new URL(params.request.url ?? \"/\", \"http://localhost\");\n if (url.pathname === \"/api/v1/events\" && params.request.method === \"GET\") {\n if (params.state.clients.size + params.state.pendingSseClients >= params.state.maxSseClients) {\n await writeResponse(\n params.response,\n jsonResponse({ error: \"Too many event stream clients\", ok: false }, 503),\n );\n return;\n }\n params.state.pendingSseClients += 1;\n try {\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n method: \"GET\",\n path: url.pathname,\n query: queryRecord(url),\n type: \"api\",\n });\n } finally {\n params.state.pendingSseClients -= 1;\n }\n if (params.request.destroyed || params.response.destroyed) {\n return;\n }\n params.response.writeHead(200, {\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"content-type\": \"text/event-stream\",\n });\n params.response.once(\"close\", () => {\n removeSignalClient(params.state, params.response, false);\n });\n params.state.clients.add(params.response);\n params.state.clientBuffers.set(params.response, {\n bytes: 0,\n draining: false,\n events: [],\n inFlight: [],\n });\n params.response.flushHeaders();\n replayExclusiveSignalEvents(params.state, params.response);\n if (params.state.clients.has(params.response)) {\n flushPendingSignalEvents(params.state);\n }\n return;\n }\n\n let fetchResponse: Response;\n if (url.pathname === \"/crabline/signal/inbound\" && params.request.method === \"POST\") {\n if (!hasAdminToken(params.request, params.state.adminToken)) {\n drainRequestBody(params.request);\n fetchResponse = adminAuthError();\n } else {\n const body = await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n fetchResponse = jsonResponse(\n { error: \"Request body must be a JSON object\", ok: false },\n 400,\n );\n await writeResponse(params.response, fetchResponse);\n return;\n }\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n body,\n method: \"POST\",\n path: url.pathname,\n query: queryRecord(url),\n type: \"admin\",\n });\n fetchResponse = await processSignalAdminInbound({ body, state: params.state });\n }\n } else if (url.pathname === \"/api/v1/check\" && params.request.method === \"GET\") {\n await appendEvent(params.state, {\n accepted: true,\n at: new Date().toISOString(),\n method: \"GET\",\n path: url.pathname,\n query: queryRecord(url),\n type: \"api\",\n });\n fetchResponse = new Response(null, { status: 200 });\n } else if (url.pathname === \"/api/v1/rpc\" && params.request.method === \"POST\") {\n if (!hasSignalJsonContentType(params.request)) {\n drainRequestBody(params.request);\n fetchResponse = new Response(null, { status: 415 });\n } else {\n const body = await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n await writeResponse(params.response, rpcError(-32600, \"Invalid Request\"));\n return;\n }\n fetchResponse = await processSignalRpc({ body, state: params.state, url });\n }\n } else {\n fetchResponse = new Response(\"not found\", { status: 404 });\n }\n await writeResponse(params.response, fetchResponse);\n}\n\nfunction normalizeSignalHost(value: string): string {\n const normalized = value\n .trim()\n .replace(/^\\[(.*)\\]$/u, \"$1\")\n .toLowerCase()\n .replace(/\\.$/u, \"\");\n if (isIP(normalized) !== 6) {\n return normalized;\n }\n const canonical = new URL(`http://[${normalized}]`).hostname.slice(1, -1);\n const mapped = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/u.exec(canonical);\n if (!mapped?.[1] || !mapped[2]) {\n return canonical;\n }\n const high = Number.parseInt(mapped[1], 16);\n const low = Number.parseInt(mapped[2], 16);\n return `${high >>> 8}.${high & 0xff}.${low >>> 8}.${low & 0xff}`;\n}\n\nfunction parseSignalHostHeader(value: string): string | undefined {\n const match = value.startsWith(\"[\")\n ? /^\\[([^\\]]+)\\](?::(\\d{1,5}))?$/u.exec(value)\n : /^([^:]+)(?::(\\d{1,5}))?$/u.exec(value);\n if (!match?.[1]) {\n return undefined;\n }\n const port = match[2] === undefined ? undefined : Number(match[2]);\n if (port !== undefined && port > 65_535) {\n return undefined;\n }\n const hostname = normalizeSignalHost(match[1]);\n if (isIP(hostname) !== 0) {\n return hostname;\n }\n const labels = hostname.split(\".\");\n return hostname.length <= 253 &&\n labels.every((label) => /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/u.test(label))\n ? hostname\n : undefined;\n}\n\nfunction signalRequestHostAllowed(\n request: IncomingMessage,\n bindHost: string,\n allowedHosts: ReadonlySet<string>,\n): boolean {\n const hostHeader = request.headers.host;\n if (!hostHeader) {\n return false;\n }\n const requestedHost = parseSignalHostHeader(hostHeader);\n if (requestedHost === undefined) {\n return false;\n }\n const normalizedBindHost = normalizeSignalHost(bindHost);\n if (allowedHosts.has(requestedHost)) {\n return true;\n }\n if (normalizedBindHost !== \"0.0.0.0\" && normalizedBindHost !== \"::\") {\n return false;\n }\n const localAddress = normalizeSignalHost(request.socket.localAddress ?? \"\");\n return isIP(requestedHost) !== 0 && requestedHost === localAddress;\n}\n\nexport async function startSignalServer(\n params: StartSignalServerParams = {},\n): Promise<StartedSignalServer> {\n const account = normalizeSignalPhoneNumber(params.account ?? \"+15550000000\");\n if (!account) {\n throw new Error(\"account must be an E.164 telephone number.\");\n }\n const recorderPath = params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"signal.jsonl\");\n const state: SignalServerState = {\n account,\n adminToken: params.adminToken ?? randomBytes(24).toString(\"base64url\"),\n clients: new Set(),\n clientBuffers: new Map(),\n lastCommittedTimestamp: undefined,\n maxPendingInboundEvents: resolveMaxPendingInboundEvents(params.maxPendingInboundEvents),\n maxSseClients:\n Number.isSafeInteger(params.maxSseClients) && (params.maxSseClients ?? 0) > 0\n ? params.maxSseClients!\n : DEFAULT_MAX_SIGNAL_SSE_CLIENTS,\n nextEventSequence: 1,\n nextTimestamp: Date.now(),\n recorder: createServerRecorder({ recorderPath, onEvent: params.onEvent }),\n pendingEventBytes: 0,\n pendingEvents: [],\n pendingTimestampCommits: Promise.resolve(),\n pendingSseClients: 0,\n recorderPath,\n };\n const host = params.host ?? \"127.0.0.1\";\n const normalizedHost = normalizeSignalHost(host);\n const allowedHosts = new Set([\n ...(normalizedHost === \"0.0.0.0\" || normalizedHost === \"::\" ? [] : [normalizedHost]),\n ...(params.allowedHosts ?? []).map((allowedHost) => normalizeSignalHost(allowedHost)),\n ]);\n const server = createServer((request, response) => {\n if (!signalRequestHostAllowed(request, host, allowedHosts)) {\n drainRequestBody(request);\n void writeResponse(\n response,\n jsonResponse({ error: \"Host header is not allowed\", ok: false }, 400),\n ).catch(() => response.destroy());\n return;\n }\n void handleRequest({ request, response, state }).catch(async (error) => {\n if (!response.headersSent) {\n let errorResponse: Response;\n const isAdminRequest =\n new URL(request.url ?? \"/\", \"http://localhost\").pathname === \"/crabline/signal/inbound\";\n if (error instanceof InvalidJsonBodyError) {\n errorResponse = isAdminRequest\n ? jsonResponse({ error: \"Request body is not valid JSON\", ok: false }, 400)\n : rpcError(-32700, \"Parse error\");\n } else if (error instanceof RequestBodyTooLargeError) {\n errorResponse = isAdminRequest\n ? jsonResponse({ error: \"Request body is too large\", ok: false }, 413)\n : rpcError(-32600, \"Request body is too large\", null, 413);\n } else {\n errorResponse = jsonResponse({ error: \"internal server error\", ok: false }, 500);\n }\n try {\n await writeResponse(response, errorResponse);\n } catch (writeError) {\n response.destroy(\n writeError instanceof Error ? writeError : new Error(String(writeError)),\n );\n }\n } else {\n response.destroy(error instanceof Error ? error : new Error(String(error)));\n }\n });\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(params.port ?? 0, host, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address();\n if (!address || typeof address === \"string\") {\n await closeServer(server);\n throw new Error(\"Unable to resolve Signal local server address.\");\n }\n const keepalive = setInterval(() => {\n for (const client of state.clients) {\n writeSignalSse(state, client, { data: \":\\n\" });\n }\n }, SIGNAL_CLI_SSE_KEEPALIVE_MS);\n keepalive.unref();\n const advertisedHost =\n normalizedHost === \"0.0.0.0\" ? \"127.0.0.1\" : normalizedHost === \"::\" ? \"::1\" : host;\n const baseUrl = `http://${formatUrlHost(advertisedHost)}:${address.port}`;\n return {\n close: createServerClose(state.recorder, async () => {\n clearInterval(keepalive);\n for (const client of state.clients) {\n client.end();\n }\n await closeServer(server);\n }),\n manifest: {\n account: state.account,\n adminToken: state.adminToken,\n baseUrl,\n endpoints: {\n adminInboundUrl: `${baseUrl}/crabline/signal/inbound`,\n apiRoot: baseUrl,\n eventsUrl: `${baseUrl}/api/v1/events`,\n rpcUrl: `${baseUrl}/api/v1/rpc`,\n },\n env: {},\n provider: \"signal\",\n recorderPath: state.recorderPath,\n version: 1,\n },\n };\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createHmac, randomBytes, randomInt, timingSafeEqual } from "node:crypto";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { adminAuthError, hasAdminToken, InvalidJsonBodyError, isJsonObject, isLoopbackHost, jsonResponse, parseUnknownRequestBody, queryRecord, readBody, readInteger, readTrimmedString, RequestBodyTooLargeError, startHttpJsonServer, } from "./http.js";
|
|
3
|
+
import { adminAuthError, createServerClose, hasAdminToken, InvalidJsonBodyError, isJsonObject, isLoopbackHost, jsonResponse, parseUnknownRequestBody, queryRecord, readBody, readInteger, readTrimmedString, RequestBodyTooLargeError, startHttpJsonServer, } from "./http.js";
|
|
4
4
|
import { SLACK_CHANNEL_ID_RULE, SLACK_SEND_TARGET_ID_RULE, SLACK_TS_RULE, SLACK_USER_ID_RULE, } from "../providers/slack-ids.js";
|
|
5
|
-
import {
|
|
5
|
+
import { createServerRecorder } from "./recorder.js";
|
|
6
6
|
import { postWebhookRequestWithResponse, validateWebhookTarget, } from "./webhook-target.js";
|
|
7
7
|
const SLACK_SIGNATURE_TOLERANCE_SECONDS = 5 * 60;
|
|
8
8
|
const SLACK_EVENT_MAX_RETRIES = 3;
|
|
@@ -364,8 +364,7 @@ function slackConversationType(conversation) {
|
|
|
364
364
|
return conversation.is_group === true ? "private_channel" : "public_channel";
|
|
365
365
|
}
|
|
366
366
|
async function appendEvent(state, event, committed = false) {
|
|
367
|
-
|
|
368
|
-
await (committed ? recordCommittedServerEvent(params) : recordServerEvent(params));
|
|
367
|
+
await (committed ? state.recorder.recordCommitted(event) : state.recorder.record(event));
|
|
369
368
|
}
|
|
370
369
|
function redactSlackAuthFields(value) {
|
|
371
370
|
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
|
|
@@ -1049,6 +1048,7 @@ async function handleRequest(params) {
|
|
|
1049
1048
|
export async function startSlackServer(params = {}) {
|
|
1050
1049
|
const host = params.host ?? "127.0.0.1";
|
|
1051
1050
|
const externallyBound = !isLoopbackHost(host);
|
|
1051
|
+
const recorderPath = params.recorderPath ?? path.resolve(".crabline", "servers", "slack.jsonl");
|
|
1052
1052
|
const state = {
|
|
1053
1053
|
activeEventDeliveries: new Set(),
|
|
1054
1054
|
adminToken: params.adminToken ?? randomBytes(24).toString("base64url"),
|
|
@@ -1063,8 +1063,8 @@ export async function startSlackServer(params = {}) {
|
|
|
1063
1063
|
nextDmIndex: 1,
|
|
1064
1064
|
nextMpimIndex: 1,
|
|
1065
1065
|
nextTsIndex: 100,
|
|
1066
|
-
onEvent: params.onEvent,
|
|
1067
|
-
recorderPath
|
|
1066
|
+
recorder: createServerRecorder({ recorderPath, onEvent: params.onEvent }),
|
|
1067
|
+
recorderPath,
|
|
1068
1068
|
restrictEventTargets: true,
|
|
1069
1069
|
signingSecret: params.signingSecret ?? "crabline-slack-signing-secret",
|
|
1070
1070
|
userDmChannels: new Map(),
|
|
@@ -1097,12 +1097,12 @@ export async function startSlackServer(params = {}) {
|
|
|
1097
1097
|
const baseUrl = httpServer.baseUrl;
|
|
1098
1098
|
const apiRoot = `${baseUrl}/api/`;
|
|
1099
1099
|
return {
|
|
1100
|
-
async
|
|
1100
|
+
close: createServerClose(state.recorder, async () => {
|
|
1101
1101
|
state.closing = true;
|
|
1102
1102
|
state.deliveryAbortController.abort();
|
|
1103
1103
|
await Promise.allSettled(state.activeEventDeliveries);
|
|
1104
1104
|
await httpServer.close();
|
|
1105
|
-
},
|
|
1105
|
+
}),
|
|
1106
1106
|
manifest: {
|
|
1107
1107
|
adminToken: state.adminToken,
|
|
1108
1108
|
baseUrl,
|