@openclaw/crabline 0.1.11 → 0.1.13
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 +137 -23
- package/dist/src/bin/crabline.js +3 -1
- package/dist/src/bin/crabline.js.map +1 -1
- package/dist/src/cli/program.d.ts +5 -1
- package/dist/src/cli/program.js +281 -52
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/load.js +39 -3
- package/dist/src/config/load.js.map +1 -1
- package/dist/src/config/schema.d.ts +20 -0
- package/dist/src/config/schema.js +163 -35
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/core/errors.d.ts +1 -0
- package/dist/src/core/errors.js +6 -3
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/http-path.d.ts +1 -0
- package/dist/src/core/http-path.js +14 -0
- package/dist/src/core/http-path.js.map +1 -0
- package/dist/src/core/matcher.d.ts +3 -1
- package/dist/src/core/matcher.js +58 -2
- package/dist/src/core/matcher.js.map +1 -1
- package/dist/src/core/nonces.d.ts +2 -0
- package/dist/src/core/nonces.js +11 -1
- package/dist/src/core/nonces.js.map +1 -1
- package/dist/src/core/reporters.d.ts +5 -0
- package/dist/src/core/reporters.js +26 -2
- package/dist/src/core/reporters.js.map +1 -1
- package/dist/src/core/run.d.ts +3 -1
- package/dist/src/core/run.js +178 -66
- package/dist/src/core/run.js.map +1 -1
- package/dist/src/index.d.ts +12 -10
- package/dist/src/index.js +6 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/matrix-ids.d.ts +5 -0
- package/dist/src/matrix-ids.js +83 -0
- package/dist/src/matrix-ids.js.map +1 -0
- package/dist/src/openclaw/artifact-generation.d.ts +7 -6
- package/dist/src/openclaw/artifact-generation.js +385 -41
- package/dist/src/openclaw/artifact-generation.js.map +1 -1
- package/dist/src/openclaw/bridges/discord.d.ts +1 -0
- package/dist/src/openclaw/bridges/discord.js +149 -0
- package/dist/src/openclaw/bridges/discord.js.map +1 -0
- package/dist/src/openclaw/bridges/matrix.js +22 -5
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +14 -9
- package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
- package/dist/src/openclaw/bridges/probe-response.d.ts +1 -0
- package/dist/src/openclaw/bridges/probe-response.js +5 -0
- package/dist/src/openclaw/bridges/probe-response.js.map +1 -0
- package/dist/src/openclaw/bridges/signal.js +16 -7
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +117 -24
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +46 -20
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +33 -17
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +9 -4
- package/dist/src/openclaw/bridges/zalo.js.map +1 -1
- package/dist/src/openclaw/outbound-contract.js +3 -0
- package/dist/src/openclaw/outbound-contract.js.map +1 -1
- package/dist/src/openclaw/private-file.d.ts +38 -3
- package/dist/src/openclaw/private-file.js +2008 -87
- package/dist/src/openclaw/private-file.js.map +1 -1
- package/dist/src/openclaw/{smoke-lock.d.ts → provider-readiness-lock.d.ts} +14 -5
- package/dist/src/openclaw/provider-readiness-lock.js +1320 -0
- package/dist/src/openclaw/provider-readiness-lock.js.map +1 -0
- package/dist/src/openclaw/shared.d.ts +10 -17
- package/dist/src/openclaw/shared.js +53 -19
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw.d.ts +3 -5
- package/dist/src/openclaw.js +245 -60
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/platform/process-owned-lock.d.ts +11 -0
- package/dist/src/platform/process-owned-lock.js +1698 -0
- package/dist/src/platform/process-owned-lock.js.map +1 -0
- package/dist/src/platform/recorder-directory.d.ts +1 -0
- package/dist/src/platform/recorder-directory.js +14 -0
- package/dist/src/platform/recorder-directory.js.map +1 -0
- package/dist/src/platform/windows-acl.d.ts +18 -0
- package/dist/src/platform/windows-acl.js +1367 -0
- package/dist/src/platform/windows-acl.js.map +1 -0
- package/dist/src/platform/windows-lock-root.d.ts +13 -0
- package/dist/src/platform/windows-lock-root.js +98 -0
- package/dist/src/platform/windows-lock-root.js.map +1 -0
- package/dist/src/providers/builtin/discord.d.ts +4 -0
- package/dist/src/providers/builtin/discord.js +52 -9
- package/dist/src/providers/builtin/discord.js.map +1 -1
- package/dist/src/providers/builtin/external-webhook-auth.d.ts +1 -0
- package/dist/src/providers/builtin/external-webhook-auth.js +38 -1
- package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -1
- package/dist/src/providers/builtin/feishu.d.ts +1 -0
- package/dist/src/providers/builtin/feishu.js +96 -26
- package/dist/src/providers/builtin/feishu.js.map +1 -1
- package/dist/src/providers/builtin/googlechat.d.ts +1 -0
- package/dist/src/providers/builtin/googlechat.js +95 -26
- package/dist/src/providers/builtin/googlechat.js.map +1 -1
- package/dist/src/providers/builtin/imessage.js +60 -17
- package/dist/src/providers/builtin/imessage.js.map +1 -1
- package/dist/src/providers/builtin/loopback.js +88 -35
- package/dist/src/providers/builtin/loopback.js.map +1 -1
- package/dist/src/providers/builtin/matrix.d.ts +2 -2
- package/dist/src/providers/builtin/matrix.js +78 -21
- package/dist/src/providers/builtin/matrix.js.map +1 -1
- package/dist/src/providers/builtin/mattermost.d.ts +11 -7
- package/dist/src/providers/builtin/mattermost.js +138 -24
- package/dist/src/providers/builtin/mattermost.js.map +1 -1
- package/dist/src/providers/builtin/msteams.d.ts +1 -0
- package/dist/src/providers/builtin/msteams.js +118 -38
- package/dist/src/providers/builtin/msteams.js.map +1 -1
- package/dist/src/providers/builtin/native-local-mock.js +4 -4
- package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
- package/dist/src/providers/builtin/script.js +1057 -146
- package/dist/src/providers/builtin/script.js.map +1 -1
- package/dist/src/providers/builtin/slack.d.ts +8 -1
- package/dist/src/providers/builtin/slack.js +327 -24
- package/dist/src/providers/builtin/slack.js.map +1 -1
- package/dist/src/providers/builtin/telegram.d.ts +1 -1
- package/dist/src/providers/builtin/telegram.js +55 -14
- package/dist/src/providers/builtin/telegram.js.map +1 -1
- package/dist/src/providers/builtin/whatsapp.d.ts +4 -3
- package/dist/src/providers/builtin/whatsapp.js +157 -29
- package/dist/src/providers/builtin/whatsapp.js.map +1 -1
- package/dist/src/providers/builtin/zalo.d.ts +5 -2
- package/dist/src/providers/builtin/zalo.js +31 -7
- package/dist/src/providers/builtin/zalo.js.map +1 -1
- package/dist/src/providers/catalog.d.ts +1 -1
- package/dist/src/providers/catalog.js +1 -1
- package/dist/src/providers/catalog.js.map +1 -1
- package/dist/src/providers/local-mock.d.ts +4 -0
- package/dist/src/providers/local-mock.js +162 -35
- package/dist/src/providers/local-mock.js.map +1 -1
- package/dist/src/providers/native-ids.d.ts +2 -0
- package/dist/src/providers/native-ids.js +3 -0
- package/dist/src/providers/native-ids.js.map +1 -1
- package/dist/src/providers/recorder.d.ts +14 -3
- package/dist/src/providers/recorder.js +521 -41
- package/dist/src/providers/recorder.js.map +1 -1
- package/dist/src/providers/registry.d.ts +1 -0
- package/dist/src/providers/registry.js +65 -20
- package/dist/src/providers/registry.js.map +1 -1
- package/dist/src/providers/signed-jwt.d.ts +6 -1
- package/dist/src/providers/signed-jwt.js +241 -50
- package/dist/src/providers/signed-jwt.js.map +1 -1
- package/dist/src/providers/slack-ids.d.ts +1 -0
- package/dist/src/providers/slack-ids.js +5 -0
- package/dist/src/providers/slack-ids.js.map +1 -1
- package/dist/src/providers/target-normalizers.d.ts +9 -1
- package/dist/src/providers/target-normalizers.js +177 -58
- package/dist/src/providers/target-normalizers.js.map +1 -1
- package/dist/src/providers/webhook-server.d.ts +3 -0
- package/dist/src/providers/webhook-server.js +268 -47
- package/dist/src/providers/webhook-server.js.map +1 -1
- package/dist/src/servers/discord.d.ts +40 -0
- package/dist/src/servers/discord.js +842 -0
- package/dist/src/servers/discord.js.map +1 -0
- package/dist/src/servers/http.d.ts +14 -2
- package/dist/src/servers/http.js +229 -58
- package/dist/src/servers/http.js.map +1 -1
- package/dist/src/servers/index.d.ts +10 -4
- package/dist/src/servers/index.js +4 -0
- package/dist/src/servers/index.js.map +1 -1
- package/dist/src/servers/matrix.d.ts +3 -0
- package/dist/src/servers/matrix.js +268 -110
- package/dist/src/servers/matrix.js.map +1 -1
- package/dist/src/servers/mattermost.d.ts +5 -0
- package/dist/src/servers/mattermost.js +389 -91
- package/dist/src/servers/mattermost.js.map +1 -1
- package/dist/src/servers/recorder.d.ts +11 -0
- package/dist/src/servers/recorder.js +1072 -69
- package/dist/src/servers/recorder.js.map +1 -1
- package/dist/src/servers/signal.d.ts +1 -0
- package/dist/src/servers/signal.js +279 -44
- package/dist/src/servers/signal.js.map +1 -1
- package/dist/src/servers/slack.d.ts +15 -0
- package/dist/src/servers/slack.js +270 -54
- package/dist/src/servers/slack.js.map +1 -1
- package/dist/src/servers/telegram-identity.d.ts +6 -0
- package/dist/src/servers/telegram-identity.js +27 -0
- package/dist/src/servers/telegram-identity.js.map +1 -0
- package/dist/src/servers/telegram.d.ts +17 -6
- package/dist/src/servers/telegram.js +1218 -107
- package/dist/src/servers/telegram.js.map +1 -1
- package/dist/src/servers/webhook-target.d.ts +12 -4
- package/dist/src/servers/webhook-target.js +226 -28
- package/dist/src/servers/webhook-target.js.map +1 -1
- package/dist/src/servers/whatsapp-baileys-websocket.d.ts +60 -1
- package/dist/src/servers/whatsapp-baileys-websocket.js +782 -112
- package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
- package/dist/src/servers/whatsapp-jid.d.ts +1 -0
- package/dist/src/servers/whatsapp-jid.js +9 -5
- package/dist/src/servers/whatsapp-jid.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/binary-node.d.ts +1 -0
- package/dist/src/servers/whatsapp-wire/binary-node.js +37 -13
- package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/crypto.d.ts +3 -0
- package/dist/src/servers/whatsapp-wire/crypto.js +23 -8
- package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/handshake.d.ts +9 -3
- package/dist/src/servers/whatsapp-wire/handshake.js +173 -12
- package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/signal.js +3 -3
- package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
- package/dist/src/servers/whatsapp.d.ts +7 -1
- package/dist/src/servers/whatsapp.js +149 -25
- package/dist/src/servers/whatsapp.js.map +1 -1
- package/dist/src/servers/zalo.d.ts +1 -0
- package/dist/src/servers/zalo.js +193 -82
- package/dist/src/servers/zalo.js.map +1 -1
- package/docs/channel-setup.md +251 -64
- package/fixtures/examples/crabline.example.yaml +3 -2
- package/package.json +18 -10
- package/dist/src/openclaw/smoke-lock.js +0 -1004
- package/dist/src/openclaw/smoke-lock.js.map +0 -1
- package/fixtures/examples/openclaw-bridge.yaml +0 -125
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/servers/slack.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport { createHmac, randomBytes, randomInt, timingSafeEqual } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n adminAuthError,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n isLoopbackHost,\n jsonResponse,\n parseUnknownRequestBody,\n queryRecord,\n readBody,\n readInteger,\n readTrimmedString,\n RequestBodyTooLargeError,\n startHttpJsonServer,\n type ServerRequestEvent,\n} from \"./http.js\";\nimport {\n SLACK_CHANNEL_ID_RULE,\n SLACK_SEND_TARGET_ID_RULE,\n SLACK_TS_RULE,\n SLACK_USER_ID_RULE,\n} from \"../providers/slack-ids.js\";\nimport {\n recordCommittedServerEvent,\n recordServerEvent,\n type ServerEventObserver,\n} from \"./recorder.js\";\n\nconst SLACK_SIGNATURE_TOLERANCE_SECONDS = 5 * 60;\nconst SLACK_EVENT_MAX_RETRIES = 3;\nconst SLACK_EVENT_MAX_REDIRECTS = 2;\nconst SLACK_EVENT_RETRY_DELAYS_MS = [0, 60_000, 5 * 60_000] as const;\n\ntype SlackMessage = {\n attachments?: unknown;\n blocks?: unknown;\n bot_id?: string;\n channel: string;\n metadata?: unknown;\n reply_broadcast?: boolean;\n text: string;\n thread_ts?: string;\n ts: string;\n type: \"message\";\n unfurl_links?: boolean;\n unfurl_media?: boolean;\n user: string;\n};\n\ntype SlackServerState = {\n activeEventDeliveries: Set<Promise<void>>;\n adminToken: string;\n botId: string;\n botToken: string;\n botUserId: string;\n chatPostMessageRateLimit:\n | {\n remaining: number;\n retryAfterSeconds: number;\n }\n | undefined;\n closing: boolean;\n deliveryAbortController: AbortController;\n eventsRequestUrl: string | undefined;\n nextDmIndex: number;\n nextMpimIndex: number;\n nextTsIndex: number;\n onEvent: ServerEventObserver | undefined;\n recorderPath: string;\n signingSecret: string;\n userDmChannels: Map<string, string>;\n userMpimChannels: Map<string, { id: string; users: string[] }>;\n messagesByChannel: Map<string, SlackMessage[]>;\n};\ntype SlackRecorderEvent = ServerRequestEvent & {\n accepted?: boolean | undefined;\n};\n\ntype SlackRetryReason =\n | \"connection_failed\"\n | \"http_error\"\n | \"http_timeout\"\n | \"ssl_error\"\n | \"too_many_redirects\"\n | \"unknown_error\";\n\ntype SlackCursorKind = \"history\" | \"replies\";\n\nexport type SlackServerManifest = {\n adminToken: string;\n baseUrl: string;\n botToken: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n eventsUrl: string;\n };\n env: {\n SLACK_API_URL: string;\n SLACK_BOT_TOKEN: string;\n SLACK_SIGNING_SECRET: string;\n };\n provider: \"slack\";\n recorderPath: string;\n signingSecret: string;\n version: 1;\n};\n\nexport type StartedSlackServer = {\n close(): Promise<void>;\n manifest: SlackServerManifest;\n};\n\nexport type StartSlackServerParams = {\n adminToken?: string | undefined;\n botId?: string | undefined;\n botToken?: string | undefined;\n botUserId?: string | undefined;\n chatPostMessageRateLimit?:\n | {\n remaining: number;\n retryAfterSeconds: number;\n }\n | undefined;\n eventsRequestUrl?: string | undefined;\n host?: string | undefined;\n onEvent?: ServerEventObserver | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n signingSecret?: string | undefined;\n};\n\nfunction slackOk(result: Record<string, unknown> = {}): Response {\n return jsonResponse({ ok: true, ...result });\n}\n\nfunction slackError(error: string, status = 200): Response {\n return jsonResponse({ error, ok: false }, status);\n}\n\nfunction slackRateLimited(retryAfterSeconds = 1): Response {\n return new Response(JSON.stringify({ error: \"ratelimited\", ok: false }), {\n headers: {\n \"content-type\": \"application/json\",\n \"retry-after\": String(retryAfterSeconds),\n },\n status: 429,\n });\n}\n\nfunction resolveChatPostMessageRateLimit(\n value: StartSlackServerParams[\"chatPostMessageRateLimit\"],\n): SlackServerState[\"chatPostMessageRateLimit\"] {\n if (value === undefined) {\n return undefined;\n }\n if (!Number.isSafeInteger(value.remaining) || value.remaining < 0) {\n throw new Error(\"chatPostMessageRateLimit.remaining must be a non-negative safe integer.\");\n }\n if (!Number.isSafeInteger(value.retryAfterSeconds) || value.retryAfterSeconds < 1) {\n throw new Error(\"chatPostMessageRateLimit.retryAfterSeconds must be a positive safe integer.\");\n }\n return { ...value };\n}\n\nfunction requireSlackToken(\n request: IncomingMessage,\n body: Record<string, unknown>,\n state: SlackServerState,\n): Response | undefined {\n const authorization = request.headers.authorization;\n const tokenFromHeader =\n typeof authorization === \"string\"\n ? /^Bearer\\s+(.+)$/iu.exec(authorization.trim())?.[1]?.trim()\n : undefined;\n const token = tokenFromHeader ?? readTrimmedString(body.token);\n if (!token) {\n return slackError(\"not_authed\");\n }\n if (token !== state.botToken) {\n return slackError(\"invalid_auth\");\n }\n return undefined;\n}\n\nfunction requireSlackChannelId(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n if (!stringValue || !SLACK_CHANNEL_ID_RULE.pattern.test(stringValue)) {\n return slackError(\"channel_not_found\");\n }\n return stringValue;\n}\n\nfunction requireSlackSendTargetId(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n if (!stringValue || !SLACK_SEND_TARGET_ID_RULE.pattern.test(stringValue)) {\n return slackError(\"channel_not_found\");\n }\n return stringValue;\n}\n\nfunction requireSlackUserId(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n if (!stringValue || !SLACK_USER_ID_RULE.pattern.test(stringValue)) {\n return slackError(\"invalid_users\");\n }\n return stringValue;\n}\n\nfunction requireSlackThreadTs(value: unknown): string | Response | undefined {\n const stringValue = readTrimmedString(value);\n if (!stringValue) {\n return undefined;\n }\n if (!SLACK_TS_RULE.pattern.test(stringValue)) {\n return slackError(\"invalid_ts\");\n }\n return stringValue;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") {\n return value;\n }\n const stringValue = readTrimmedString(value)?.toLowerCase();\n if (stringValue === \"true\" || stringValue === \"1\") {\n return true;\n }\n if (stringValue === \"false\" || stringValue === \"0\") {\n return false;\n }\n return undefined;\n}\n\nfunction readSlackText(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readStructuredValue(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n const stringValue = value.trim();\n if (!stringValue) {\n return undefined;\n }\n try {\n return JSON.parse(stringValue) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction readStructuredArray(value: unknown, error: string): unknown[] | Response | undefined {\n if (value === undefined) {\n return undefined;\n }\n const parsed = readStructuredValue(value);\n return Array.isArray(parsed) ? parsed : slackError(error);\n}\n\nfunction readSlackMetadata(value: unknown): Record<string, unknown> | Response | undefined {\n if (value === undefined) {\n return undefined;\n }\n let parsed: unknown = value;\n if (typeof value === \"string\") {\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n return slackError(\"invalid_metadata_format\");\n }\n }\n if (!isJsonObject(parsed)) {\n return slackError(\"invalid_metadata_format\");\n }\n if (!readTrimmedString(parsed.event_type) || !isJsonObject(parsed.event_payload)) {\n return slackError(\"invalid_metadata_schema\");\n }\n return parsed;\n}\n\nfunction hasStructuredMessageContent(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n return Boolean(value && typeof value === \"object\");\n}\n\nfunction messagesForChannel(state: SlackServerState, channel: string): SlackMessage[] {\n return state.messagesByChannel.get(channel) ?? [];\n}\n\nfunction hasThreadParent(\n state: SlackServerState,\n params: {\n channel: string;\n threadTs: string;\n },\n): boolean {\n return messagesForChannel(state, params.channel).some(\n (message) => message.ts === params.threadTs && message.thread_ts === undefined,\n );\n}\n\nfunction resolveThreadTs(\n state: SlackServerState,\n params: {\n channel: string;\n ts: string;\n },\n): string | undefined {\n const message = messagesForChannel(state, params.channel).find(\n (candidate) => candidate.ts === params.ts,\n );\n return message?.thread_ts ?? message?.ts;\n}\n\nfunction nextSlackTs(state: SlackServerState): string {\n const index = state.nextTsIndex++;\n return `${1_700_000_000 + Math.floor(index / 1_000_000)}.${String(index % 1_000_000).padStart(6, \"0\")}`;\n}\n\nfunction randomDecimalDigits(length: number): string {\n return Array.from({ length }, () => randomInt(10)).join(\"\");\n}\n\nfunction nextDmChannelId(state: SlackServerState): string {\n const index = state.nextDmIndex++;\n return `D${String(index).padStart(9, \"0\")}`;\n}\n\nfunction nextMpimChannelId(state: SlackServerState): string {\n const index = state.nextMpimIndex++;\n return `G${String(index).padStart(9, \"0\")}`;\n}\n\nfunction dmChannelForUser(state: SlackServerState, userId: string): string {\n const existing = state.userDmChannels.get(userId);\n if (existing) {\n return existing;\n }\n const channelId = nextDmChannelId(state);\n state.userDmChannels.set(userId, channelId);\n return channelId;\n}\n\nfunction mpimChannelForUsers(\n state: SlackServerState,\n users: string[],\n): { id: string; users: string[] } {\n const key = [...users].sort().join(\",\");\n const existing = state.userMpimChannels.get(key);\n if (existing) {\n return existing;\n }\n const channel = { id: nextMpimChannelId(state), users: [...users] };\n state.userMpimChannels.set(key, channel);\n return channel;\n}\n\nfunction requireSlackUsers(value: unknown, botUserId: string): string[] | Response {\n const rawUsers = readTrimmedString(value);\n if (!rawUsers) {\n return slackError(\"users_list_not_supplied\");\n }\n const users = rawUsers.split(\",\").map((user) => user.trim());\n if (users.length > 8) {\n return slackError(\"too_many_users\");\n }\n if (users.some((user) => !SLACK_USER_ID_RULE.pattern.test(user))) {\n return slackError(\"user_not_found\");\n }\n if (new Set(users).size !== users.length) {\n return slackError(\"invalid_user_combination\");\n }\n if (users.includes(botUserId)) {\n return slackError(\"invalid_user_combination\");\n }\n return users;\n}\n\nfunction requireSlackLimit(value: unknown): number | Response {\n const limit = value === undefined ? 100 : readInteger(value);\n if (limit === undefined || limit < 1 || limit > 1_000) {\n return slackError(\"invalid_limit\");\n }\n return limit;\n}\n\nfunction decodeSlackCursor(value: unknown, kind: SlackCursorKind): string | Response | undefined {\n if (value === undefined || value === \"\") {\n return undefined;\n }\n if (typeof value !== \"string\" || !/^[A-Za-z0-9_-]+$/u.test(value)) {\n return slackError(\"invalid_cursor\");\n }\n const cursor = value;\n try {\n const decoded = Buffer.from(cursor, \"base64url\").toString(\"utf8\");\n const prefix = `${kind}:`;\n if (!decoded.startsWith(prefix)) {\n return slackError(\"invalid_cursor\");\n }\n const boundary = decoded.slice(prefix.length);\n return SLACK_TS_RULE.pattern.test(boundary) && encodeSlackCursor(kind, boundary) === cursor\n ? boundary\n : slackError(\"invalid_cursor\");\n } catch {\n return slackError(\"invalid_cursor\");\n }\n}\n\nfunction encodeSlackCursor(kind: SlackCursorKind, boundary: string): string {\n return Buffer.from(`${kind}:${boundary}`, \"utf8\").toString(\"base64url\");\n}\n\nfunction appendMessage(state: SlackServerState, message: SlackMessage): SlackMessage {\n const messages = state.messagesByChannel.get(message.channel) ?? [];\n messages.push(message);\n state.messagesByChannel.set(message.channel, messages);\n return message;\n}\n\nasync function appendEvent(state: SlackServerState, event: ServerRequestEvent, committed = false) {\n const params = { event, onEvent: state.onEvent, recorderPath: state.recorderPath };\n await (committed ? recordCommittedServerEvent(params) : recordServerEvent(params));\n}\n\nfunction redactSlackAuthFields(value: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n key.toLowerCase() === \"token\" ? \"[redacted]\" : entry,\n ]),\n );\n}\n\nfunction redactSlackAuthQuery(value: Record<string, string>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n key.toLowerCase() === \"token\" ? \"[redacted]\" : entry,\n ]),\n );\n}\n\nfunction createSlackMessage(\n state: SlackServerState,\n params: {\n channel: string;\n text: string;\n threadTs?: string | undefined;\n user?: string | undefined;\n bot?: boolean | undefined;\n ts?: string | undefined;\n attachments?: unknown;\n blocks?: unknown;\n metadata?: unknown;\n replyBroadcast?: boolean | undefined;\n unfurlLinks?: boolean | undefined;\n unfurlMedia?: boolean | undefined;\n },\n): SlackMessage {\n const ts = params.ts ?? nextSlackTs(state);\n return {\n ...(params.attachments ? { attachments: params.attachments } : {}),\n ...(params.blocks ? { blocks: params.blocks } : {}),\n ...(params.bot ? { bot_id: state.botId } : {}),\n channel: params.channel,\n ...(params.metadata ? { metadata: params.metadata } : {}),\n ...(params.replyBroadcast === undefined ? {} : { reply_broadcast: params.replyBroadcast }),\n text: params.text,\n ...(params.threadTs ? { thread_ts: params.threadTs } : {}),\n ts,\n type: \"message\",\n ...(params.unfurlLinks === undefined ? {} : { unfurl_links: params.unfurlLinks }),\n ...(params.unfurlMedia === undefined ? {} : { unfurl_media: params.unfurlMedia }),\n user: params.user ?? (params.bot ? state.botUserId : \"UCRABUSER\"),\n };\n}\n\nfunction asSlackEventCallback(message: SlackMessage) {\n return {\n api_app_id: \"ACRABLINE\",\n authorizations: [],\n event: message,\n event_id: `Ev${message.ts.replace(\".\", \"\")}`,\n event_time: Number(message.ts.slice(0, 10)),\n team_id: \"TCRABLINE\",\n token: \"crabline-event-token\",\n type: \"event_callback\",\n };\n}\n\nfunction slackRequestSignature(signingSecret: string, timestamp: string, body: string): string {\n const digest = createHmac(\"sha256\", signingSecret)\n .update(`v0:${timestamp}:${body}`)\n .digest(\"hex\");\n return `v0=${digest}`;\n}\n\nfunction authenticateSlackEventsRequest(\n request: IncomingMessage,\n state: SlackServerState,\n rawBody: string,\n): Response | undefined {\n const timestampHeader = request.headers[\"x-slack-request-timestamp\"];\n const signatureHeader = request.headers[\"x-slack-signature\"];\n const timestamp = Array.isArray(timestampHeader) ? timestampHeader[0] : timestampHeader;\n const signature = Array.isArray(signatureHeader) ? signatureHeader[0] : signatureHeader;\n const timestampSeconds = timestamp ? Number(timestamp) : Number.NaN;\n if (\n !timestamp ||\n !signature ||\n !Number.isSafeInteger(timestampSeconds) ||\n Math.abs(Date.now() / 1000 - timestampSeconds) > SLACK_SIGNATURE_TOLERANCE_SECONDS\n ) {\n return new Response(\"unauthorized\", { status: 401 });\n }\n const expected = Buffer.from(slackRequestSignature(state.signingSecret, timestamp, rawBody));\n const actual = Buffer.from(signature);\n if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) {\n return new Response(\"unauthorized\", { status: 401 });\n }\n return undefined;\n}\n\nfunction errorChain(error: unknown): Array<Record<string, unknown>> {\n const chain: Array<Record<string, unknown>> = [];\n let current = error;\n while (current && typeof current === \"object\" && chain.length < 4) {\n const entry = current as Record<string, unknown>;\n chain.push(entry);\n current = entry.cause;\n }\n return chain;\n}\n\nfunction classifySlackRetryReason(error: unknown): SlackRetryReason {\n const chain = errorChain(error);\n const names = chain.map((entry) => String(entry.name ?? \"\"));\n const codes = chain.map((entry) => String(entry.code ?? \"\").toUpperCase());\n const messages = chain.map((entry) => String(entry.message ?? \"\").toLowerCase());\n if (\n codes.includes(\"UND_ERR_REDIRECT\") ||\n messages.some((message) => message.includes(\"redirect count exceeded\"))\n ) {\n return \"too_many_redirects\";\n }\n if (\n names.some((name) => name === \"AbortError\" || name === \"TimeoutError\") ||\n codes.some((code) =>\n [\"ETIMEDOUT\", \"UND_ERR_BODY_TIMEOUT\", \"UND_ERR_HEADERS_TIMEOUT\"].includes(code),\n )\n ) {\n return \"http_timeout\";\n }\n if (\n codes.some(\n (code) =>\n code.includes(\"CERT\") ||\n code.includes(\"SSL\") ||\n code.includes(\"TLS\") ||\n code === \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\",\n )\n ) {\n return \"ssl_error\";\n }\n if (\n codes.some((code) =>\n [\n \"EAI_AGAIN\",\n \"ECONNREFUSED\",\n \"ECONNRESET\",\n \"EHOSTUNREACH\",\n \"ENETUNREACH\",\n \"ENOTFOUND\",\n \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_SOCKET\",\n ].includes(code),\n )\n ) {\n return \"connection_failed\";\n }\n return \"unknown_error\";\n}\n\nasync function waitForSlackRetry(delayMs: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) {\n return false;\n }\n return await new Promise<boolean>((resolve) => {\n let settled = false;\n const finish = (completed: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n resolve(completed);\n };\n const onAbort = () => finish(false);\n const timer = setTimeout(() => finish(true), delayMs);\n timer.unref();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) {\n onAbort();\n }\n });\n}\n\nasync function deliverSlackEvent(\n state: SlackServerState,\n event: ReturnType<typeof asSlackEventCallback>,\n lifecycleSignal: AbortSignal,\n): Promise<void> {\n if (!state.eventsRequestUrl) {\n return undefined;\n }\n const body = JSON.stringify(event);\n let retryReason: SlackRetryReason | undefined;\n for (let attempt = 0; attempt <= SLACK_EVENT_MAX_RETRIES; attempt += 1) {\n if (lifecycleSignal.aborted) {\n return;\n }\n try {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n const headers = {\n \"content-type\": \"application/json\",\n ...(attempt > 0\n ? {\n \"x-slack-retry-num\": String(attempt),\n \"x-slack-retry-reason\": retryReason ?? \"unknown_error\",\n }\n : {}),\n \"x-slack-request-timestamp\": timestamp,\n \"x-slack-signature\": slackRequestSignature(state.signingSecret, timestamp, body),\n };\n const signal = AbortSignal.any([lifecycleSignal, AbortSignal.timeout(3_000)]);\n let requestUrl = state.eventsRequestUrl;\n let response: Response | undefined;\n for (let redirectCount = 0; ; redirectCount += 1) {\n response = await fetch(requestUrl, {\n body,\n headers,\n method: \"POST\",\n redirect: \"manual\",\n signal,\n });\n const location = response.headers.get(\"location\");\n if (![301, 302].includes(response.status) || !location) {\n break;\n }\n await response.body?.cancel();\n if (redirectCount >= SLACK_EVENT_MAX_REDIRECTS) {\n response = undefined;\n retryReason = \"too_many_redirects\";\n break;\n }\n requestUrl = new URL(location, requestUrl).toString();\n }\n if (response) {\n const noRetry = response.headers.get(\"x-slack-no-retry\") === \"1\";\n await response.body?.cancel();\n if (response.ok || noRetry) {\n return;\n }\n retryReason = \"http_error\";\n }\n } catch (error) {\n if (lifecycleSignal.aborted) {\n return;\n }\n retryReason = classifySlackRetryReason(error);\n }\n const retryDelay = SLACK_EVENT_RETRY_DELAYS_MS[attempt];\n if (retryDelay !== undefined && !(await waitForSlackRetry(retryDelay, lifecycleSignal))) {\n return;\n }\n }\n}\n\nfunction scheduleSlackEventDelivery(\n state: SlackServerState,\n event: ReturnType<typeof asSlackEventCallback>,\n): void {\n if (!state.eventsRequestUrl || state.closing) {\n return;\n }\n const delivery = deliverSlackEvent(state, event, state.deliveryAbortController.signal).finally(\n () => {\n state.activeEventDeliveries.delete(delivery);\n },\n );\n state.activeEventDeliveries.add(delivery);\n}\n\nasync function handleSlackApi(params: {\n body: Record<string, unknown>;\n method: string;\n state: SlackServerState;\n}): Promise<Response> {\n switch (params.method) {\n case \"auth.test\":\n return slackOk({\n bot_id: params.state.botId,\n response_metadata: {\n scopes: [\n \"chat:write\",\n \"channels:history\",\n \"groups:history\",\n \"im:history\",\n \"mpim:history\",\n ],\n },\n team: \"Crabline\",\n team_id: \"TCRABLINE\",\n url: \"https://crabline.slack.test/\",\n user: \"crabline\",\n user_id: params.state.botUserId,\n });\n case \"chat.postMessage\": {\n const rateLimit = params.state.chatPostMessageRateLimit;\n if (rateLimit && rateLimit.remaining <= 0) {\n return slackRateLimited(rateLimit.retryAfterSeconds);\n }\n if (rateLimit) {\n rateLimit.remaining -= 1;\n }\n const channel = requireSlackSendTargetId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n const text = readSlackText(params.body.text) ?? \"\";\n const attachments = readStructuredArray(params.body.attachments, \"invalid_attachments\");\n if (attachments instanceof Response) {\n return attachments;\n }\n const blocks = readStructuredArray(params.body.blocks, \"invalid_blocks\");\n if (blocks instanceof Response) {\n return blocks;\n }\n const metadata = readSlackMetadata(params.body.metadata);\n if (metadata instanceof Response) {\n return metadata;\n }\n if (\n !text &&\n !hasStructuredMessageContent(blocks) &&\n !hasStructuredMessageContent(attachments)\n ) {\n return slackError(\"no_text\");\n }\n if (text.length > 40_000) {\n return slackError(\"msg_too_long\");\n }\n const threadTs = requireSlackThreadTs(params.body.thread_ts);\n if (threadTs instanceof Response) {\n return threadTs;\n }\n if (threadTs && !hasThreadParent(params.state, { channel, threadTs })) {\n return slackError(\"thread_not_found\");\n }\n const message = appendMessage(\n params.state,\n createSlackMessage(params.state, {\n attachments,\n blocks,\n bot: true,\n channel,\n metadata,\n replyBroadcast: readBoolean(params.body.reply_broadcast),\n text,\n threadTs,\n unfurlLinks: readBoolean(params.body.unfurl_links),\n unfurlMedia: readBoolean(params.body.unfurl_media),\n }),\n );\n return slackOk({ channel, message, ts: message.ts });\n }\n case \"conversations.open\": {\n const users = requireSlackUsers(params.body.users, params.state.botUserId);\n if (users instanceof Response) {\n return users;\n }\n if (users.length > 1) {\n const channel = mpimChannelForUsers(params.state, users);\n return slackOk({\n channel: {\n id: channel.id,\n is_group: false,\n is_mpim: true,\n is_private: true,\n members: [params.state.botUserId, ...channel.users],\n },\n });\n }\n const user = users[0]!;\n return slackOk({\n channel: {\n id: dmChannelForUser(params.state, user),\n is_im: true,\n user,\n },\n });\n }\n case \"conversations.info\": {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n const mpim = [...params.state.userMpimChannels.values()].find(\n (candidate) => candidate.id === channel,\n );\n return slackOk({\n channel: {\n id: channel,\n is_channel: channel.startsWith(\"C\"),\n is_group: mpim ? false : channel.startsWith(\"G\"),\n is_im: channel.startsWith(\"D\"),\n ...(mpim\n ? {\n is_mpim: true,\n is_private: true,\n members: [params.state.botUserId, ...mpim.users],\n }\n : {}),\n name: \"crabline\",\n },\n });\n }\n case \"conversations.history\": {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n const oldest = requireSlackThreadTs(params.body.oldest);\n if (oldest instanceof Response) {\n return oldest;\n }\n const latest = requireSlackThreadTs(params.body.latest);\n if (latest instanceof Response) {\n return latest;\n }\n const limit = requireSlackLimit(params.body.limit);\n if (limit instanceof Response) {\n return limit;\n }\n const boundary = decodeSlackCursor(params.body.cursor, \"history\");\n if (boundary instanceof Response) {\n return boundary;\n }\n const messages = messagesForChannel(params.state, channel).filter((message) => {\n if (message.thread_ts !== undefined && message.reply_broadcast !== true) {\n return false;\n }\n if (oldest && message.ts <= oldest) {\n return false;\n }\n if (latest && message.ts >= latest) {\n return false;\n }\n return true;\n });\n const ordered = [...messages]\n .reverse()\n .filter((message) => boundary === undefined || message.ts < boundary);\n const page = ordered.slice(0, limit);\n const hasMore = page.length < ordered.length;\n const nextBoundary = page.at(-1)?.ts;\n return slackOk({\n has_more: hasMore,\n messages: page,\n response_metadata: {\n next_cursor: hasMore && nextBoundary ? encodeSlackCursor(\"history\", nextBoundary) : \"\",\n },\n });\n }\n case \"conversations.replies\": {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n const ts = requireSlackThreadTs(params.body.ts);\n if (ts instanceof Response) {\n return ts;\n }\n if (!ts) {\n return slackError(\"message_not_found\");\n }\n const threadTs = resolveThreadTs(params.state, { channel, ts });\n if (!threadTs) {\n return slackError(\"thread_not_found\");\n }\n const limit = requireSlackLimit(params.body.limit);\n if (limit instanceof Response) {\n return limit;\n }\n const boundary = decodeSlackCursor(params.body.cursor, \"replies\");\n if (boundary instanceof Response) {\n return boundary;\n }\n const messages = messagesForChannel(params.state, channel).filter(\n (message) =>\n (message.ts === threadTs || message.thread_ts === threadTs) &&\n (boundary === undefined || message.ts > boundary),\n );\n const page = messages.slice(0, limit);\n const hasMore = page.length < messages.length;\n const nextBoundary = page.at(-1)?.ts;\n return slackOk({\n has_more: hasMore,\n messages: page,\n response_metadata: {\n next_cursor: hasMore && nextBoundary ? encodeSlackCursor(\"replies\", nextBoundary) : \"\",\n },\n });\n }\n default:\n return slackError(\"unknown_method\", 404);\n }\n}\n\nasync function handleAdminInbound(params: {\n body: Record<string, unknown>;\n state: SlackServerState;\n}): Promise<Response> {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n if (params.body.text !== undefined && typeof params.body.text !== \"string\") {\n return slackError(\"invalid_text\", 400);\n }\n const text = readSlackText(params.body.text) ?? \"\";\n const attachments = readStructuredArray(params.body.attachments, \"invalid_attachments\");\n if (attachments instanceof Response) {\n return attachments;\n }\n const blocks = readStructuredArray(params.body.blocks, \"invalid_blocks\");\n if (blocks instanceof Response) {\n return blocks;\n }\n const user = requireSlackUserId(params.body.user ?? \"UCRABUSER\");\n if (user instanceof Response) {\n return user;\n }\n const threadTs = requireSlackThreadTs(params.body.threadTs ?? params.body.thread_ts);\n if (threadTs instanceof Response) {\n return threadTs;\n }\n if (threadTs && !hasThreadParent(params.state, { channel, threadTs })) {\n return slackError(\"thread_not_found\");\n }\n const ts = requireSlackThreadTs(params.body.ts);\n if (ts instanceof Response) {\n return ts;\n }\n const message = appendMessage(\n params.state,\n createSlackMessage(params.state, {\n attachments,\n blocks,\n channel,\n text,\n threadTs,\n ts,\n user,\n }),\n );\n const event = asSlackEventCallback(message);\n scheduleSlackEventDelivery(params.state, event);\n return slackOk({ event, message });\n}\n\nasync function handleRequest(params: { request: IncomingMessage; state: SlackServerState }) {\n const url = new URL(params.request.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname === \"/crabline/slack/inbound\") {\n if (params.request.method !== \"POST\") {\n return new Response(\"not found\", { status: 404 });\n }\n if (!hasAdminToken(params.request, params.state.adminToken)) {\n params.request.resume();\n return adminAuthError();\n }\n const body = await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n return slackError(\"invalid_json\", 400);\n }\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: queryRecord(url),\n type: \"admin\",\n });\n return await handleAdminInbound({ body, state: params.state });\n }\n\n const query = queryRecord(url);\n if (url.pathname === \"/slack/events\") {\n if (params.request.method !== \"POST\") {\n params.request.resume();\n return new Response(\"method not allowed\", {\n headers: { allow: \"POST\" },\n status: 405,\n });\n }\n if (\n !params.request.headers[\"x-slack-request-timestamp\"] ||\n !params.request.headers[\"x-slack-signature\"]\n ) {\n params.request.resume();\n return new Response(\"unauthorized\", { status: 401 });\n }\n const rawBody = (await readBody(params.request)).toString(\"utf8\");\n const authError = authenticateSlackEventsRequest(params.request, params.state, rawBody);\n if (authError) {\n return authError;\n }\n let body: unknown;\n try {\n body = rawBody ? (JSON.parse(rawBody) as unknown) : {};\n } catch (error) {\n throw new InvalidJsonBodyError(error);\n }\n if (!isJsonObject(body)) {\n return slackError(\"invalid_json\", 400);\n }\n if (body.type === \"url_verification\") {\n return jsonResponse({ challenge: readTrimmedString(body.challenge) ?? \"\" });\n }\n if (!readTrimmedString(body.type)) {\n return slackError(\"invalid_payload\", 400);\n }\n return new Response(null, { status: 200 });\n }\n\n const methodMatch = /^\\/api\\/([a-z]+(?:\\.[a-zA-Z]+)*)$/u.exec(url.pathname);\n if (!methodMatch?.[1]) {\n return new Response(\"not found\", { status: 404 });\n }\n const requestMethod = params.request.method ?? \"GET\";\n if (requestMethod !== \"GET\" && requestMethod !== \"POST\") {\n params.request.resume();\n return new Response(\"method not allowed\", {\n headers: { allow: \"GET, POST\" },\n status: 405,\n });\n }\n\n if (params.request.headers.authorization) {\n const headerAuthError = requireSlackToken(params.request, {}, params.state);\n if (headerAuthError) {\n params.request.resume();\n return headerAuthError;\n }\n }\n const body = requestMethod === \"GET\" ? query : await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n return slackError(\"json_not_object\", 400);\n }\n const authError = requireSlackToken(params.request, body, params.state);\n if (authError) {\n return authError;\n }\n const event: SlackRecorderEvent = {\n at: new Date().toISOString(),\n body: redactSlackAuthFields(body),\n method: params.request.method ?? \"GET\",\n path: url.pathname,\n query: redactSlackAuthQuery(query),\n type: \"api\",\n };\n const response = await handleSlackApi({\n body,\n method: methodMatch[1],\n state: params.state,\n });\n const mutation = [\"chat.postMessage\", \"conversations.open\"].includes(methodMatch[1]);\n const payload = mutation\n ? ((await response\n .clone()\n .json()\n .catch(() => undefined)) as unknown)\n : undefined;\n const committed = isJsonObject(payload) && payload.ok === true;\n if (methodMatch[1] === \"chat.postMessage\") {\n event.accepted = committed;\n }\n await appendEvent(params.state, event, committed);\n return response;\n}\n\nexport async function startSlackServer(\n params: StartSlackServerParams = {},\n): Promise<StartedSlackServer> {\n const host = params.host ?? \"127.0.0.1\";\n const externallyBound = !isLoopbackHost(host);\n const state: SlackServerState = {\n activeEventDeliveries: new Set(),\n adminToken: params.adminToken ?? randomBytes(24).toString(\"base64url\"),\n botId: params.botId ?? \"BCRABLINE\",\n botToken: params.botToken ?? \"xoxb-crabline-slack-token\",\n botUserId: params.botUserId ?? \"UCRABBOT\",\n chatPostMessageRateLimit: resolveChatPostMessageRateLimit(params.chatPostMessageRateLimit),\n closing: false,\n deliveryAbortController: new AbortController(),\n eventsRequestUrl: params.eventsRequestUrl,\n nextDmIndex: 1,\n nextMpimIndex: 1,\n nextTsIndex: 100,\n onEvent: params.onEvent,\n recorderPath: params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"slack.jsonl\"),\n signingSecret: params.signingSecret ?? \"crabline-slack-signing-secret\",\n userDmChannels: new Map(),\n userMpimChannels: new Map(),\n messagesByChannel: new Map(),\n };\n if (externallyBound && !params.botToken) {\n const generatedBotValue = `xoxb-${randomDecimalDigits(12)}-${randomDecimalDigits(12)}-${randomBytes(18).toString(\"base64url\")}`;\n state.botToken = generatedBotValue;\n }\n if (externallyBound && !params.signingSecret) {\n const generatedSigningValue = randomBytes(16).toString(\"hex\");\n state.signingSecret = generatedSigningValue;\n }\n const httpServer = await startHttpJsonServer({\n handle: (request) => handleRequest({ request, state }),\n handleError: (error) => {\n if (error instanceof InvalidJsonBodyError) {\n return slackError(\"invalid_json\", 400);\n }\n if (error instanceof RequestBodyTooLargeError) {\n return slackError(\"request_too_large\", 413);\n }\n return undefined;\n },\n host,\n port: params.port ?? 0,\n serverName: \"Slack\",\n });\n const baseUrl = httpServer.baseUrl;\n const apiRoot = `${baseUrl}/api/`;\n return {\n async close() {\n state.closing = true;\n state.deliveryAbortController.abort();\n await Promise.allSettled(state.activeEventDeliveries);\n await httpServer.close();\n },\n manifest: {\n adminToken: state.adminToken,\n baseUrl,\n botToken: state.botToken,\n endpoints: {\n adminInboundUrl: `${baseUrl}/crabline/slack/inbound`,\n apiRoot,\n eventsUrl: `${baseUrl}/slack/events`,\n },\n env: {\n SLACK_API_URL: apiRoot,\n SLACK_BOT_TOKEN: state.botToken,\n SLACK_SIGNING_SECRET: state.signingSecret,\n },\n provider: \"slack\",\n recorderPath: state.recorderPath,\n signingSecret: state.signingSecret,\n version: 1,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/servers/slack.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport { createHmac, randomBytes, randomInt, timingSafeEqual } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n adminAuthError,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n isLoopbackHost,\n jsonResponse,\n parseUnknownRequestBody,\n queryRecord,\n readBody,\n readInteger,\n readTrimmedString,\n RequestBodyTooLargeError,\n startHttpJsonServer,\n type ServerRequestEvent,\n} from \"./http.js\";\nimport {\n SLACK_CHANNEL_ID_RULE,\n SLACK_SEND_TARGET_ID_RULE,\n SLACK_TS_RULE,\n SLACK_USER_ID_RULE,\n} from \"../providers/slack-ids.js\";\nimport {\n recordCommittedServerEvent,\n recordServerEvent,\n type ServerEventObserver,\n} from \"./recorder.js\";\nimport {\n postWebhookRequestWithResponse,\n validateWebhookTarget,\n type WebhookAddress,\n type WebhookResponse,\n type WebhookTargetError,\n} from \"./webhook-target.js\";\n\nconst SLACK_SIGNATURE_TOLERANCE_SECONDS = 5 * 60;\nconst SLACK_EVENT_MAX_RETRIES = 3;\nconst SLACK_EVENT_MAX_REDIRECTS = 2;\nconst SLACK_EVENT_RETRY_DELAYS_MS = [0, 60_000, 5 * 60_000] as const;\n\ntype SlackMessage = {\n attachments?: unknown;\n blocks?: unknown;\n bot_id?: string;\n channel: string;\n metadata?: unknown;\n reply_broadcast?: boolean;\n text: string;\n thread_ts?: string;\n ts: string;\n type: \"message\";\n unfurl_links?: boolean;\n unfurl_media?: boolean;\n user: string;\n};\n\ntype SlackServerState = {\n activeEventDeliveries: Set<Promise<void>>;\n adminToken: string;\n allowLoopbackHttpEvents: boolean;\n botId: string;\n botToken: string;\n botUserId: string;\n chatPostMessageRateLimit:\n | {\n remaining: number;\n retryAfterSeconds: number;\n }\n | undefined;\n closing: boolean;\n deliveryAbortController: AbortController;\n eventsRequestUrl: string | undefined;\n nextDmIndex: number;\n nextMpimIndex: number;\n nextTsIndex: number;\n onEvent: ServerEventObserver | undefined;\n recorderPath: string;\n restrictEventTargets: boolean;\n signingSecret: string;\n userDmChannels: Map<string, string>;\n userMpimChannels: Map<string, { id: string; users: string[] }>;\n messagesByChannel: Map<string, SlackMessage[]>;\n};\ntype SlackRecorderEvent = ServerRequestEvent & {\n accepted?: boolean | undefined;\n};\n\ntype SlackRetryReason =\n | \"connection_failed\"\n | \"http_error\"\n | \"http_timeout\"\n | \"ssl_error\"\n | \"too_many_redirects\"\n | \"unknown_error\";\n\ntype SlackCursorKind = \"history\" | \"list\" | \"replies\";\n\nclass SlackEventHttpError extends Error {\n constructor(readonly status: number) {\n super(`Slack Events API delivery failed with HTTP ${status}.`);\n this.name = \"SlackEventHttpError\";\n }\n}\n\nclass SlackEventTargetError extends Error {\n constructor(\n readonly retryReason: SlackRetryReason,\n targetError: WebhookTargetError,\n ) {\n super(`Slack Events API target rejected: ${targetError}`);\n this.name = \"SlackEventTargetError\";\n }\n}\n\nexport type SlackServerManifest = {\n adminToken: string;\n baseUrl: string;\n botToken: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n eventsUrl: string;\n };\n env: {\n SLACK_API_URL: string;\n SLACK_BOT_TOKEN: string;\n SLACK_SIGNING_SECRET: string;\n };\n provider: \"slack\";\n recorderPath: string;\n signingSecret: string;\n version: 1;\n};\n\nexport type StartedSlackServer = {\n close(): Promise<void>;\n manifest: SlackServerManifest;\n};\n\nexport type StartSlackServerParams = {\n adminToken?: string | undefined;\n botId?: string | undefined;\n botToken?: string | undefined;\n botUserId?: string | undefined;\n chatPostMessageRateLimit?:\n | {\n remaining: number;\n retryAfterSeconds: number;\n }\n | undefined;\n eventsRequestUrl?: string | undefined;\n host?: string | undefined;\n onEvent?: ServerEventObserver | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n signingSecret?: string | undefined;\n};\n\nfunction slackOk(result: Record<string, unknown> = {}): Response {\n return jsonResponse({ ok: true, ...result });\n}\n\nfunction slackError(error: string, status = 200): Response {\n return jsonResponse({ error, ok: false }, status);\n}\n\nfunction slackRateLimited(retryAfterSeconds = 1): Response {\n return new Response(JSON.stringify({ error: \"ratelimited\", ok: false }), {\n headers: {\n \"content-type\": \"application/json\",\n \"retry-after\": String(retryAfterSeconds),\n },\n status: 429,\n });\n}\n\nfunction resolveChatPostMessageRateLimit(\n value: StartSlackServerParams[\"chatPostMessageRateLimit\"],\n): SlackServerState[\"chatPostMessageRateLimit\"] {\n if (value === undefined) {\n return undefined;\n }\n if (!Number.isSafeInteger(value.remaining) || value.remaining < 0) {\n throw new Error(\"chatPostMessageRateLimit.remaining must be a non-negative safe integer.\");\n }\n if (!Number.isSafeInteger(value.retryAfterSeconds) || value.retryAfterSeconds < 1) {\n throw new Error(\"chatPostMessageRateLimit.retryAfterSeconds must be a positive safe integer.\");\n }\n return { ...value };\n}\n\nfunction requireSlackToken(\n request: IncomingMessage,\n body: Record<string, unknown>,\n state: SlackServerState,\n): Response | undefined {\n const authorization = request.headers.authorization;\n let tokenFromHeader: string | undefined;\n if (typeof authorization === \"string\") {\n const trimmed = authorization.trim();\n if (trimmed.slice(0, 6).toLowerCase() === \"bearer\" && /\\s/u.test(trimmed[6] ?? \"\")) {\n let tokenStart = 7;\n while (tokenStart < trimmed.length && /\\s/u.test(trimmed[tokenStart]!)) {\n tokenStart += 1;\n }\n tokenFromHeader = trimmed.slice(tokenStart).trim() || undefined;\n }\n }\n const token = tokenFromHeader ?? readTrimmedString(body.token);\n if (!token) {\n return slackError(\"not_authed\");\n }\n if (token !== state.botToken) {\n return slackError(\"invalid_auth\");\n }\n return undefined;\n}\n\nfunction requireSlackChannelId(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n if (!stringValue || !SLACK_CHANNEL_ID_RULE.pattern.test(stringValue)) {\n return slackError(\"channel_not_found\");\n }\n return stringValue;\n}\n\nfunction requireSlackSendTargetId(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n if (!stringValue || !SLACK_SEND_TARGET_ID_RULE.pattern.test(stringValue)) {\n return slackError(\"channel_not_found\");\n }\n return stringValue;\n}\n\nfunction requireSlackUserId(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n if (!stringValue || !SLACK_USER_ID_RULE.pattern.test(stringValue)) {\n return slackError(\"invalid_users\");\n }\n return stringValue;\n}\n\nfunction requireSlackThreadTs(value: unknown): string | Response | undefined {\n const stringValue = readTrimmedString(value);\n if (!stringValue) {\n return undefined;\n }\n if (!SLACK_TS_RULE.pattern.test(stringValue)) {\n return slackError(\"invalid_ts\");\n }\n return stringValue;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") {\n return value;\n }\n const stringValue = readTrimmedString(value)?.toLowerCase();\n if (stringValue === \"true\" || stringValue === \"1\") {\n return true;\n }\n if (stringValue === \"false\" || stringValue === \"0\") {\n return false;\n }\n return undefined;\n}\n\nfunction readSlackText(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readStructuredValue(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n const stringValue = value.trim();\n if (!stringValue) {\n return undefined;\n }\n try {\n return JSON.parse(stringValue) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction readStructuredArray(value: unknown, error: string): unknown[] | Response | undefined {\n if (value === undefined) {\n return undefined;\n }\n const parsed = readStructuredValue(value);\n return Array.isArray(parsed) ? parsed : slackError(error);\n}\n\nfunction readSlackMetadata(value: unknown): Record<string, unknown> | Response | undefined {\n if (value === undefined) {\n return undefined;\n }\n let parsed: unknown = value;\n if (typeof value === \"string\") {\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n return slackError(\"invalid_metadata_format\");\n }\n }\n if (!isJsonObject(parsed)) {\n return slackError(\"invalid_metadata_format\");\n }\n if (!readTrimmedString(parsed.event_type) || !isJsonObject(parsed.event_payload)) {\n return slackError(\"invalid_metadata_schema\");\n }\n return parsed;\n}\n\nfunction hasStructuredMessageContent(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n return Boolean(value && typeof value === \"object\");\n}\n\nfunction messagesForChannel(state: SlackServerState, channel: string): SlackMessage[] {\n return state.messagesByChannel.get(channel) ?? [];\n}\n\nfunction hasThreadParent(\n state: SlackServerState,\n params: {\n channel: string;\n threadTs: string;\n },\n): boolean {\n return messagesForChannel(state, params.channel).some(\n (message) => message.ts === params.threadTs && message.thread_ts === undefined,\n );\n}\n\nfunction resolveThreadTs(\n state: SlackServerState,\n params: {\n channel: string;\n ts: string;\n },\n): string | undefined {\n const message = messagesForChannel(state, params.channel).find(\n (candidate) => candidate.ts === params.ts,\n );\n return message?.thread_ts ?? message?.ts;\n}\n\nfunction nextSlackTs(state: SlackServerState): string {\n const index = state.nextTsIndex++;\n return `${1_700_000_000 + Math.floor(index / 1_000_000)}.${String(index % 1_000_000).padStart(6, \"0\")}`;\n}\n\nfunction randomDecimalDigits(length: number): string {\n return Array.from({ length }, () => randomInt(10)).join(\"\");\n}\n\nfunction nextDmChannelId(state: SlackServerState): string {\n for (;;) {\n const index = state.nextDmIndex++;\n const channelId = `D${String(index).padStart(9, \"0\")}`;\n if (\n !state.messagesByChannel.has(channelId) &&\n ![...state.userDmChannels.values()].includes(channelId)\n ) {\n return channelId;\n }\n }\n}\n\nfunction nextMpimChannelId(state: SlackServerState): string {\n for (;;) {\n const index = state.nextMpimIndex++;\n const channelId = `G${String(index).padStart(9, \"0\")}`;\n if (\n !state.messagesByChannel.has(channelId) &&\n ![...state.userMpimChannels.values()].some((channel) => channel.id === channelId)\n ) {\n return channelId;\n }\n }\n}\n\nfunction dmChannelForUser(state: SlackServerState, userId: string): string {\n const existing = state.userDmChannels.get(userId);\n if (existing) {\n return existing;\n }\n const channelId = nextDmChannelId(state);\n state.userDmChannels.set(userId, channelId);\n return channelId;\n}\n\nfunction rememberDmChannel(state: SlackServerState, userId: string, channelId: string): void {\n if (!channelId.startsWith(\"D\")) {\n return;\n }\n const mappedUser = [...state.userDmChannels].find(([, value]) => value === channelId)?.[0];\n if (mappedUser && mappedUser !== userId) {\n return;\n }\n state.userDmChannels.set(userId, channelId);\n}\n\nfunction mpimChannelForUsers(\n state: SlackServerState,\n users: string[],\n): { id: string; users: string[] } {\n const key = [...users].sort().join(\",\");\n const existing = state.userMpimChannels.get(key);\n if (existing) {\n return existing;\n }\n const channel = { id: nextMpimChannelId(state), users: [...users] };\n state.userMpimChannels.set(key, channel);\n return channel;\n}\n\nfunction requireSlackUsers(value: unknown, botUserId: string): string[] | Response {\n const rawUsers = readTrimmedString(value);\n if (!rawUsers) {\n return slackError(\"users_list_not_supplied\");\n }\n const users = rawUsers.split(\",\").map((user) => user.trim());\n if (users.length > 8) {\n return slackError(\"too_many_users\");\n }\n if (users.some((user) => !SLACK_USER_ID_RULE.pattern.test(user))) {\n return slackError(\"user_not_found\");\n }\n if (new Set(users).size !== users.length) {\n return slackError(\"invalid_user_combination\");\n }\n if (users.includes(botUserId)) {\n return slackError(\"invalid_user_combination\");\n }\n return users;\n}\n\nfunction requireSlackLimit(value: unknown): number | Response {\n const limit = value === undefined ? 100 : readInteger(value);\n if (limit === undefined || limit < 1 || limit > 1_000) {\n return slackError(\"invalid_limit\");\n }\n return limit;\n}\n\nfunction decodeSlackCursor(value: unknown, kind: SlackCursorKind): string | Response | undefined {\n if (value === undefined || value === \"\") {\n return undefined;\n }\n if (typeof value !== \"string\" || !/^[A-Za-z0-9_-]+$/u.test(value)) {\n return slackError(\"invalid_cursor\");\n }\n const cursor = value;\n try {\n const decoded = Buffer.from(cursor, \"base64url\").toString(\"utf8\");\n const prefix = `${kind}:`;\n if (!decoded.startsWith(prefix)) {\n return slackError(\"invalid_cursor\");\n }\n const boundary = decoded.slice(prefix.length);\n const validBoundary =\n kind === \"list\"\n ? SLACK_CHANNEL_ID_RULE.pattern.test(boundary)\n : SLACK_TS_RULE.pattern.test(boundary);\n return validBoundary && encodeSlackCursor(kind, boundary) === cursor\n ? boundary\n : slackError(\"invalid_cursor\");\n } catch {\n return slackError(\"invalid_cursor\");\n }\n}\n\nfunction encodeSlackCursor(kind: SlackCursorKind, boundary: string): string {\n return Buffer.from(`${kind}:${boundary}`, \"utf8\").toString(\"base64url\");\n}\n\nfunction appendMessage(state: SlackServerState, message: SlackMessage): SlackMessage {\n const messages = state.messagesByChannel.get(message.channel) ?? [];\n messages.push(message);\n state.messagesByChannel.set(message.channel, messages);\n return message;\n}\n\nfunction slackConversation(\n state: SlackServerState,\n channelId: string,\n): Record<string, unknown> | undefined {\n const dmUser = [...state.userDmChannels].find(([, value]) => value === channelId)?.[0];\n const mpim = [...state.userMpimChannels.values()].find((candidate) => candidate.id === channelId);\n const hasMessages = state.messagesByChannel.has(channelId);\n if (!dmUser && !mpim && !hasMessages) {\n return undefined;\n }\n if (dmUser) {\n return {\n id: channelId,\n is_channel: false,\n is_group: false,\n is_im: true,\n is_mpim: false,\n user: dmUser,\n };\n }\n if (mpim) {\n return {\n id: channelId,\n is_channel: false,\n is_group: false,\n is_im: false,\n is_mpim: true,\n is_private: true,\n members: [state.botUserId, ...mpim.users],\n name: \"crabline\",\n };\n }\n return {\n id: channelId,\n is_channel: channelId.startsWith(\"C\"),\n is_group: channelId.startsWith(\"G\"),\n is_im: channelId.startsWith(\"D\"),\n is_mpim: false,\n name: \"crabline\",\n };\n}\n\nfunction slackConversations(state: SlackServerState): Record<string, unknown>[] {\n const ids = new Set([\n ...state.messagesByChannel.keys(),\n ...state.userDmChannels.values(),\n ...[...state.userMpimChannels.values()].map((channel) => channel.id),\n ]);\n return [...ids]\n .sort()\n .map((channelId) => slackConversation(state, channelId))\n .filter((channel): channel is Record<string, unknown> => channel !== undefined);\n}\n\nfunction requireSlackConversationTypes(value: unknown): Set<string> | Response {\n const types = new Set(\n (readTrimmedString(value) ?? \"public_channel\")\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean),\n );\n const supported = new Set([\"im\", \"mpim\", \"private_channel\", \"public_channel\"]);\n return [...types].every((type) => supported.has(type)) ? types : slackError(\"invalid_types\");\n}\n\nfunction slackConversationType(conversation: Record<string, unknown>): string {\n if (conversation.is_im === true) {\n return \"im\";\n }\n if (conversation.is_mpim === true) {\n return \"mpim\";\n }\n return conversation.is_group === true ? \"private_channel\" : \"public_channel\";\n}\n\nasync function appendEvent(state: SlackServerState, event: ServerRequestEvent, committed = false) {\n const params = { event, onEvent: state.onEvent, recorderPath: state.recorderPath };\n await (committed ? recordCommittedServerEvent(params) : recordServerEvent(params));\n}\n\nfunction redactSlackAuthFields(value: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n key.toLowerCase() === \"token\" ? \"[redacted]\" : entry,\n ]),\n );\n}\n\nfunction redactSlackAuthQuery(value: Record<string, string>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n key.toLowerCase() === \"token\" ? \"[redacted]\" : entry,\n ]),\n );\n}\n\nfunction createSlackMessage(\n state: SlackServerState,\n params: {\n channel: string;\n text: string;\n threadTs?: string | undefined;\n user?: string | undefined;\n bot?: boolean | undefined;\n ts?: string | undefined;\n attachments?: unknown;\n blocks?: unknown;\n metadata?: unknown;\n replyBroadcast?: boolean | undefined;\n unfurlLinks?: boolean | undefined;\n unfurlMedia?: boolean | undefined;\n },\n): SlackMessage {\n const ts = params.ts ?? nextSlackTs(state);\n return {\n ...(params.attachments ? { attachments: params.attachments } : {}),\n ...(params.blocks ? { blocks: params.blocks } : {}),\n ...(params.bot ? { bot_id: state.botId } : {}),\n channel: params.channel,\n ...(params.metadata ? { metadata: params.metadata } : {}),\n ...(params.replyBroadcast === undefined ? {} : { reply_broadcast: params.replyBroadcast }),\n text: params.text,\n ...(params.threadTs ? { thread_ts: params.threadTs } : {}),\n ts,\n type: \"message\",\n ...(params.unfurlLinks === undefined ? {} : { unfurl_links: params.unfurlLinks }),\n ...(params.unfurlMedia === undefined ? {} : { unfurl_media: params.unfurlMedia }),\n user: params.user ?? (params.bot ? state.botUserId : \"UCRABUSER\"),\n };\n}\n\nfunction asSlackEventCallback(state: SlackServerState, message: SlackMessage) {\n return {\n api_app_id: \"ACRABLINE\",\n authorizations: [\n {\n enterprise_id: null,\n is_bot: true,\n is_enterprise_install: false,\n team_id: \"TCRABLINE\",\n user_id: state.botUserId,\n },\n ],\n event: message,\n event_id: `Ev${message.ts.replace(\".\", \"\")}`,\n event_time: Number(message.ts.slice(0, 10)),\n team_id: \"TCRABLINE\",\n token: \"crabline-event-token\",\n type: \"event_callback\",\n };\n}\n\nfunction slackRequestSignature(signingSecret: string, timestamp: string, body: string): string {\n const digest = createHmac(\"sha256\", signingSecret)\n .update(`v0:${timestamp}:${body}`)\n .digest(\"hex\");\n return `v0=${digest}`;\n}\n\nfunction authenticateSlackEventsRequest(\n request: IncomingMessage,\n state: SlackServerState,\n rawBody: string,\n): Response | undefined {\n const timestampHeader = request.headers[\"x-slack-request-timestamp\"];\n const signatureHeader = request.headers[\"x-slack-signature\"];\n const timestamp = Array.isArray(timestampHeader) ? timestampHeader[0] : timestampHeader;\n const signature = Array.isArray(signatureHeader) ? signatureHeader[0] : signatureHeader;\n const timestampSeconds = timestamp ? Number(timestamp) : Number.NaN;\n if (\n !timestamp ||\n !signature ||\n !Number.isSafeInteger(timestampSeconds) ||\n Math.abs(Date.now() / 1000 - timestampSeconds) > SLACK_SIGNATURE_TOLERANCE_SECONDS\n ) {\n return new Response(\"unauthorized\", { status: 401 });\n }\n const expected = Buffer.from(slackRequestSignature(state.signingSecret, timestamp, rawBody));\n const actual = Buffer.from(signature);\n if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) {\n return new Response(\"unauthorized\", { status: 401 });\n }\n return undefined;\n}\n\nfunction errorChain(error: unknown): Array<Record<string, unknown>> {\n const chain: Array<Record<string, unknown>> = [];\n let current = error;\n while (current && typeof current === \"object\" && chain.length < 4) {\n const entry = current as Record<string, unknown>;\n chain.push(entry);\n current = entry.cause;\n }\n return chain;\n}\n\n/** @internal */\nexport function classifySlackRetryReason(error: unknown): SlackRetryReason {\n if (error instanceof SlackEventHttpError) {\n return \"http_error\";\n }\n if (error instanceof SlackEventTargetError) {\n return error.retryReason;\n }\n const chain = errorChain(error);\n const names = chain.map((entry) => String(entry.name ?? \"\"));\n const codes = chain.map((entry) => String(entry.code ?? \"\").toUpperCase());\n const messages = chain.map((entry) => String(entry.message ?? \"\").toLowerCase());\n if (\n codes.includes(\"UND_ERR_REDIRECT\") ||\n messages.some((message) => message.includes(\"redirect count exceeded\"))\n ) {\n return \"too_many_redirects\";\n }\n if (\n names.some((name) => name === \"AbortError\" || name === \"TimeoutError\") ||\n codes.some((code) =>\n [\"ETIMEDOUT\", \"UND_ERR_BODY_TIMEOUT\", \"UND_ERR_HEADERS_TIMEOUT\"].includes(code),\n )\n ) {\n return \"http_timeout\";\n }\n if (\n codes.some(\n (code) =>\n code.includes(\"CERT\") ||\n code.includes(\"SSL\") ||\n code.includes(\"TLS\") ||\n code === \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\",\n )\n ) {\n return \"ssl_error\";\n }\n if (\n codes.some((code) =>\n [\n \"EAI_AGAIN\",\n \"ECONNREFUSED\",\n \"ECONNRESET\",\n \"EHOSTUNREACH\",\n \"ENETUNREACH\",\n \"ENOTFOUND\",\n \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_SOCKET\",\n ].includes(code),\n )\n ) {\n return \"connection_failed\";\n }\n return \"unknown_error\";\n}\n\nfunction slackResponseHeader(response: WebhookResponse, name: string): string | undefined {\n const value = response.headers[name];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction slackTargetRetryReason(error: WebhookTargetError): SlackRetryReason {\n return error === \"https-required\" ? \"ssl_error\" : \"connection_failed\";\n}\n\n/** @internal */\nexport async function postSlackEventToAddresses(params: {\n addresses?: ReadonlyArray<WebhookAddress> | undefined;\n body: string;\n headerEntries: ReadonlyArray<readonly [string, string]>;\n request?: typeof postWebhookRequestWithResponse;\n signal: AbortSignal;\n timeoutAt: number;\n url: URL;\n}): Promise<WebhookResponse> {\n const addresses: Array<WebhookAddress | undefined> =\n params.addresses && params.addresses.length > 0 ? [...params.addresses] : [undefined];\n const request = params.request ?? postWebhookRequestWithResponse;\n let lastError: unknown;\n for (const [index, address] of addresses.entries()) {\n const remainingMs = params.timeoutAt - Date.now();\n if (remainingMs <= 0) {\n throw new DOMException(\"Slack Events API delivery timed out\", \"TimeoutError\");\n }\n const attemptsRemaining = addresses.length - index;\n try {\n return await request({\n address,\n body: params.body,\n headerEntries: params.headerEntries,\n signal: params.signal,\n timeoutMs: Math.max(1, Math.floor(remainingMs / attemptsRemaining)),\n url: params.url,\n });\n } catch (error) {\n lastError = error;\n if (params.signal.aborted) {\n throw error;\n }\n }\n }\n throw lastError;\n}\n\nasync function postSlackEventRequest(params: {\n body: string;\n headerEntries: ReadonlyArray<readonly [string, string]>;\n signal: AbortSignal;\n state: SlackServerState;\n timeoutAt: number;\n url: URL;\n}): Promise<WebhookResponse> {\n const target = await validateWebhookTarget({\n allowLoopbackHttp: params.state.allowLoopbackHttpEvents,\n restrictPrivateAddresses: params.state.restrictEventTargets,\n signal: params.signal,\n url: params.url,\n });\n if (\"error\" in target) {\n throw new SlackEventTargetError(slackTargetRetryReason(target.error), target.error);\n }\n\n return await postSlackEventToAddresses({\n addresses: target.addresses,\n body: params.body,\n headerEntries: params.headerEntries,\n signal: params.signal,\n timeoutAt: params.timeoutAt,\n url: params.url,\n });\n}\n\nasync function waitForSlackRetry(delayMs: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) {\n return false;\n }\n return await new Promise<boolean>((resolve) => {\n let settled = false;\n const finish = (completed: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n resolve(completed);\n };\n const onAbort = () => finish(false);\n const timer = setTimeout(() => finish(true), delayMs);\n timer.unref();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) {\n onAbort();\n }\n });\n}\n\nasync function deliverSlackEvent(\n state: SlackServerState,\n event: ReturnType<typeof asSlackEventCallback>,\n lifecycleSignal: AbortSignal,\n): Promise<void> {\n if (!state.eventsRequestUrl) {\n return undefined;\n }\n const body = JSON.stringify(event);\n let retryReason: SlackRetryReason | undefined;\n for (let attempt = 0; attempt <= SLACK_EVENT_MAX_RETRIES; attempt += 1) {\n if (lifecycleSignal.aborted) {\n return;\n }\n try {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n const headerEntries = [\n [\"content-type\", \"application/json\"],\n ...(attempt > 0\n ? ([\n [\"x-slack-retry-num\", String(attempt)],\n [\"x-slack-retry-reason\", retryReason ?? \"unknown_error\"],\n ] as const)\n : []),\n [\"x-slack-request-timestamp\", timestamp],\n [\"x-slack-signature\", slackRequestSignature(state.signingSecret, timestamp, body)],\n ] as const;\n const signal = AbortSignal.any([lifecycleSignal, AbortSignal.timeout(3_000)]);\n const timeoutAt = Date.now() + 3_000;\n let requestUrl = new URL(state.eventsRequestUrl);\n let response: WebhookResponse | undefined;\n for (let redirectCount = 0; ; redirectCount += 1) {\n response = await postSlackEventRequest({\n body,\n headerEntries,\n signal,\n state,\n timeoutAt,\n url: requestUrl,\n });\n const noRetry = slackResponseHeader(response, \"x-slack-no-retry\") === \"1\";\n if (noRetry) {\n return;\n }\n const location = slackResponseHeader(response, \"location\");\n if (![301, 302].includes(response.status) || !location) {\n break;\n }\n if (redirectCount >= SLACK_EVENT_MAX_REDIRECTS) {\n response = undefined;\n retryReason = \"too_many_redirects\";\n break;\n }\n requestUrl = new URL(location, requestUrl);\n }\n if (response) {\n if (response.status >= 200 && response.status < 300) {\n return;\n }\n throw new SlackEventHttpError(response.status);\n }\n } catch (error) {\n if (lifecycleSignal.aborted) {\n return;\n }\n retryReason = classifySlackRetryReason(error);\n }\n const retryDelay = SLACK_EVENT_RETRY_DELAYS_MS[attempt];\n if (retryDelay !== undefined && !(await waitForSlackRetry(retryDelay, lifecycleSignal))) {\n return;\n }\n }\n}\n\nfunction scheduleSlackEventDelivery(\n state: SlackServerState,\n event: ReturnType<typeof asSlackEventCallback>,\n): void {\n if (!state.eventsRequestUrl || state.closing) {\n return;\n }\n const delivery = deliverSlackEvent(state, event, state.deliveryAbortController.signal).finally(\n () => {\n state.activeEventDeliveries.delete(delivery);\n },\n );\n state.activeEventDeliveries.add(delivery);\n}\n\nasync function handleSlackApi(params: {\n body: Record<string, unknown>;\n method: string;\n state: SlackServerState;\n}): Promise<Response> {\n switch (params.method) {\n case \"auth.test\":\n return slackOk({\n bot_id: params.state.botId,\n response_metadata: {\n scopes: [\n \"chat:write\",\n \"channels:history\",\n \"groups:history\",\n \"im:history\",\n \"mpim:history\",\n ],\n },\n team: \"Crabline\",\n team_id: \"TCRABLINE\",\n url: \"https://crabline.slack.test/\",\n user: \"crabline\",\n user_id: params.state.botUserId,\n });\n case \"chat.postMessage\": {\n const rateLimit = params.state.chatPostMessageRateLimit;\n if (rateLimit && rateLimit.remaining <= 0) {\n return slackRateLimited(rateLimit.retryAfterSeconds);\n }\n if (rateLimit) {\n rateLimit.remaining -= 1;\n }\n const requestedChannel = requireSlackSendTargetId(params.body.channel);\n if (requestedChannel instanceof Response) {\n return requestedChannel;\n }\n const channel = SLACK_USER_ID_RULE.pattern.test(requestedChannel)\n ? dmChannelForUser(params.state, requestedChannel)\n : requestedChannel;\n const text = readSlackText(params.body.text) ?? \"\";\n const attachments = readStructuredArray(params.body.attachments, \"invalid_attachments\");\n if (attachments instanceof Response) {\n return attachments;\n }\n const blocks = readStructuredArray(params.body.blocks, \"invalid_blocks\");\n if (blocks instanceof Response) {\n return blocks;\n }\n const metadata = readSlackMetadata(params.body.metadata);\n if (metadata instanceof Response) {\n return metadata;\n }\n if (\n !text &&\n !hasStructuredMessageContent(blocks) &&\n !hasStructuredMessageContent(attachments)\n ) {\n return slackError(\"no_text\");\n }\n if (text.length > 40_000) {\n return slackError(\"msg_too_long\");\n }\n const threadTs = requireSlackThreadTs(params.body.thread_ts);\n if (threadTs instanceof Response) {\n return threadTs;\n }\n if (threadTs && !hasThreadParent(params.state, { channel, threadTs })) {\n return slackError(\"thread_not_found\");\n }\n const message = appendMessage(\n params.state,\n createSlackMessage(params.state, {\n attachments,\n blocks,\n bot: true,\n channel,\n metadata,\n replyBroadcast: readBoolean(params.body.reply_broadcast),\n text,\n threadTs,\n unfurlLinks: readBoolean(params.body.unfurl_links),\n unfurlMedia: readBoolean(params.body.unfurl_media),\n }),\n );\n return slackOk({ channel, message, ts: message.ts });\n }\n case \"conversations.open\": {\n const users = requireSlackUsers(params.body.users, params.state.botUserId);\n if (users instanceof Response) {\n return users;\n }\n if (users.length > 1) {\n const channel = mpimChannelForUsers(params.state, users);\n return slackOk({\n channel: {\n id: channel.id,\n is_group: false,\n is_mpim: true,\n is_private: true,\n members: [params.state.botUserId, ...channel.users],\n },\n });\n }\n const user = users[0]!;\n return slackOk({\n channel: {\n id: dmChannelForUser(params.state, user),\n is_im: true,\n user,\n },\n });\n }\n case \"conversations.info\": {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n const conversation = slackConversation(params.state, channel);\n return conversation ? slackOk({ channel: conversation }) : slackError(\"channel_not_found\");\n }\n case \"conversations.list\": {\n const types = requireSlackConversationTypes(params.body.types);\n if (types instanceof Response) {\n return types;\n }\n const limit = requireSlackLimit(params.body.limit);\n if (limit instanceof Response) {\n return limit;\n }\n const boundary = decodeSlackCursor(params.body.cursor, \"list\");\n if (boundary instanceof Response) {\n return boundary;\n }\n const remaining = slackConversations(params.state).filter((conversation) => {\n const channelId = readTrimmedString(conversation.id);\n return channelId && (boundary === undefined || channelId > boundary);\n });\n const virtualPage = remaining.slice(0, limit);\n const channels = virtualPage.filter((conversation) =>\n types.has(slackConversationType(conversation)),\n );\n const hasMore = virtualPage.length < remaining.length;\n const nextBoundary = readTrimmedString(virtualPage.at(-1)?.id);\n return slackOk({\n channels,\n response_metadata: {\n next_cursor: hasMore && nextBoundary ? encodeSlackCursor(\"list\", nextBoundary) : \"\",\n },\n });\n }\n case \"conversations.history\": {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n if (!slackConversation(params.state, channel)) {\n return slackError(\"channel_not_found\");\n }\n const oldest = requireSlackThreadTs(params.body.oldest);\n if (oldest instanceof Response) {\n return oldest;\n }\n const latest = requireSlackThreadTs(params.body.latest);\n if (latest instanceof Response) {\n return latest;\n }\n const limit = requireSlackLimit(params.body.limit);\n if (limit instanceof Response) {\n return limit;\n }\n const boundary = decodeSlackCursor(params.body.cursor, \"history\");\n if (boundary instanceof Response) {\n return boundary;\n }\n const messages = messagesForChannel(params.state, channel).filter((message) => {\n if (message.thread_ts !== undefined && message.reply_broadcast !== true) {\n return false;\n }\n if (oldest && message.ts <= oldest) {\n return false;\n }\n if (latest && message.ts >= latest) {\n return false;\n }\n return true;\n });\n const ordered = [...messages]\n .reverse()\n .filter((message) => boundary === undefined || message.ts < boundary);\n const page = ordered.slice(0, limit);\n const hasMore = page.length < ordered.length;\n const nextBoundary = page.at(-1)?.ts;\n return slackOk({\n has_more: hasMore,\n messages: page,\n response_metadata: {\n next_cursor: hasMore && nextBoundary ? encodeSlackCursor(\"history\", nextBoundary) : \"\",\n },\n });\n }\n case \"conversations.replies\": {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n if (!slackConversation(params.state, channel)) {\n return slackError(\"channel_not_found\");\n }\n const ts = requireSlackThreadTs(params.body.ts);\n if (ts instanceof Response) {\n return ts;\n }\n if (!ts) {\n return slackError(\"message_not_found\");\n }\n const threadTs = resolveThreadTs(params.state, { channel, ts });\n if (!threadTs) {\n return slackError(\"thread_not_found\");\n }\n const limit = requireSlackLimit(params.body.limit);\n if (limit instanceof Response) {\n return limit;\n }\n const boundary = decodeSlackCursor(params.body.cursor, \"replies\");\n if (boundary instanceof Response) {\n return boundary;\n }\n const messages = messagesForChannel(params.state, channel).filter(\n (message) =>\n (message.ts === threadTs || message.thread_ts === threadTs) &&\n (boundary === undefined || message.ts > boundary),\n );\n const page = messages.slice(0, limit);\n const hasMore = page.length < messages.length;\n const nextBoundary = page.at(-1)?.ts;\n return slackOk({\n has_more: hasMore,\n messages: page,\n response_metadata: {\n next_cursor: hasMore && nextBoundary ? encodeSlackCursor(\"replies\", nextBoundary) : \"\",\n },\n });\n }\n default:\n return slackError(\"unknown_method\", 404);\n }\n}\n\nasync function handleAdminInbound(params: {\n body: Record<string, unknown>;\n state: SlackServerState;\n}): Promise<Response> {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n if (params.body.text !== undefined && typeof params.body.text !== \"string\") {\n return slackError(\"invalid_text\", 400);\n }\n const text = readSlackText(params.body.text) ?? \"\";\n const attachments = readStructuredArray(params.body.attachments, \"invalid_attachments\");\n if (attachments instanceof Response) {\n return attachments;\n }\n const blocks = readStructuredArray(params.body.blocks, \"invalid_blocks\");\n if (blocks instanceof Response) {\n return blocks;\n }\n const user = requireSlackUserId(params.body.user ?? \"UCRABUSER\");\n if (user instanceof Response) {\n return user;\n }\n rememberDmChannel(params.state, user, channel);\n const threadTs = requireSlackThreadTs(params.body.threadTs ?? params.body.thread_ts);\n if (threadTs instanceof Response) {\n return threadTs;\n }\n if (threadTs && !hasThreadParent(params.state, { channel, threadTs })) {\n return slackError(\"thread_not_found\");\n }\n const ts = requireSlackThreadTs(params.body.ts);\n if (ts instanceof Response) {\n return ts;\n }\n const message = appendMessage(\n params.state,\n createSlackMessage(params.state, {\n attachments,\n blocks,\n channel,\n text,\n threadTs,\n ts,\n user,\n }),\n );\n const event = asSlackEventCallback(params.state, message);\n scheduleSlackEventDelivery(params.state, event);\n return slackOk({ event, message });\n}\n\nasync function handleRequest(params: { request: IncomingMessage; state: SlackServerState }) {\n const url = new URL(params.request.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname === \"/crabline/slack/inbound\") {\n if (params.request.method !== \"POST\") {\n return new Response(\"not found\", { status: 404 });\n }\n if (!hasAdminToken(params.request, params.state.adminToken)) {\n params.request.resume();\n return adminAuthError();\n }\n const body = await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n return slackError(\"invalid_json\", 400);\n }\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: queryRecord(url),\n type: \"admin\",\n });\n return await handleAdminInbound({ body, state: params.state });\n }\n\n const query = queryRecord(url);\n if (url.pathname === \"/slack/events\") {\n if (params.request.method !== \"POST\") {\n params.request.resume();\n return new Response(\"method not allowed\", {\n headers: { allow: \"POST\" },\n status: 405,\n });\n }\n if (\n !params.request.headers[\"x-slack-request-timestamp\"] ||\n !params.request.headers[\"x-slack-signature\"]\n ) {\n params.request.resume();\n return new Response(\"unauthorized\", { status: 401 });\n }\n const rawBody = (await readBody(params.request)).toString(\"utf8\");\n const authError = authenticateSlackEventsRequest(params.request, params.state, rawBody);\n if (authError) {\n return authError;\n }\n let body: unknown;\n try {\n body = rawBody ? (JSON.parse(rawBody) as unknown) : {};\n } catch (error) {\n throw new InvalidJsonBodyError(error);\n }\n if (!isJsonObject(body)) {\n return slackError(\"invalid_json\", 400);\n }\n if (body.type === \"url_verification\") {\n return jsonResponse({ challenge: readTrimmedString(body.challenge) ?? \"\" });\n }\n if (!readTrimmedString(body.type)) {\n return slackError(\"invalid_payload\", 400);\n }\n return new Response(null, { status: 200 });\n }\n\n const methodMatch = /^\\/api\\/([a-z]+(?:\\.[a-zA-Z]+)*)$/u.exec(url.pathname);\n if (!methodMatch?.[1]) {\n return new Response(\"not found\", { status: 404 });\n }\n const requestMethod = params.request.method ?? \"GET\";\n if (requestMethod !== \"GET\" && requestMethod !== \"POST\") {\n params.request.resume();\n return new Response(\"method not allowed\", {\n headers: { allow: \"GET, POST\" },\n status: 405,\n });\n }\n\n if (params.request.headers.authorization) {\n const headerAuthError = requireSlackToken(params.request, {}, params.state);\n if (headerAuthError) {\n params.request.resume();\n return headerAuthError;\n }\n }\n const body = requestMethod === \"GET\" ? query : await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n return slackError(\"json_not_object\", 400);\n }\n const authError = requireSlackToken(params.request, body, params.state);\n if (authError) {\n return authError;\n }\n const event: SlackRecorderEvent = {\n at: new Date().toISOString(),\n body: redactSlackAuthFields(body),\n method: params.request.method ?? \"GET\",\n path: url.pathname,\n query: redactSlackAuthQuery(query),\n type: \"api\",\n };\n const response = await handleSlackApi({\n body,\n method: methodMatch[1],\n state: params.state,\n });\n const mutation = [\"chat.postMessage\", \"conversations.open\"].includes(methodMatch[1]);\n const recordsAcceptance = mutation || methodMatch[1] === \"auth.test\";\n const payload = recordsAcceptance\n ? ((await response\n .clone()\n .json()\n .catch(() => undefined)) as unknown)\n : undefined;\n const committed = isJsonObject(payload) && payload.ok === true;\n if (methodMatch[1] === \"auth.test\" || methodMatch[1] === \"chat.postMessage\") {\n event.accepted = committed;\n }\n await appendEvent(params.state, event, mutation && committed);\n return response;\n}\n\nexport async function startSlackServer(\n params: StartSlackServerParams = {},\n): Promise<StartedSlackServer> {\n const host = params.host ?? \"127.0.0.1\";\n const externallyBound = !isLoopbackHost(host);\n const state: SlackServerState = {\n activeEventDeliveries: new Set(),\n adminToken: params.adminToken ?? randomBytes(24).toString(\"base64url\"),\n allowLoopbackHttpEvents: isLoopbackHost(host),\n botId: params.botId ?? \"BCRABLINE\",\n botToken: params.botToken ?? \"xoxb-crabline-slack-token\",\n botUserId: params.botUserId ?? \"UCRABBOT\",\n chatPostMessageRateLimit: resolveChatPostMessageRateLimit(params.chatPostMessageRateLimit),\n closing: false,\n deliveryAbortController: new AbortController(),\n eventsRequestUrl: params.eventsRequestUrl,\n nextDmIndex: 1,\n nextMpimIndex: 1,\n nextTsIndex: 100,\n onEvent: params.onEvent,\n recorderPath: params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"slack.jsonl\"),\n restrictEventTargets: true,\n signingSecret: params.signingSecret ?? \"crabline-slack-signing-secret\",\n userDmChannels: new Map(),\n userMpimChannels: new Map(),\n messagesByChannel: new Map(),\n };\n if (externallyBound && !params.botToken) {\n const generatedBotValue = `xoxb-${randomDecimalDigits(12)}-${randomDecimalDigits(12)}-${randomBytes(18).toString(\"base64url\")}`;\n state.botToken = generatedBotValue;\n }\n if (externallyBound && !params.signingSecret) {\n const generatedSigningValue = randomBytes(16).toString(\"hex\");\n state.signingSecret = generatedSigningValue;\n }\n const httpServer = await startHttpJsonServer({\n handle: (request) => handleRequest({ request, state }),\n handleError: (error) => {\n if (error instanceof InvalidJsonBodyError) {\n return slackError(\"invalid_json\", 400);\n }\n if (error instanceof RequestBodyTooLargeError) {\n return slackError(\"request_too_large\", 413);\n }\n return undefined;\n },\n host,\n port: params.port ?? 0,\n serverName: \"Slack\",\n });\n const baseUrl = httpServer.baseUrl;\n const apiRoot = `${baseUrl}/api/`;\n return {\n async close() {\n state.closing = true;\n state.deliveryAbortController.abort();\n await Promise.allSettled(state.activeEventDeliveries);\n await httpServer.close();\n },\n manifest: {\n adminToken: state.adminToken,\n baseUrl,\n botToken: state.botToken,\n endpoints: {\n adminInboundUrl: `${baseUrl}/crabline/slack/inbound`,\n apiRoot,\n eventsUrl: `${baseUrl}/slack/events`,\n },\n env: {\n SLACK_API_URL: apiRoot,\n SLACK_BOT_TOKEN: state.botToken,\n SLACK_SIGNING_SECRET: state.signingSecret,\n },\n provider: \"slack\",\n recorderPath: state.recorderPath,\n signingSecret: state.signingSecret,\n version: 1,\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const TELEGRAM_NATIVE_CHAT_ID_MAX: bigint;
|
|
2
|
+
export declare const TELEGRAM_BOT_USERNAME_PATTERN: RegExp;
|
|
3
|
+
export declare const TELEGRAM_CHAT_USERNAME_PATTERN: RegExp;
|
|
4
|
+
export declare function canonicalizeTelegramUsername(value: string): string | undefined;
|
|
5
|
+
export declare function telegramUsernameChatId(value: string): number | undefined;
|
|
6
|
+
export declare function isTelegramUsernameChatId(value: number): boolean;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export const TELEGRAM_NATIVE_CHAT_ID_MAX = (1n << 52n) - 1n;
|
|
3
|
+
export const TELEGRAM_BOT_USERNAME_PATTERN = /^@[A-Za-z][A-Za-z0-9_]{4,31}$/u;
|
|
4
|
+
export const TELEGRAM_CHAT_USERNAME_PATTERN = /^@[A-Za-z][A-Za-z0-9_]{3,31}$/u;
|
|
5
|
+
const TELEGRAM_SYNTHETIC_ID_RANGE = 1n << 50n;
|
|
6
|
+
const TELEGRAM_USERNAME_ID_BASE = TELEGRAM_NATIVE_CHAT_ID_MAX + 1n;
|
|
7
|
+
const TELEGRAM_USERNAME_ID_MAX = TELEGRAM_USERNAME_ID_BASE + TELEGRAM_SYNTHETIC_ID_RANGE - 1n;
|
|
8
|
+
export function canonicalizeTelegramUsername(value) {
|
|
9
|
+
const username = value.trim();
|
|
10
|
+
return TELEGRAM_CHAT_USERNAME_PATTERN.test(username) ? username.toLowerCase() : undefined;
|
|
11
|
+
}
|
|
12
|
+
export function telegramUsernameChatId(value) {
|
|
13
|
+
const username = canonicalizeTelegramUsername(value);
|
|
14
|
+
if (!username) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
const hash = createHash("sha256").update(username).digest();
|
|
18
|
+
return Number(-(TELEGRAM_USERNAME_ID_BASE + (hash.readBigUInt64BE() % TELEGRAM_SYNTHETIC_ID_RANGE)));
|
|
19
|
+
}
|
|
20
|
+
export function isTelegramUsernameChatId(value) {
|
|
21
|
+
if (!Number.isSafeInteger(value) || value >= 0) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const magnitude = BigInt(-value);
|
|
25
|
+
return magnitude >= TELEGRAM_USERNAME_ID_BASE && magnitude <= TELEGRAM_USERNAME_ID_MAX;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=telegram-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-identity.js","sourceRoot":"","sources":["../../../src/servers/telegram-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;AAC5D,MAAM,CAAC,MAAM,6BAA6B,GAAG,gCAAgC,CAAC;AAC9E,MAAM,CAAC,MAAM,8BAA8B,GAAG,gCAAgC,CAAC;AAE/E,MAAM,2BAA2B,GAAG,EAAE,IAAI,GAAG,CAAC;AAC9C,MAAM,yBAAyB,GAAG,2BAA2B,GAAG,EAAE,CAAC;AACnE,MAAM,wBAAwB,GAAG,yBAAyB,GAAG,2BAA2B,GAAG,EAAE,CAAC;AAE9F,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC9B,OAAO,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,MAAM,QAAQ,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5D,OAAO,MAAM,CACX,CAAC,CAAC,yBAAyB,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,2BAA2B,CAAC,CAAC,CACtF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,SAAS,IAAI,yBAAyB,IAAI,SAAS,IAAI,wBAAwB,CAAC;AACzF,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport const TELEGRAM_NATIVE_CHAT_ID_MAX = (1n << 52n) - 1n;\nexport const TELEGRAM_BOT_USERNAME_PATTERN = /^@[A-Za-z][A-Za-z0-9_]{4,31}$/u;\nexport const TELEGRAM_CHAT_USERNAME_PATTERN = /^@[A-Za-z][A-Za-z0-9_]{3,31}$/u;\n\nconst TELEGRAM_SYNTHETIC_ID_RANGE = 1n << 50n;\nconst TELEGRAM_USERNAME_ID_BASE = TELEGRAM_NATIVE_CHAT_ID_MAX + 1n;\nconst TELEGRAM_USERNAME_ID_MAX = TELEGRAM_USERNAME_ID_BASE + TELEGRAM_SYNTHETIC_ID_RANGE - 1n;\n\nexport function canonicalizeTelegramUsername(value: string): string | undefined {\n const username = value.trim();\n return TELEGRAM_CHAT_USERNAME_PATTERN.test(username) ? username.toLowerCase() : undefined;\n}\n\nexport function telegramUsernameChatId(value: string): number | undefined {\n const username = canonicalizeTelegramUsername(value);\n if (!username) {\n return undefined;\n }\n const hash = createHash(\"sha256\").update(username).digest();\n return Number(\n -(TELEGRAM_USERNAME_ID_BASE + (hash.readBigUInt64BE() % TELEGRAM_SYNTHETIC_ID_RANGE)),\n );\n}\n\nexport function isTelegramUsernameChatId(value: number): boolean {\n if (!Number.isSafeInteger(value) || value >= 0) {\n return false;\n }\n const magnitude = BigInt(-value);\n return magnitude >= TELEGRAM_USERNAME_ID_BASE && magnitude <= TELEGRAM_USERNAME_ID_MAX;\n}\n"]}
|
|
@@ -12,13 +12,16 @@ type TelegramServerState = {
|
|
|
12
12
|
activeWebhookValidations: Set<AbortController>;
|
|
13
13
|
adminToken: string;
|
|
14
14
|
allowLoopbackHttpWebhook: boolean;
|
|
15
|
+
botHasTopicsEnabled: boolean;
|
|
15
16
|
botId: number;
|
|
16
17
|
botToken: string;
|
|
17
18
|
botUsername: string;
|
|
19
|
+
chatsById: Map<number, TelegramChat>;
|
|
20
|
+
chatsByUsername: Map<string, TelegramChat>;
|
|
18
21
|
closing: boolean;
|
|
19
22
|
inboundAdmission: Promise<void>;
|
|
20
23
|
maxPendingInboundEvents: number;
|
|
21
|
-
|
|
24
|
+
nextMessageIds: Map<string, number>;
|
|
22
25
|
nextUpdateId: number;
|
|
23
26
|
onEvent: ServerEventObserver | undefined;
|
|
24
27
|
recorderPath: string;
|
|
@@ -36,12 +39,15 @@ type TelegramUpdatePoll = {
|
|
|
36
39
|
};
|
|
37
40
|
type TelegramUpdatePollResult = "conflict" | "shutdown" | "timeout" | "update";
|
|
38
41
|
type TelegramGetUpdatesState = Pick<TelegramServerState, "activeUpdatePoll" | "closing" | "updates">;
|
|
42
|
+
type TelegramChat = {
|
|
43
|
+
id: number;
|
|
44
|
+
is_forum?: true;
|
|
45
|
+
title?: string;
|
|
46
|
+
type: "channel" | "group" | "private" | "supergroup";
|
|
47
|
+
username?: string;
|
|
48
|
+
};
|
|
39
49
|
type TelegramMessage = {
|
|
40
|
-
chat:
|
|
41
|
-
id: number | string;
|
|
42
|
-
title?: string;
|
|
43
|
-
type: "group" | "private" | "supergroup";
|
|
44
|
-
};
|
|
50
|
+
chat: TelegramChat;
|
|
45
51
|
animation?: {
|
|
46
52
|
duration: number;
|
|
47
53
|
file_id: string;
|
|
@@ -67,9 +73,13 @@ type TelegramMessage = {
|
|
|
67
73
|
mime_type?: string;
|
|
68
74
|
};
|
|
69
75
|
entities?: Array<{
|
|
76
|
+
custom_emoji_id?: string;
|
|
77
|
+
language?: string;
|
|
70
78
|
length: number;
|
|
71
79
|
offset: number;
|
|
72
80
|
type: string;
|
|
81
|
+
url?: string;
|
|
82
|
+
user?: Record<string, unknown>;
|
|
73
83
|
}>;
|
|
74
84
|
from: {
|
|
75
85
|
first_name: string;
|
|
@@ -121,6 +131,7 @@ export type StartedTelegramServer = {
|
|
|
121
131
|
};
|
|
122
132
|
export type StartTelegramServerParams = {
|
|
123
133
|
adminToken?: string | undefined;
|
|
134
|
+
botHasTopicsEnabled?: boolean | undefined;
|
|
124
135
|
botId?: number | undefined;
|
|
125
136
|
botToken?: string | undefined;
|
|
126
137
|
botUsername?: string | undefined;
|