@openclaw/crabline 0.1.11 → 0.1.12
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 +99 -12
- 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 +264 -50
- 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/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 -2
- package/dist/src/openclaw/artifact-generation.js +399 -27
- package/dist/src/openclaw/artifact-generation.js.map +1 -1
- package/dist/src/openclaw/bridges/matrix.js +21 -4
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +13 -8
- 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 +15 -6
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +116 -23
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +45 -19
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +32 -16
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +8 -3
- package/dist/src/openclaw/bridges/zalo.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/shared.d.ts +1 -0
- package/dist/src/openclaw/shared.js +48 -13
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw/smoke-lock.d.ts +9 -0
- package/dist/src/openclaw/smoke-lock.js +626 -172
- package/dist/src/openclaw/smoke-lock.js.map +1 -1
- package/dist/src/openclaw.js +225 -42
- 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/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/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 +259 -51
- 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 +1169 -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 -0
- package/dist/src/servers/whatsapp.js +149 -24
- 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 +185 -43
- package/fixtures/examples/crabline.example.yaml +3 -2
- package/package.json +18 -10
- package/fixtures/examples/openclaw-bridge.yaml +0 -125
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/providers/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { CrablineError } from \"../core/errors.js\";\nimport type { BuiltinAdapterId, ManifestDefinition, ProviderConfig } from \"../config/schema.js\";\nimport { ScriptProviderAdapter } from \"./builtin/script.js\";\nimport { OPENCLAW_SUPPORT_CATALOG } from \"./catalog.js\";\nimport type {\n InboundEnvelope,\n ProbeResult,\n ProviderAdapter,\n ProviderContext,\n ProviderSupportStatus,\n SendContext,\n SendResult,\n WaitContext,\n WatchContext,\n} from \"./types.js\";\nimport { getBuiltinTargetCodec, type BuiltinProviderAdapterId } from \"./target-normalizers.js\";\n\nexport type Registry = {\n catalog: typeof OPENCLAW_SUPPORT_CATALOG;\n resolve(providerId: string, fixtureId: string): ProviderAdapter;\n};\n\ntype LazyAdapterId = BuiltinProviderAdapterId;\ntype ProviderFactory = () => Promise<ProviderAdapter>;\ntype ActiveWatch = {\n abort(): void;\n close(): Promise<void>;\n dispatch: DispatchBarrier;\n};\ntype DispatchBarrier = {\n promise: Promise<void>;\n reach(): void;\n reached: boolean;\n};\ntype AdmittedOperation = {\n completion: Promise<unknown>;\n dispatch: DispatchBarrier;\n};\ntype LazyProviderFactory = (params: {\n config: ProviderConfig;\n providerId: string;\n userName: string;\n}) => Promise<ProviderAdapter>;\n\nconst LAZY_PROVIDER_FACTORIES = {\n async discord({ config, providerId, userName }) {\n const { DiscordProviderAdapter } = await import(\"./builtin/discord.js\");\n return new DiscordProviderAdapter(providerId, config, userName);\n },\n async feishu({ config, providerId, userName }) {\n const { FeishuProviderAdapter } = await import(\"./builtin/feishu.js\");\n return new FeishuProviderAdapter(providerId, config, userName);\n },\n async googlechat({ config, providerId, userName }) {\n const { GoogleChatProviderAdapter } = await import(\"./builtin/googlechat.js\");\n return new GoogleChatProviderAdapter(providerId, config, userName);\n },\n async imessage({ config, providerId, userName }) {\n const { IMessageProviderAdapter } = await import(\"./builtin/imessage.js\");\n return new IMessageProviderAdapter(providerId, config, userName);\n },\n async loopback({ config, providerId, userName }) {\n const { LoopbackProviderAdapter } = await import(\"./builtin/loopback.js\");\n return new LoopbackProviderAdapter(providerId, config, userName);\n },\n async matrix({ config, providerId, userName }) {\n const { MatrixProviderAdapter } = await import(\"./builtin/matrix.js\");\n return new MatrixProviderAdapter(providerId, config, userName);\n },\n async mattermost({ config, providerId, userName }) {\n const { MattermostProviderAdapter } = await import(\"./builtin/mattermost.js\");\n return new MattermostProviderAdapter(providerId, config, userName);\n },\n async msteams({ config, providerId, userName }) {\n const { MsTeamsProviderAdapter } = await import(\"./builtin/msteams.js\");\n return new MsTeamsProviderAdapter(providerId, config, userName);\n },\n async slack({ config, providerId, userName }) {\n const { SlackProviderAdapter } = await import(\"./builtin/slack.js\");\n return new SlackProviderAdapter(providerId, config, userName);\n },\n async telegram({ config, providerId, userName }) {\n const { TelegramProviderAdapter } = await import(\"./builtin/telegram.js\");\n return new TelegramProviderAdapter(providerId, config, userName);\n },\n async whatsapp({ config, providerId, userName }) {\n const { WhatsAppProviderAdapter } = await import(\"./builtin/whatsapp.js\");\n return new WhatsAppProviderAdapter(providerId, config, userName);\n },\n async zalo({ config, providerId, userName }) {\n const { ZaloProviderAdapter } = await import(\"./builtin/zalo.js\");\n return new ZaloProviderAdapter(providerId, config, userName);\n },\n} satisfies Record<LazyAdapterId, LazyProviderFactory>;\n\nfunction createDispatchBarrier(): DispatchBarrier {\n let resolveDispatch: (() => void) | undefined;\n const dispatch: DispatchBarrier = {\n promise: new Promise<void>((resolve) => {\n resolveDispatch = resolve;\n }),\n reach() {\n if (dispatch.reached) {\n return;\n }\n dispatch.reached = true;\n resolveDispatch?.();\n },\n reached: false,\n };\n return dispatch;\n}\n\nfunction isLazyAdapter(adapter: BuiltinAdapterId): adapter is LazyAdapterId {\n return adapter in LAZY_PROVIDER_FACTORIES;\n}\n\nfunction createLazyProvider(params: {\n adapter: LazyAdapterId;\n config: ProviderConfig;\n providerId: string;\n userName: string;\n}): ProviderAdapter {\n return new LazyProviderAdapter({\n adapterName: params.adapter,\n factory: () => LAZY_PROVIDER_FACTORIES[params.adapter](params),\n id: params.providerId,\n normalizeTarget: getBuiltinTargetCodec(params.adapter).normalize,\n platform: params.config.platform,\n status: \"ready\",\n supports: params.config.capabilities,\n });\n}\n\nexport class LazyProviderAdapter implements ProviderAdapter {\n readonly id;\n readonly platform;\n readonly status;\n readonly supports;\n\n readonly #factory: ProviderFactory;\n readonly #normalizeTarget: ProviderAdapter[\"normalizeTarget\"];\n readonly #activeWatches = new Set<ActiveWatch>();\n readonly #inFlightOperations = new Set<AdmittedOperation>();\n #cleanedUp = false;\n #cleanupPromise: Promise<void> | null = null;\n #providerInstance: ProviderAdapter | null = null;\n #providerPromise: Promise<ProviderAdapter> | null = null;\n\n constructor(params: {\n adapterName: string;\n factory: ProviderFactory;\n id: string;\n normalizeTarget: ProviderAdapter[\"normalizeTarget\"];\n platform: ProviderAdapter[\"platform\"];\n status: ProviderSupportStatus;\n supports: ProviderAdapter[\"supports\"];\n }) {\n this.#factory = params.factory;\n this.#normalizeTarget = params.normalizeTarget;\n this.id = params.id;\n this.platform = params.platform;\n this.status = params.status;\n this.supports = params.supports;\n }\n\n normalizeTarget(target: ProviderContext[\"fixture\"][\"target\"]) {\n this.#assertActive();\n return this.#normalizeTarget(target);\n }\n\n probe(context: ProviderContext): Promise<ProbeResult> {\n return this.#runOperation((provider) => provider.probe(context), context.signal);\n }\n\n send(context: SendContext): Promise<SendResult> {\n return this.#runOperation((provider) => provider.send(context), context.signal);\n }\n\n waitForInbound(context: WaitContext): Promise<InboundEnvelope | null> {\n return this.#runOperation((provider) => provider.waitForInbound(context), context.signal);\n }\n\n watch(context: WatchContext): AsyncIterable<InboundEnvelope> {\n if (this.#cleanedUp) {\n const error = this.#cleanedUpError();\n return {\n [Symbol.asyncIterator](): AsyncIterator<InboundEnvelope> {\n return {\n next: () => Promise.reject(error),\n };\n },\n };\n }\n const controller = new AbortController();\n const abortFromContext = () => controller.abort(context.signal?.reason);\n if (context.signal?.aborted) {\n abortFromContext();\n } else {\n context.signal?.addEventListener(\"abort\", abortFromContext, { once: true });\n }\n const dispatch = createDispatchBarrier();\n const source = this.#watch(context, controller.signal, dispatch)[Symbol.asyncIterator]();\n let activeWatch: ActiveWatch;\n let closed = false;\n let closePromise: Promise<IteratorResult<InboundEnvelope>> | null = null;\n const finish = () => {\n if (closed) {\n return;\n }\n closed = true;\n context.signal?.removeEventListener(\"abort\", abortFromContext);\n this.#activeWatches.delete(activeWatch);\n };\n const close = () => {\n if (closed) {\n return Promise.resolve({ done: true as const, value: undefined as never });\n }\n closePromise ??= (async () => {\n controller.abort();\n try {\n const result = source.return\n ? await source.return()\n : { done: true as const, value: undefined as never };\n if (result.done) {\n finish();\n }\n return result;\n } catch (error) {\n finish();\n throw error;\n } finally {\n dispatch.reach();\n }\n })();\n const closing = closePromise;\n void closing.then(\n () => {\n if (closePromise === closing) {\n closePromise = null;\n }\n },\n () => {\n if (closePromise === closing) {\n closePromise = null;\n }\n },\n );\n return closing;\n };\n const iterator: AsyncIterableIterator<InboundEnvelope> = {\n async next() {\n try {\n const result = await source.next();\n if (result.done) {\n finish();\n }\n return result;\n } catch (error) {\n finish();\n throw error;\n }\n },\n return: close,\n async throw(error?: unknown) {\n controller.abort();\n try {\n if (source.throw) {\n return await source.throw(error);\n }\n throw error;\n } finally {\n finish();\n }\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n activeWatch = {\n abort: () => controller.abort(),\n close: async () => {\n while (!(await close()).done) {\n // Async iterators may yield final values before acknowledging return.\n }\n },\n dispatch,\n };\n this.#activeWatches.add(activeWatch);\n return iterator;\n }\n\n async cleanup(): Promise<void> {\n this.#cleanedUp = true;\n for (const watch of this.#activeWatches) {\n watch.abort();\n }\n this.#cleanupPromise ??= (async () => {\n const operations = [...this.#inFlightOperations];\n const watches = [...this.#activeWatches];\n const closingWatches = watches.map(async (watch) => await watch.close());\n const providerCleanup = this.#cleanupProvider(\n operations\n .map((operation) => operation.dispatch)\n .concat(watches.map((watch) => watch.dispatch)),\n );\n const [cleanupResult, , watchResults] = await Promise.all([\n providerCleanup.then(\n () => ({ ok: true as const }),\n (error: unknown) => ({ error, ok: false as const }),\n ),\n Promise.allSettled(operations.map((operation) => operation.completion)),\n Promise.allSettled(closingWatches),\n ]);\n const teardownErrors = watchResults.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (!cleanupResult.ok) {\n teardownErrors.unshift(cleanupResult.error);\n }\n if (teardownErrors.length === 1) {\n throw teardownErrors[0];\n }\n if (teardownErrors.length > 1) {\n throw new AggregateError(teardownErrors, \"Provider cleanup failed.\");\n }\n })();\n await this.#cleanupPromise;\n }\n\n async #provider(): Promise<ProviderAdapter> {\n this.#assertActive();\n this.#providerPromise ??= this.#factory()\n .then((provider) => {\n this.#providerInstance = provider;\n return provider;\n })\n .catch((error: unknown) => {\n this.#providerPromise = null;\n throw error;\n });\n return await this.#providerPromise;\n }\n\n async *#watch(\n context: WatchContext,\n signal: AbortSignal,\n dispatch: DispatchBarrier,\n ): AsyncIterable<InboundEnvelope> {\n try {\n if (signal.aborted) {\n return;\n }\n const provider = await this.#provider();\n if (signal.aborted) {\n return;\n }\n if (!provider.watch) {\n throw new CrablineError(`Provider \"${this.id}\" does not implement watch.`, {\n kind: \"config\",\n });\n }\n dispatch.reach();\n yield* provider.watch({ ...context, signal });\n } finally {\n dispatch.reach();\n }\n }\n\n #assertActive(): void {\n if (this.#cleanedUp) {\n throw this.#cleanedUpError();\n }\n }\n\n async #cleanupProvider(dispatches: readonly DispatchBarrier[]): Promise<void> {\n const pendingDispatches = dispatches\n .filter((dispatch) => !dispatch.reached)\n .map((dispatch) => dispatch.promise);\n if (pendingDispatches.length > 0) {\n await Promise.allSettled(pendingDispatches);\n }\n let provider = this.#providerInstance;\n if (!provider) {\n const providerPromise = this.#providerPromise;\n if (!providerPromise) {\n return;\n }\n provider = await providerPromise;\n }\n if (!provider) {\n return;\n }\n const errors: unknown[] = [];\n try {\n provider.beginCleanup?.();\n } catch (error) {\n errors.push(error);\n }\n try {\n await provider.cleanup?.();\n } catch (error) {\n errors.push(error);\n }\n if (errors.length === 1) {\n throw errors[0];\n }\n if (errors.length > 1) {\n throw new AggregateError(errors, \"Provider teardown failed.\");\n }\n }\n\n #runOperation<T>(\n run: (provider: ProviderAdapter) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n if (this.#cleanedUp) {\n return Promise.reject(this.#cleanedUpError());\n }\n if (signal?.aborted) {\n return Promise.reject(signal.reason ?? new Error(\"Provider operation aborted.\"));\n }\n const dispatch = createDispatchBarrier();\n const underlying = (async () => {\n try {\n const provider = await this.#provider();\n if (signal?.aborted) {\n throw signal.reason ?? new Error(\"Provider operation aborted.\");\n }\n const result = run(provider);\n dispatch.reach();\n return await result;\n } catch (error) {\n dispatch.reach();\n throw error;\n }\n })();\n const operation = { completion: underlying, dispatch };\n this.#inFlightOperations.add(operation);\n void underlying.then(\n () => this.#inFlightOperations.delete(operation),\n () => this.#inFlightOperations.delete(operation),\n );\n return underlying;\n }\n\n #cleanedUpError(): CrablineError {\n return new CrablineError(`Provider \"${this.id}\" has been cleaned up.`, { kind: \"config\" });\n }\n}\n\nexport function createRegistry(manifest: ManifestDefinition, manifestPath: string): Registry {\n return {\n catalog: OPENCLAW_SUPPORT_CATALOG,\n resolve(providerId, fixtureId) {\n const fixture = manifest.fixtures.find((entry) => entry.id === fixtureId);\n if (!fixture) {\n throw new CrablineError(`Unknown fixture: ${fixtureId}`, { kind: \"config\" });\n }\n const config = manifest.providers[providerId];\n if (!config) {\n throw new CrablineError(`Unknown provider: ${providerId}`, { kind: \"config\" });\n }\n if (fixture.provider !== providerId) {\n throw new CrablineError(\n `Fixture \"${fixtureId}\" belongs to provider \"${fixture.provider}\", not \"${providerId}\".`,\n { kind: \"config\" },\n );\n }\n\n if (config.status === \"disabled\") {\n throw new CrablineError(`Provider \"${providerId}\" is disabled.`, { kind: \"config\" });\n }\n if (config.status === \"planned\") {\n throw new CrablineError(`Provider \"${providerId}\" is planned and cannot run.`, {\n kind: \"config\",\n });\n }\n\n const context: ProviderContext = {\n config,\n fixture,\n manifestPath,\n providerId,\n userName: manifest.userName,\n };\n\n if (isLazyAdapter(config.adapter)) {\n return createLazyProvider({\n adapter: config.adapter,\n config,\n providerId,\n userName: manifest.userName,\n });\n }\n\n return new ScriptProviderAdapter(context);\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/providers/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { CrablineError } from \"../core/errors.js\";\nimport type { BuiltinAdapterId, ManifestDefinition, ProviderConfig } from \"../config/schema.js\";\nimport { ScriptProviderAdapter } from \"./builtin/script.js\";\nimport { OPENCLAW_SUPPORT_CATALOG } from \"./catalog.js\";\nimport type {\n InboundEnvelope,\n ProbeResult,\n ProviderAdapter,\n ProviderContext,\n ProviderSupportStatus,\n SendContext,\n SendResult,\n WaitContext,\n WatchContext,\n} from \"./types.js\";\nimport { getBuiltinTargetCodec, type BuiltinProviderAdapterId } from \"./target-normalizers.js\";\n\nexport type Registry = {\n catalog: typeof OPENCLAW_SUPPORT_CATALOG;\n resolve(providerId: string, fixtureId: string): ProviderAdapter;\n};\n\ntype LazyAdapterId = BuiltinProviderAdapterId;\ntype ProviderFactory = () => Promise<ProviderAdapter>;\ntype ActiveWatch = {\n abort(): void;\n close(): Promise<void>;\n dispatch: DispatchBarrier;\n};\ntype DispatchBarrier = {\n promise: Promise<void>;\n reach(): void;\n reached: boolean;\n};\ntype AdmittedOperation = {\n completion: Promise<unknown>;\n dispatch: DispatchBarrier;\n};\ntype LazyProviderFactory = (params: {\n config: ProviderConfig;\n providerId: string;\n userName: string;\n}) => Promise<ProviderAdapter>;\n\nconst LAZY_PROVIDER_FACTORIES = {\n async discord({ config, providerId, userName }) {\n const { DiscordProviderAdapter } = await import(\"./builtin/discord.js\");\n return new DiscordProviderAdapter(providerId, config, userName);\n },\n async feishu({ config, providerId, userName }) {\n const { FeishuProviderAdapter } = await import(\"./builtin/feishu.js\");\n return new FeishuProviderAdapter(providerId, config, userName);\n },\n async googlechat({ config, providerId, userName }) {\n const { GoogleChatProviderAdapter } = await import(\"./builtin/googlechat.js\");\n return new GoogleChatProviderAdapter(providerId, config, userName);\n },\n async imessage({ config, providerId, userName }) {\n const { IMessageProviderAdapter } = await import(\"./builtin/imessage.js\");\n return new IMessageProviderAdapter(providerId, config, userName);\n },\n async loopback({ config, providerId, userName }) {\n const { LoopbackProviderAdapter } = await import(\"./builtin/loopback.js\");\n return new LoopbackProviderAdapter(providerId, config, userName);\n },\n async matrix({ config, providerId, userName }) {\n const { MatrixProviderAdapter } = await import(\"./builtin/matrix.js\");\n return new MatrixProviderAdapter(providerId, config, userName);\n },\n async mattermost({ config, providerId, userName }) {\n const { MattermostProviderAdapter } = await import(\"./builtin/mattermost.js\");\n return new MattermostProviderAdapter(providerId, config, userName);\n },\n async msteams({ config, providerId, userName }) {\n const { MsTeamsProviderAdapter } = await import(\"./builtin/msteams.js\");\n return new MsTeamsProviderAdapter(providerId, config, userName);\n },\n async slack({ config, providerId, userName }) {\n const { SlackProviderAdapter } = await import(\"./builtin/slack.js\");\n return new SlackProviderAdapter(providerId, config, userName);\n },\n async telegram({ config, providerId, userName }) {\n const { TelegramProviderAdapter } = await import(\"./builtin/telegram.js\");\n return new TelegramProviderAdapter(providerId, config, userName);\n },\n async whatsapp({ config, providerId, userName }) {\n const { WhatsAppProviderAdapter } = await import(\"./builtin/whatsapp.js\");\n return new WhatsAppProviderAdapter(providerId, config, userName);\n },\n async zalo({ config, providerId, userName }) {\n const { ZaloProviderAdapter } = await import(\"./builtin/zalo.js\");\n return new ZaloProviderAdapter(providerId, config, userName);\n },\n} satisfies Record<LazyAdapterId, LazyProviderFactory>;\n\nfunction createDispatchBarrier(): DispatchBarrier {\n let resolveDispatch: (() => void) | undefined;\n const dispatch: DispatchBarrier = {\n promise: new Promise<void>((resolve) => {\n resolveDispatch = resolve;\n }),\n reach() {\n if (dispatch.reached) {\n return;\n }\n dispatch.reached = true;\n resolveDispatch?.();\n },\n reached: false,\n };\n return dispatch;\n}\n\nfunction isLazyAdapter(adapter: BuiltinAdapterId): adapter is LazyAdapterId {\n return Object.hasOwn(LAZY_PROVIDER_FACTORIES, adapter);\n}\n\nfunction createLazyProvider(params: {\n adapter: LazyAdapterId;\n config: ProviderConfig;\n providerId: string;\n userName: string;\n}): ProviderAdapter {\n return new LazyProviderAdapter({\n adapterName: params.adapter,\n factory: () => LAZY_PROVIDER_FACTORIES[params.adapter](params),\n id: params.providerId,\n normalizeTarget: getBuiltinTargetCodec(params.adapter).normalize,\n platform: params.config.platform,\n status: \"ready\",\n supports: params.config.capabilities,\n });\n}\n\nexport class LazyProviderAdapter implements ProviderAdapter {\n readonly id;\n readonly platform;\n readonly status;\n readonly supports;\n\n readonly #factory: ProviderFactory;\n readonly #normalizeTarget: ProviderAdapter[\"normalizeTarget\"];\n readonly #activeWatches = new Set<ActiveWatch>();\n readonly #inFlightOperations = new Set<AdmittedOperation>();\n readonly #providerCleanupErrors: unknown[] = [];\n #cleanedUp = false;\n #cleanupPromise: Promise<void> | null = null;\n #providerCleanupBegun = false;\n #providerInstance: ProviderAdapter | null = null;\n #providerPromise: Promise<ProviderAdapter> | null = null;\n\n constructor(params: {\n adapterName: string;\n factory: ProviderFactory;\n id: string;\n normalizeTarget: ProviderAdapter[\"normalizeTarget\"];\n platform: ProviderAdapter[\"platform\"];\n status: ProviderSupportStatus;\n supports: ProviderAdapter[\"supports\"];\n }) {\n this.#factory = params.factory;\n this.#normalizeTarget = params.normalizeTarget;\n this.id = params.id;\n this.platform = params.platform;\n this.status = params.status;\n this.supports = params.supports;\n }\n\n normalizeTarget(target: ProviderContext[\"fixture\"][\"target\"]) {\n this.#assertActive();\n return this.#normalizeTarget(target);\n }\n\n probe(context: ProviderContext): Promise<ProbeResult> {\n return this.#runOperation((provider) => provider.probe(context), context.signal);\n }\n\n send(context: SendContext): Promise<SendResult> {\n return this.#runOperation((provider) => provider.send(context), context.signal);\n }\n\n waitForInbound(context: WaitContext): Promise<InboundEnvelope | null> {\n return this.#runOperation((provider) => provider.waitForInbound(context), context.signal);\n }\n\n watch(context: WatchContext): AsyncIterable<InboundEnvelope> {\n if (this.#cleanedUp) {\n const error = this.#cleanedUpError();\n return {\n [Symbol.asyncIterator](): AsyncIterator<InboundEnvelope> {\n return {\n next: () => Promise.reject(error),\n };\n },\n };\n }\n const controller = new AbortController();\n const abortFromContext = () => controller.abort(context.signal?.reason);\n if (context.signal?.aborted) {\n abortFromContext();\n } else {\n context.signal?.addEventListener(\"abort\", abortFromContext, { once: true });\n }\n const dispatch = createDispatchBarrier();\n const source = this.#watch(context, controller.signal, dispatch)[Symbol.asyncIterator]();\n let activeWatch: ActiveWatch;\n let closed = false;\n let closePromise: Promise<IteratorResult<InboundEnvelope>> | null = null;\n const finish = () => {\n if (closed) {\n return;\n }\n closed = true;\n context.signal?.removeEventListener(\"abort\", abortFromContext);\n this.#activeWatches.delete(activeWatch);\n };\n const close = () => {\n if (closed) {\n return Promise.resolve({ done: true as const, value: undefined as never });\n }\n closePromise ??= (async () => {\n controller.abort();\n try {\n if (!source.return) {\n finish();\n return { done: true as const, value: undefined as never };\n }\n let result = await source.return();\n while (!result.done) {\n result = await source.next();\n }\n finish();\n return result;\n } catch (error) {\n finish();\n throw error;\n } finally {\n dispatch.reach();\n }\n })();\n const closing = closePromise;\n void closing.then(\n () => {\n if (closePromise === closing) {\n closePromise = null;\n }\n },\n () => {\n if (closePromise === closing) {\n closePromise = null;\n }\n },\n );\n return closing;\n };\n const iterator: AsyncIterableIterator<InboundEnvelope> = {\n async next() {\n try {\n const result = await source.next();\n if (result.done) {\n finish();\n }\n return result;\n } catch (error) {\n finish();\n throw error;\n }\n },\n return: close,\n async throw(error?: unknown) {\n controller.abort();\n try {\n if (source.throw) {\n const result = await source.throw(error);\n if (result.done) {\n finish();\n }\n return result;\n }\n throw error;\n } catch (thrownError) {\n finish();\n throw thrownError;\n }\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n activeWatch = {\n abort: () => controller.abort(),\n close: async () => {\n while (!(await close()).done) {\n // Async iterators may yield final values before acknowledging return.\n }\n },\n dispatch,\n };\n this.#activeWatches.add(activeWatch);\n return iterator;\n }\n\n beginCleanup(): void {\n if (this.#cleanedUp) {\n return;\n }\n this.#cleanedUp = true;\n for (const watch of this.#activeWatches) {\n watch.abort();\n }\n this.#beginProviderCleanupIfReady();\n }\n\n async cleanup(): Promise<void> {\n this.beginCleanup();\n this.#cleanupPromise ??= (async () => {\n const operations = [...this.#inFlightOperations];\n const watches = [...this.#activeWatches];\n const closingWatches = watches.map(async (watch) => await watch.close());\n const providerCleanup = this.#cleanupProvider(\n operations\n .map((operation) => operation.dispatch)\n .concat(watches.map((watch) => watch.dispatch)),\n );\n const [cleanupResult, , watchResults] = await Promise.all([\n providerCleanup.then(\n () => ({ ok: true as const }),\n (error: unknown) => ({ error, ok: false as const }),\n ),\n Promise.allSettled(operations.map((operation) => operation.completion)),\n Promise.allSettled(closingWatches),\n ]);\n const teardownErrors = watchResults.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (!cleanupResult.ok) {\n teardownErrors.unshift(cleanupResult.error);\n }\n if (teardownErrors.length === 1) {\n throw teardownErrors[0];\n }\n if (teardownErrors.length > 1) {\n throw new AggregateError(teardownErrors, \"Provider cleanup failed.\");\n }\n })();\n await this.#cleanupPromise;\n }\n\n async #provider(): Promise<ProviderAdapter> {\n this.#assertActive();\n this.#providerPromise ??= this.#factory()\n .then((provider) => {\n this.#providerInstance = provider;\n this.#beginProviderCleanupIfReady();\n return provider;\n })\n .catch((error: unknown) => {\n this.#providerPromise = null;\n throw error;\n });\n return await this.#providerPromise;\n }\n\n async *#watch(\n context: WatchContext,\n signal: AbortSignal,\n dispatch: DispatchBarrier,\n ): AsyncIterable<InboundEnvelope> {\n try {\n if (signal.aborted) {\n return;\n }\n const provider = await this.#provider();\n if (signal.aborted) {\n return;\n }\n if (!provider.watch) {\n throw new CrablineError(`Provider \"${this.id}\" does not implement watch.`, {\n kind: \"config\",\n });\n }\n dispatch.reach();\n yield* provider.watch({ ...context, signal });\n } finally {\n dispatch.reach();\n }\n }\n\n #assertActive(): void {\n if (this.#cleanedUp) {\n throw this.#cleanedUpError();\n }\n }\n\n async #cleanupProvider(dispatches: readonly DispatchBarrier[]): Promise<void> {\n const pendingDispatches = dispatches\n .filter((dispatch) => !dispatch.reached)\n .map((dispatch) => dispatch.promise);\n if (pendingDispatches.length > 0) {\n await Promise.allSettled(pendingDispatches);\n }\n let provider = this.#providerInstance;\n if (!provider) {\n const providerPromise = this.#providerPromise;\n if (!providerPromise) {\n return;\n }\n provider = await providerPromise;\n }\n if (!provider) {\n return;\n }\n this.#beginProviderCleanup(provider);\n const errors = [...this.#providerCleanupErrors];\n try {\n await provider.cleanup?.();\n } catch (error) {\n errors.push(error);\n }\n if (errors.length === 1) {\n throw errors[0];\n }\n if (errors.length > 1) {\n throw new AggregateError(errors, \"Provider teardown failed.\");\n }\n }\n\n #beginProviderCleanup(provider: ProviderAdapter): void {\n if (this.#providerCleanupBegun) {\n return;\n }\n this.#providerCleanupBegun = true;\n try {\n provider.beginCleanup?.();\n } catch (error) {\n this.#providerCleanupErrors.push(error);\n }\n }\n\n #beginProviderCleanupIfReady(): void {\n const provider = this.#providerInstance;\n if (\n !this.#cleanedUp ||\n !provider ||\n [...this.#inFlightOperations].some((operation) => !operation.dispatch.reached)\n ) {\n return;\n }\n this.#beginProviderCleanup(provider);\n }\n\n #runOperation<T>(\n run: (provider: ProviderAdapter) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n if (this.#cleanedUp) {\n return Promise.reject(this.#cleanedUpError());\n }\n if (signal?.aborted) {\n return Promise.reject(signal.reason ?? new Error(\"Provider operation aborted.\"));\n }\n const dispatch = createDispatchBarrier();\n let rejectCompletion!: (reason?: unknown) => void;\n let resolveCompletion!: (value: T | PromiseLike<T>) => void;\n const completion = new Promise<T>((resolve, reject) => {\n rejectCompletion = reject;\n resolveCompletion = resolve;\n });\n const operation = { completion, dispatch };\n this.#inFlightOperations.add(operation);\n const underlying = (async () => {\n try {\n const provider = await this.#provider();\n if (signal?.aborted) {\n throw signal.reason ?? new Error(\"Provider operation aborted.\");\n }\n const result = run(provider);\n dispatch.reach();\n this.#beginProviderCleanupIfReady();\n return await result;\n } catch (error) {\n dispatch.reach();\n this.#beginProviderCleanupIfReady();\n throw error;\n }\n })();\n void underlying.then(resolveCompletion, rejectCompletion);\n void completion.then(\n () => this.#inFlightOperations.delete(operation),\n () => this.#inFlightOperations.delete(operation),\n );\n return completion;\n }\n\n #cleanedUpError(): CrablineError {\n return new CrablineError(`Provider \"${this.id}\" has been cleaned up.`, { kind: \"config\" });\n }\n}\n\nexport function createRegistry(manifest: ManifestDefinition, manifestPath: string): Registry {\n return {\n catalog: OPENCLAW_SUPPORT_CATALOG,\n resolve(providerId, fixtureId) {\n const fixture = manifest.fixtures.find((entry) => entry.id === fixtureId);\n if (!fixture) {\n throw new CrablineError(`Unknown fixture: ${fixtureId}`, { kind: \"config\" });\n }\n const config = Object.hasOwn(manifest.providers, providerId)\n ? manifest.providers[providerId]\n : undefined;\n if (!config) {\n throw new CrablineError(`Unknown provider: ${providerId}`, { kind: \"config\" });\n }\n if (fixture.provider !== providerId) {\n throw new CrablineError(\n `Fixture \"${fixtureId}\" belongs to provider \"${fixture.provider}\", not \"${providerId}\".`,\n { kind: \"config\" },\n );\n }\n\n if (config.status === \"disabled\") {\n throw new CrablineError(`Provider \"${providerId}\" is disabled.`, { kind: \"config\" });\n }\n if (config.status === \"planned\") {\n throw new CrablineError(`Provider \"${providerId}\" is planned and cannot run.`, {\n kind: \"config\",\n });\n }\n\n const context: ProviderContext = {\n config,\n fixture,\n manifestPath,\n providerId,\n userName: manifest.userName,\n };\n\n if (isLazyAdapter(config.adapter)) {\n return createLazyProvider({\n adapter: config.adapter,\n config,\n providerId,\n userName: manifest.userName,\n });\n }\n\n return new ScriptProviderAdapter(context);\n },\n };\n}\n"]}
|
|
@@ -8,8 +8,13 @@ export type RemoteJwtKeySet<T> = {
|
|
|
8
8
|
expiresAt: number;
|
|
9
9
|
values: readonly T[];
|
|
10
10
|
};
|
|
11
|
+
export declare class JwtKeyInfrastructureError extends Error {
|
|
12
|
+
constructor(message: string, options?: {
|
|
13
|
+
cause?: unknown;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
11
16
|
export declare function readBearerToken(request: Request): string | undefined;
|
|
12
|
-
export declare function resolveHttpCacheExpiry(response: Response,
|
|
17
|
+
export declare function resolveHttpCacheExpiry(response: Response, requestTime: number): number;
|
|
13
18
|
export declare function createCachedJwtKeyResolver<T>(params: {
|
|
14
19
|
fetchKeys(signal: AbortSignal): Promise<RemoteJwtKeySet<T>>;
|
|
15
20
|
keyId(value: T): string | undefined;
|
|
@@ -1,8 +1,37 @@
|
|
|
1
1
|
import { verify } from "node:crypto";
|
|
2
|
+
export class JwtKeyInfrastructureError extends Error {
|
|
3
|
+
constructor(message, options) {
|
|
4
|
+
super(message, options);
|
|
5
|
+
this.name = "JwtKeyInfrastructureError";
|
|
6
|
+
}
|
|
7
|
+
}
|
|
2
8
|
const DEFAULT_KEY_FETCH_TIMEOUT_MS = 5_000;
|
|
3
9
|
const DEFAULT_UNKNOWN_KEY_COOLDOWN_MS = 30_000;
|
|
10
|
+
const MAX_HTTP_CACHE_AGE_SECONDS = 24 * 60 * 60;
|
|
4
11
|
const MAX_NEGATIVE_KEY_IDS = 128;
|
|
12
|
+
const MAX_NODE_TIMER_DELAY_MS = 2_147_483_647;
|
|
13
|
+
const MAX_REMOTE_KEY_SET_SIZE = 128;
|
|
5
14
|
const UTF8_DECODER = new TextDecoder("utf-8", { fatal: true });
|
|
15
|
+
function jwtKeyInfrastructureError(error) {
|
|
16
|
+
return error instanceof JwtKeyInfrastructureError
|
|
17
|
+
? error
|
|
18
|
+
: new JwtKeyInfrastructureError("JWT signing key fetch failed.", { cause: error });
|
|
19
|
+
}
|
|
20
|
+
function requireSafeDuration(value, name, allowZero = false) {
|
|
21
|
+
if (!Number.isSafeInteger(value) ||
|
|
22
|
+
value < (allowZero ? 0 : 1) ||
|
|
23
|
+
value > MAX_NODE_TIMER_DELAY_MS) {
|
|
24
|
+
throw new RangeError(`${name} must be a ${allowZero ? "non-negative" : "positive"} integer no greater than ${MAX_NODE_TIMER_DELAY_MS}.`);
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
function readJwtClock(now) {
|
|
29
|
+
const value = now();
|
|
30
|
+
if (!Number.isFinite(value)) {
|
|
31
|
+
throw new RangeError("JWT clock must return a finite number.");
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
6
35
|
function decodeBase64UrlPart(value, label) {
|
|
7
36
|
if (!/^[A-Za-z0-9_-]+$/u.test(value)) {
|
|
8
37
|
throw new Error(`${label} must use unpadded base64url encoding.`);
|
|
@@ -21,13 +50,25 @@ function decodeJsonPart(value) {
|
|
|
21
50
|
return decoded;
|
|
22
51
|
}
|
|
23
52
|
function readHeader(value) {
|
|
53
|
+
if ("crit" in value) {
|
|
54
|
+
const critical = value.crit;
|
|
55
|
+
if (!Array.isArray(critical) ||
|
|
56
|
+
critical.length === 0 ||
|
|
57
|
+
!critical.every((name) => typeof name === "string" && name.length > 0)) {
|
|
58
|
+
throw new Error("JWT crit header must be a non-empty array of parameter names.");
|
|
59
|
+
}
|
|
60
|
+
throw new Error("JWT critical header parameters are unsupported.");
|
|
61
|
+
}
|
|
24
62
|
if (value.alg !== "RS256" || typeof value.kid !== "string" || !value.kid) {
|
|
25
63
|
throw new Error("JWT must use RS256 and include a key id.");
|
|
26
64
|
}
|
|
27
65
|
return { alg: value.alg, kid: value.kid };
|
|
28
66
|
}
|
|
29
67
|
function hasAudience(claim, expected) {
|
|
30
|
-
return claim === expected ||
|
|
68
|
+
return (claim === expected ||
|
|
69
|
+
(Array.isArray(claim) &&
|
|
70
|
+
claim.every((candidate) => typeof candidate === "string") &&
|
|
71
|
+
claim.includes(expected)));
|
|
31
72
|
}
|
|
32
73
|
function numericClaim(claims, name, required = false) {
|
|
33
74
|
if (!(name in claims)) {
|
|
@@ -47,28 +88,128 @@ export function readBearerToken(request) {
|
|
|
47
88
|
const match = /^Bearer\s+(\S+)$/iu.exec(authorization ?? "");
|
|
48
89
|
return match?.[1];
|
|
49
90
|
}
|
|
50
|
-
|
|
91
|
+
function splitCacheControlDirectives(value) {
|
|
92
|
+
const directives = [];
|
|
93
|
+
let start = 0;
|
|
94
|
+
let quoted = false;
|
|
95
|
+
let escaped = false;
|
|
96
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
97
|
+
const character = value[index];
|
|
98
|
+
if (quoted) {
|
|
99
|
+
if (escaped) {
|
|
100
|
+
escaped = false;
|
|
101
|
+
}
|
|
102
|
+
else if (character === "\\") {
|
|
103
|
+
escaped = true;
|
|
104
|
+
}
|
|
105
|
+
else if (character === '"') {
|
|
106
|
+
quoted = false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else if (character === '"') {
|
|
110
|
+
quoted = true;
|
|
111
|
+
}
|
|
112
|
+
else if (character === ",") {
|
|
113
|
+
directives.push(value.slice(start, index));
|
|
114
|
+
start = index + 1;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (quoted || escaped) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
directives.push(value.slice(start));
|
|
121
|
+
return directives;
|
|
122
|
+
}
|
|
123
|
+
function cacheControlDirectiveName(value) {
|
|
124
|
+
return /^[ \t]*([!#$%&'*+\-.^_`|~0-9A-Za-z]+)/u.exec(value)?.[1]?.toLowerCase();
|
|
125
|
+
}
|
|
126
|
+
export function resolveHttpCacheExpiry(response, requestTime) {
|
|
51
127
|
const cacheControl = response.headers.get("cache-control");
|
|
52
|
-
|
|
53
|
-
|
|
128
|
+
const cacheControlDirectives = splitCacheControlDirectives(cacheControl ?? "");
|
|
129
|
+
if (!cacheControlDirectives) {
|
|
130
|
+
return requestTime;
|
|
131
|
+
}
|
|
132
|
+
if (cacheControlDirectives.some((directive) => {
|
|
133
|
+
const name = cacheControlDirectiveName(directive);
|
|
134
|
+
return name === "no-cache" || name === "no-store";
|
|
135
|
+
})) {
|
|
136
|
+
return requestTime;
|
|
54
137
|
}
|
|
55
138
|
const ageHeader = response.headers.get("age");
|
|
56
139
|
const ageSeconds = ageHeader && /^\d+$/u.test(ageHeader) ? Number.parseInt(ageHeader, 10) : 0;
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
140
|
+
const dateHeader = response.headers.get("date");
|
|
141
|
+
const parsedDate = dateHeader === null ? Number.NaN : Date.parse(dateHeader);
|
|
142
|
+
const dateValue = Number.isFinite(parsedDate) ? parsedDate : undefined;
|
|
143
|
+
const apparentAgeMs = dateValue === undefined ? 0 : Math.max(0, requestTime - dateValue);
|
|
144
|
+
const currentAgeMs = Math.max(apparentAgeMs, ageSeconds * 1_000);
|
|
145
|
+
const maxAgeDirectives = cacheControlDirectives.filter((directive) => cacheControlDirectiveName(directive) === "max-age");
|
|
146
|
+
if (maxAgeDirectives.length > 0) {
|
|
147
|
+
if (maxAgeDirectives.length !== 1) {
|
|
148
|
+
return requestTime;
|
|
149
|
+
}
|
|
150
|
+
const maxAge = /^[ \t]*max-age[ \t]*=[ \t]*(?:"(\d+)"|(\d+))[ \t]*$/iu.exec(maxAgeDirectives[0]);
|
|
151
|
+
if (!maxAge) {
|
|
152
|
+
return requestTime;
|
|
153
|
+
}
|
|
154
|
+
const maxAgeSeconds = Number(maxAge[1] ?? maxAge[2]);
|
|
155
|
+
if (!Number.isSafeInteger(maxAgeSeconds)) {
|
|
156
|
+
return requestTime;
|
|
157
|
+
}
|
|
158
|
+
return (requestTime +
|
|
159
|
+
Math.min(MAX_HTTP_CACHE_AGE_SECONDS * 1_000, Math.max(0, maxAgeSeconds * 1_000 - currentAgeMs)));
|
|
160
|
+
}
|
|
161
|
+
const expiresHeader = response.headers.get("expires");
|
|
162
|
+
if (expiresHeader === null) {
|
|
163
|
+
return requestTime + Math.max(0, 60 * 60 * 1_000 - currentAgeMs);
|
|
164
|
+
}
|
|
165
|
+
const expires = Date.parse(expiresHeader);
|
|
166
|
+
if (!Number.isFinite(expires)) {
|
|
167
|
+
return requestTime;
|
|
60
168
|
}
|
|
61
|
-
const
|
|
62
|
-
return
|
|
63
|
-
|
|
64
|
-
|
|
169
|
+
const freshnessLifetimeMs = Math.max(0, expires - (dateValue ?? requestTime));
|
|
170
|
+
return (requestTime +
|
|
171
|
+
Math.min(MAX_HTTP_CACHE_AGE_SECONDS * 1_000, Math.max(0, freshnessLifetimeMs - currentAgeMs)));
|
|
172
|
+
}
|
|
173
|
+
function validateRemoteJwtKeySet(keySet, keyId) {
|
|
174
|
+
if (!Number.isFinite(keySet.expiresAt)) {
|
|
175
|
+
throw new JwtKeyInfrastructureError("JWT signing key set expiry is invalid.");
|
|
176
|
+
}
|
|
177
|
+
if (!Array.isArray(keySet.values)) {
|
|
178
|
+
throw new JwtKeyInfrastructureError("JWT signing key set values must be an array.");
|
|
179
|
+
}
|
|
180
|
+
if (keySet.values.length === 0) {
|
|
181
|
+
throw new JwtKeyInfrastructureError("JWT signing key set must include at least one key.");
|
|
182
|
+
}
|
|
183
|
+
if (keySet.values.length > MAX_REMOTE_KEY_SET_SIZE) {
|
|
184
|
+
throw new JwtKeyInfrastructureError(`JWT signing key set exceeds the ${MAX_REMOTE_KEY_SET_SIZE}-key limit.`);
|
|
185
|
+
}
|
|
186
|
+
const keyIds = new Set();
|
|
187
|
+
for (const value of keySet.values) {
|
|
188
|
+
let candidateKeyId;
|
|
189
|
+
try {
|
|
190
|
+
candidateKeyId = keyId(value);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
throw new JwtKeyInfrastructureError("JWT signing key id is invalid.", { cause: error });
|
|
194
|
+
}
|
|
195
|
+
if (typeof candidateKeyId !== "string" || candidateKeyId.length === 0) {
|
|
196
|
+
throw new JwtKeyInfrastructureError("JWT signing key id is invalid.");
|
|
197
|
+
}
|
|
198
|
+
if (keyIds.has(candidateKeyId)) {
|
|
199
|
+
throw new JwtKeyInfrastructureError("JWT signing key ids must be unique.");
|
|
200
|
+
}
|
|
201
|
+
keyIds.add(candidateKeyId);
|
|
202
|
+
}
|
|
203
|
+
return { keyIds: [...keyIds], keySet };
|
|
65
204
|
}
|
|
66
205
|
export function createCachedJwtKeyResolver(params) {
|
|
67
|
-
const
|
|
68
|
-
const
|
|
69
|
-
const
|
|
206
|
+
const clock = params.now ?? Date.now;
|
|
207
|
+
const now = () => readJwtClock(clock);
|
|
208
|
+
const refreshCooldownMs = requireSafeDuration(params.refreshCooldownMs ?? DEFAULT_UNKNOWN_KEY_COOLDOWN_MS, "refreshCooldownMs", true);
|
|
209
|
+
const timeoutMs = requireSafeDuration(params.timeoutMs ?? DEFAULT_KEY_FETCH_TIMEOUT_MS, "timeoutMs");
|
|
70
210
|
let cached;
|
|
71
211
|
let fetchInFlight;
|
|
212
|
+
let fetchGeneration = 0;
|
|
72
213
|
let refreshInFlight;
|
|
73
214
|
let refreshCooldownUntil = 0;
|
|
74
215
|
let fetchFailureCooldownUntil = 0;
|
|
@@ -90,54 +231,91 @@ export function createCachedJwtKeyResolver(params) {
|
|
|
90
231
|
throw new Error(params.unknownKeyMessage);
|
|
91
232
|
};
|
|
92
233
|
const fetchKeys = async () => {
|
|
93
|
-
|
|
94
|
-
|
|
234
|
+
let inFlight = fetchInFlight;
|
|
235
|
+
const currentTime = now();
|
|
236
|
+
if (inFlight?.retryAt !== undefined && inFlight.retryAt <= currentTime) {
|
|
237
|
+
if (fetchInFlight?.generation === inFlight.generation) {
|
|
238
|
+
fetchInFlight = undefined;
|
|
239
|
+
}
|
|
240
|
+
inFlight = undefined;
|
|
95
241
|
}
|
|
96
|
-
if (
|
|
97
|
-
|
|
242
|
+
if (!inFlight) {
|
|
243
|
+
if (fetchFailureCooldownUntil > currentTime) {
|
|
244
|
+
throw fetchFailureError;
|
|
245
|
+
}
|
|
246
|
+
const controller = new AbortController();
|
|
247
|
+
const generation = ++fetchGeneration;
|
|
248
|
+
let keyFetch;
|
|
249
|
+
keyFetch = Promise.resolve()
|
|
250
|
+
.then(() => params.fetchKeys(controller.signal))
|
|
251
|
+
.then((keySet) => validateRemoteJwtKeySet(keySet, params.keyId))
|
|
252
|
+
.then(({ keyIds, keySet }) => {
|
|
253
|
+
if (fetchInFlight?.generation !== generation) {
|
|
254
|
+
throw new JwtKeyInfrastructureError("JWT signing key fetch completed after its generation expired.");
|
|
255
|
+
}
|
|
256
|
+
cached = keySet.expiresAt > now() ? keySet : undefined;
|
|
257
|
+
fetchFailureCooldownUntil = 0;
|
|
258
|
+
fetchFailureError = undefined;
|
|
259
|
+
for (const keyId of keyIds) {
|
|
260
|
+
negativeKeyIds.delete(keyId);
|
|
261
|
+
}
|
|
262
|
+
return keySet;
|
|
263
|
+
}, (error) => {
|
|
264
|
+
const infrastructureError = jwtKeyInfrastructureError(error);
|
|
265
|
+
if (fetchInFlight?.generation === generation) {
|
|
266
|
+
fetchFailureCooldownUntil = now() + refreshCooldownMs;
|
|
267
|
+
fetchFailureError = infrastructureError;
|
|
268
|
+
}
|
|
269
|
+
throw infrastructureError;
|
|
270
|
+
})
|
|
271
|
+
.finally(() => {
|
|
272
|
+
if (fetchInFlight?.generation === generation) {
|
|
273
|
+
fetchInFlight = undefined;
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
inFlight = { controller, generation, promise: keyFetch, retryAt: undefined };
|
|
277
|
+
fetchInFlight = inFlight;
|
|
278
|
+
void keyFetch.catch(() => { });
|
|
98
279
|
}
|
|
99
|
-
const controller = new AbortController();
|
|
100
280
|
let timeout;
|
|
101
281
|
const timedOut = new Promise((_, reject) => {
|
|
102
282
|
timeout = setTimeout(() => {
|
|
103
|
-
controller.abort();
|
|
104
|
-
|
|
283
|
+
inFlight.controller.abort();
|
|
284
|
+
const timeoutError = new JwtKeyInfrastructureError("JWT signing key fetch timed out.");
|
|
285
|
+
inFlight.retryAt ??= now() + refreshCooldownMs;
|
|
286
|
+
if (fetchInFlight?.generation === inFlight.generation) {
|
|
287
|
+
fetchFailureCooldownUntil = inFlight.retryAt;
|
|
288
|
+
fetchFailureError = timeoutError;
|
|
289
|
+
}
|
|
290
|
+
reject(timeoutError);
|
|
105
291
|
}, timeoutMs);
|
|
106
292
|
});
|
|
107
|
-
|
|
108
|
-
.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
fetchFailureError = undefined;
|
|
112
|
-
for (const value of keySet.values) {
|
|
113
|
-
const keyId = params.keyId(value);
|
|
114
|
-
if (keyId) {
|
|
115
|
-
negativeKeyIds.delete(keyId);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return keySet;
|
|
119
|
-
})
|
|
120
|
-
.catch((error) => {
|
|
121
|
-
fetchFailureCooldownUntil = now() + refreshCooldownMs;
|
|
122
|
-
fetchFailureError = error;
|
|
123
|
-
throw error;
|
|
124
|
-
})
|
|
125
|
-
.finally(() => {
|
|
293
|
+
try {
|
|
294
|
+
return await Promise.race([inFlight.promise, timedOut]);
|
|
295
|
+
}
|
|
296
|
+
finally {
|
|
126
297
|
if (timeout) {
|
|
127
298
|
clearTimeout(timeout);
|
|
128
299
|
}
|
|
129
|
-
|
|
130
|
-
});
|
|
131
|
-
return await fetchInFlight;
|
|
300
|
+
}
|
|
132
301
|
};
|
|
133
302
|
return async (header) => {
|
|
134
303
|
const currentTime = now();
|
|
304
|
+
const freshCache = cached && cached.expiresAt > currentTime ? cached : undefined;
|
|
305
|
+
if (!freshCache && cached) {
|
|
306
|
+
const refreshed = await fetchKeys();
|
|
307
|
+
const refreshedKey = refreshed.values.find((candidate) => params.keyId(candidate) === header.kid);
|
|
308
|
+
if (refreshedKey) {
|
|
309
|
+
return refreshedKey;
|
|
310
|
+
}
|
|
311
|
+
refreshCooldownUntil = now() + refreshCooldownMs;
|
|
312
|
+
return rejectUnknownKey(header.kid, refreshCooldownUntil);
|
|
313
|
+
}
|
|
135
314
|
const negativeExpiry = negativeKeyIds.get(header.kid);
|
|
136
315
|
if (negativeExpiry && negativeExpiry > currentTime) {
|
|
137
316
|
throw new Error(params.unknownKeyMessage);
|
|
138
317
|
}
|
|
139
318
|
negativeKeyIds.delete(header.kid);
|
|
140
|
-
const freshCache = cached && cached.expiresAt > currentTime ? cached : undefined;
|
|
141
319
|
const keySet = freshCache ?? (await fetchKeys());
|
|
142
320
|
const key = keySet.values.find((candidate) => params.keyId(candidate) === header.kid);
|
|
143
321
|
if (key) {
|
|
@@ -151,12 +329,22 @@ export function createCachedJwtKeyResolver(params) {
|
|
|
151
329
|
refreshed = await refreshInFlight;
|
|
152
330
|
}
|
|
153
331
|
else {
|
|
154
|
-
|
|
155
|
-
|
|
332
|
+
if (refreshCooldownUntil > now()) {
|
|
333
|
+
if (fetchFailureCooldownUntil > now() && fetchFailureError) {
|
|
334
|
+
throw fetchFailureError;
|
|
335
|
+
}
|
|
156
336
|
return rejectUnknownKey(header.kid, refreshCooldownUntil);
|
|
157
337
|
}
|
|
158
|
-
|
|
159
|
-
|
|
338
|
+
refreshInFlight = Promise.resolve()
|
|
339
|
+
.then(fetchKeys)
|
|
340
|
+
.then((refreshedKeySet) => {
|
|
341
|
+
refreshCooldownUntil = now() + refreshCooldownMs;
|
|
342
|
+
return refreshedKeySet;
|
|
343
|
+
}, (error) => {
|
|
344
|
+
refreshCooldownUntil = now() + refreshCooldownMs;
|
|
345
|
+
throw error;
|
|
346
|
+
})
|
|
347
|
+
.finally(() => {
|
|
160
348
|
refreshInFlight = undefined;
|
|
161
349
|
});
|
|
162
350
|
refreshed = await refreshInFlight;
|
|
@@ -181,14 +369,17 @@ export async function verifySignedJwt(params) {
|
|
|
181
369
|
if (!verify("RSA-SHA256", Buffer.from(`${encodedHeader}.${encodedClaims}`), key, signature)) {
|
|
182
370
|
throw new Error("JWT signature is invalid.");
|
|
183
371
|
}
|
|
184
|
-
if (!params.issuers.includes(
|
|
372
|
+
if (typeof claims.iss !== "string" || !params.issuers.includes(claims.iss)) {
|
|
185
373
|
throw new Error("JWT issuer is invalid.");
|
|
186
374
|
}
|
|
187
375
|
if (!hasAudience(claims.aud, params.audience)) {
|
|
188
376
|
throw new Error("JWT audience is invalid.");
|
|
189
377
|
}
|
|
190
|
-
const now = Math.floor((params.now
|
|
378
|
+
const now = Math.floor(readJwtClock(params.now ?? Date.now) / 1000);
|
|
191
379
|
const skew = params.clockSkewSeconds ?? 300;
|
|
380
|
+
if (!Number.isFinite(skew) || skew < 0) {
|
|
381
|
+
throw new Error("JWT clock skew must be a finite non-negative number.");
|
|
382
|
+
}
|
|
192
383
|
const expiresAt = numericClaim(claims, "exp", true);
|
|
193
384
|
if (expiresAt <= now - skew) {
|
|
194
385
|
throw new Error("JWT is expired.");
|