shardwire 0.2.0 → 1.0.0
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 +127 -266
- package/dist/index.d.mts +262 -129
- package/dist/index.d.ts +262 -129
- package/dist/index.js +1615 -942
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1616 -930
- package/dist/index.mjs.map +1 -1
- package/package.json +22 -34
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transport/ws/consumer-socket.ts","../src/utils/id.ts","../src/utils/backoff.ts","../src/utils/logger.ts","../src/core/protocol.ts","../src/runtime/validation.ts","../src/consumer/index.ts","../src/discord/client.ts","../src/runtime/reliability.ts","../src/transport/ws/host-server.ts","../src/runtime/security.ts","../src/host/index.ts","../src/schema/index.ts","../src/schema/zod.ts","../src/index.ts"],"sourcesContent":["import { WebSocket } from \"ws\";\n\nexport interface WebSocketLike {\n readyState: number;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n on(event: \"open\", listener: () => void): void;\n on(event: \"message\", listener: (data: unknown) => void): void;\n on(event: \"close\", listener: () => void): void;\n on(event: \"error\", listener: (error: unknown) => void): void;\n once(event: \"close\", listener: () => void): void;\n}\n\nexport function createNodeWebSocket(url: string): WebSocketLike {\n return new WebSocket(url) as unknown as WebSocketLike;\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function createRequestId(): string {\n return randomUUID();\n}\n\nexport function createConnectionId(): string {\n return randomUUID();\n}\n","export interface BackoffConfig {\n initialDelayMs: number;\n maxDelayMs: number;\n jitter: boolean;\n}\n\nexport function getBackoffDelay(attempt: number, config: BackoffConfig): number {\n const base = Math.min(config.maxDelayMs, config.initialDelayMs * 2 ** attempt);\n if (!config.jitter) {\n return base;\n }\n const spread = Math.floor(base * 0.2);\n const min = Math.max(0, base - spread);\n const max = base + spread;\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","import type { ShardwireLogger } from \"../core/types\";\n\nexport function withLogger(logger?: ShardwireLogger): Required<ShardwireLogger> {\n return {\n debug: logger?.debug ?? (() => undefined),\n info: logger?.info ?? (() => undefined),\n warn: logger?.warn ?? (() => undefined),\n error: logger?.error ?? (() => undefined),\n };\n}\n","import type { CommandResult } from \"./types\";\n\nexport const PROTOCOL_VERSION = 1 as const;\n\nexport type WireType =\n | \"auth.hello\"\n | \"auth.ok\"\n | \"auth.error\"\n | \"command.request\"\n | \"command.result\"\n | \"command.error\"\n | \"event.emit\"\n | \"ping\"\n | \"pong\";\n\nexport type WireEnvelope<TType extends WireType = WireType, TPayload = unknown> = {\n v: typeof PROTOCOL_VERSION;\n type: TType;\n ts: number;\n requestId?: string;\n source?: string;\n payload: TPayload;\n};\n\nexport interface AuthHelloPayload {\n secret: string;\n secretId?: string;\n clientName?: string;\n}\n\nexport interface AuthOkPayload {\n connectionId: string;\n}\n\nexport interface AuthErrorPayload {\n code: \"UNAUTHORIZED\";\n reason: \"unknown_secret_id\" | \"invalid_secret\";\n message: string;\n}\n\nexport interface CommandRequestPayload {\n name: string;\n data: unknown;\n}\n\nexport interface EventEmitPayload {\n name: string;\n data: unknown;\n}\n\nexport type CommandResultPayload = CommandResult;\n\nexport function makeEnvelope<TType extends WireType, TPayload>(\n type: TType,\n payload: TPayload,\n extras?: { requestId?: string; source?: string },\n): WireEnvelope<TType, TPayload> {\n const envelope: WireEnvelope<TType, TPayload> = {\n v: PROTOCOL_VERSION,\n type,\n ts: Date.now(),\n payload,\n };\n if (extras?.requestId) {\n envelope.requestId = extras.requestId;\n }\n if (extras?.source) {\n envelope.source = extras.source;\n }\n return envelope;\n}\n\nexport function parseEnvelope(raw: string): WireEnvelope {\n const parsed = JSON.parse(raw) as WireEnvelope;\n if (!parsed || parsed.v !== PROTOCOL_VERSION || typeof parsed.type !== \"string\") {\n throw new Error(\"Invalid wire envelope.\");\n }\n return parsed;\n}\n\nexport function stringifyEnvelope(envelope: WireEnvelope): string {\n return JSON.stringify(envelope);\n}\n","import type { ConsumerOptions, HostOptions, RuntimeSchema, SchemaValidationIssue } from \"../core/types\";\n\nexport class PayloadValidationError extends Error {\n constructor(\n message: string,\n public readonly details: {\n name: string;\n stage: \"command.request\" | \"command.response\" | \"event.emit\";\n issues?: SchemaValidationIssue[];\n },\n ) {\n super(message);\n this.name = \"PayloadValidationError\";\n }\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction assertPositiveNumber(name: string, value: unknown): void {\n if (typeof value !== \"number\" || Number.isNaN(value) || value <= 0) {\n throw new Error(`${name} must be a positive number.`);\n }\n}\n\nexport function assertHostOptions(options: HostOptions<Record<string, unknown>, Record<string, unknown>>): void {\n if (!options.server) {\n throw new Error(\"Host mode requires a server configuration.\");\n }\n assertPositiveNumber(\"server.port\", options.server.port);\n if (!Array.isArray(options.server.secrets) || options.server.secrets.length === 0) {\n throw new Error(\"server.secrets must contain at least one secret.\");\n }\n for (const [index, secret] of options.server.secrets.entries()) {\n if (!isNonEmptyString(secret)) {\n throw new Error(`server.secrets[${index}] must be a non-empty string.`);\n }\n }\n if (\n options.server.primarySecretId !== undefined &&\n !options.server.secrets.some((_, index) => options.server.primarySecretId === `s${index}`)\n ) {\n throw new Error(\"server.primarySecretId must reference an existing secret id.\");\n }\n if (options.server.heartbeatMs !== undefined) {\n assertPositiveNumber(\"server.heartbeatMs\", options.server.heartbeatMs);\n }\n if (options.server.commandTimeoutMs !== undefined) {\n assertPositiveNumber(\"server.commandTimeoutMs\", options.server.commandTimeoutMs);\n }\n if (options.server.maxPayloadBytes !== undefined) {\n assertPositiveNumber(\"server.maxPayloadBytes\", options.server.maxPayloadBytes);\n }\n}\n\nexport function assertConsumerOptions(options: ConsumerOptions): void {\n if (!isNonEmptyString(options.url)) {\n throw new Error(\"Consumer mode requires `url`.\");\n }\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(options.url);\n } catch {\n throw new Error(\"Consumer option `url` must be a valid URL.\");\n }\n if (parsedUrl.protocol !== \"ws:\" && parsedUrl.protocol !== \"wss:\") {\n throw new Error(\"Consumer option `url` must use `ws://` or `wss://`.\");\n }\n const isLoopbackHost =\n parsedUrl.hostname === \"localhost\" || parsedUrl.hostname === \"127.0.0.1\" || parsedUrl.hostname === \"::1\";\n if (parsedUrl.protocol === \"ws:\" && !isLoopbackHost && !options.allowInsecureWs) {\n throw new Error(\n \"Insecure `ws://` is only allowed for loopback hosts by default. Use `wss://` or set `allowInsecureWs` to true.\",\n );\n }\n if (!isNonEmptyString(options.secret)) {\n throw new Error(\"Consumer mode requires `secret`.\");\n }\n if (options.secretId !== undefined && !isNonEmptyString(options.secretId)) {\n throw new Error(\"Consumer option `secretId` must be a non-empty string.\");\n }\n if (options.clientName !== undefined && !isNonEmptyString(options.clientName)) {\n throw new Error(\"Consumer option `clientName` must be a non-empty string.\");\n }\n if (options.requestTimeoutMs !== undefined) {\n assertPositiveNumber(\"requestTimeoutMs\", options.requestTimeoutMs);\n }\n if (options.reconnect?.initialDelayMs !== undefined) {\n assertPositiveNumber(\"reconnect.initialDelayMs\", options.reconnect.initialDelayMs);\n }\n if (options.reconnect?.maxDelayMs !== undefined) {\n assertPositiveNumber(\"reconnect.maxDelayMs\", options.reconnect.maxDelayMs);\n }\n}\n\nexport function assertMessageName(kind: \"command\" | \"event\", name: string): void {\n if (!isNonEmptyString(name)) {\n throw new Error(`${kind} name must be a non-empty string.`);\n }\n}\n\nexport function assertJsonPayload(kind: \"command\" | \"event\", name: string, payload: unknown): void {\n try {\n JSON.stringify(payload);\n } catch {\n throw new Error(`${kind} \"${name}\" payload must be JSON-serializable.`);\n }\n}\n\nfunction normalizeSchemaIssues(error: unknown): SchemaValidationIssue[] | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const issues = (error as { issues?: unknown }).issues;\n if (!Array.isArray(issues)) {\n return undefined;\n }\n const normalized = issues\n .map((issue) => {\n if (!issue || typeof issue !== \"object\") {\n return null;\n }\n const message = (issue as { message?: unknown }).message;\n const rawPath = (issue as { path?: unknown }).path;\n if (typeof message !== \"string\") {\n return null;\n }\n const path =\n Array.isArray(rawPath) && rawPath.length > 0\n ? rawPath\n .map((segment) => (typeof segment === \"string\" || typeof segment === \"number\" ? String(segment) : \"\"))\n .filter(Boolean)\n .join(\".\")\n : \"\";\n return { path, message } satisfies SchemaValidationIssue;\n })\n .filter((issue): issue is SchemaValidationIssue => Boolean(issue));\n return normalized.length > 0 ? normalized : undefined;\n}\n\nexport function parsePayloadWithSchema<T>(\n schema: RuntimeSchema<T> | undefined,\n payload: unknown,\n context: {\n name: string;\n stage: \"command.request\" | \"command.response\" | \"event.emit\";\n },\n): T | unknown {\n if (!schema) {\n return payload;\n }\n try {\n return schema.parse(payload);\n } catch (error) {\n const message =\n error instanceof Error && error.message.trim().length > 0\n ? error.message\n : `Payload validation failed for ${context.stage} \"${context.name}\".`;\n const issues = normalizeSchemaIssues(error);\n throw new PayloadValidationError(message, {\n ...context,\n ...(issues ? { issues } : {}),\n });\n }\n}\n","import type {\n CommandFailure,\n CommandMap,\n CommandRequestOf,\n CommandResponseOf,\n CommandResult,\n ConsumerOptions,\n ConsumerShardwire,\n EventMap,\n EventMeta,\n} from \"../core/types\";\nimport { createNodeWebSocket, type WebSocketLike } from \"../transport/ws/consumer-socket\";\nimport { createRequestId } from \"../utils/id\";\nimport { getBackoffDelay } from \"../utils/backoff\";\nimport { withLogger } from \"../utils/logger\";\nimport {\n makeEnvelope,\n parseEnvelope,\n stringifyEnvelope,\n type AuthErrorPayload,\n type CommandResultPayload,\n type EventEmitPayload,\n} from \"../core/protocol\";\nimport { assertJsonPayload, assertMessageName } from \"../runtime/validation\";\n\ntype EventHandler = (payload: unknown, meta: EventMeta) => void;\n\ninterface PendingRequest {\n resolve: (value: CommandResult) => void;\n reject: (error: CommandRequestError) => void;\n timer: NodeJS.Timeout;\n}\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10000;\n\nclass CommandRequestError extends Error {\n constructor(\n public readonly code: \"TIMEOUT\" | \"DISCONNECTED\" | \"UNAUTHORIZED\",\n message: string,\n ) {\n super(message);\n this.name = \"CommandRequestError\";\n }\n}\n\nexport function createConsumerShardwire<C extends CommandMap, E extends EventMap>(\n options: ConsumerOptions,\n): ConsumerShardwire<C, E> {\n const logger = withLogger(options.logger);\n const reconnectEnabled = options.reconnect?.enabled ?? true;\n const initialDelayMs = options.reconnect?.initialDelayMs ?? 500;\n const maxDelayMs = options.reconnect?.maxDelayMs ?? 10000;\n const jitter = options.reconnect?.jitter ?? true;\n const requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n\n let socket: WebSocketLike | null = null;\n let isClosed = false;\n let isAuthed = false;\n let reconnectAttempts = 0;\n let reconnectTimer: NodeJS.Timeout | null = null;\n let connectPromise: Promise<void> | null = null;\n let connectResolve: (() => void) | null = null;\n let connectReject: ((error: Error) => void) | null = null;\n let authTimeoutTimer: NodeJS.Timeout | null = null;\n let currentConnectionId: string | null = null;\n\n const pendingRequests = new Map<string, PendingRequest>();\n const eventHandlers = new Map<string, Set<EventHandler>>();\n const connectedHandlers = new Set<(info: { connectionId: string; connectedAt: number }) => void>();\n const disconnectedHandlers = new Set<\n (info: { reason: string; at: number; willReconnect: boolean }) => void\n >();\n const reconnectingHandlers = new Set<(info: { attempt: number; delayMs: number; at: number }) => void>();\n\n function clearAuthTimeout(): void {\n if (authTimeoutTimer) {\n clearTimeout(authTimeoutTimer);\n authTimeoutTimer = null;\n }\n }\n\n function resolveConnect(): void {\n clearAuthTimeout();\n connectResolve?.();\n connectResolve = null;\n connectReject = null;\n connectPromise = null;\n }\n\n function rejectConnect(message: string): void {\n clearAuthTimeout();\n if (connectReject) {\n connectReject(new Error(message));\n }\n connectResolve = null;\n connectReject = null;\n connectPromise = null;\n }\n\n function sendRaw(data: string): void {\n if (!socket || socket.readyState !== 1) {\n throw new Error(\"Shardwire consumer is not connected.\");\n }\n socket.send(data);\n }\n\n function rejectAllPending(\n code: \"TIMEOUT\" | \"DISCONNECTED\" | \"UNAUTHORIZED\",\n reason: string,\n ): void {\n for (const [requestId, pending] of pendingRequests.entries()) {\n clearTimeout(pending.timer);\n pending.reject(new CommandRequestError(code, reason));\n pendingRequests.delete(requestId);\n }\n }\n\n function scheduleReconnect(): void {\n if (isClosed || !reconnectEnabled || reconnectTimer) {\n return;\n }\n const delay = getBackoffDelay(reconnectAttempts, { initialDelayMs, maxDelayMs, jitter });\n reconnectAttempts += 1;\n for (const handler of reconnectingHandlers) {\n try {\n handler({ attempt: reconnectAttempts, delayMs: delay, at: Date.now() });\n } catch (error) {\n logger.warn(\"Reconnect handler threw an error.\", { error: String(error) });\n }\n }\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n void connect().catch((error) => {\n logger.warn(\"Reconnect attempt failed.\", { error: String(error) });\n });\n }, delay);\n }\n\n function handleEvent(name: string, payload: unknown, meta: EventMeta): void {\n const handlers = eventHandlers.get(name);\n if (!handlers || handlers.size === 0) {\n return;\n }\n for (const handler of handlers) {\n try {\n handler(payload, meta);\n } catch (error) {\n logger.warn(\"Event handler threw an error.\", { name, error: String(error) });\n }\n }\n }\n\n async function connect(): Promise<void> {\n if (isClosed) {\n return;\n }\n if (socket && socket.readyState === 1 && isAuthed) {\n return;\n }\n if (connectPromise) {\n return connectPromise;\n }\n\n connectPromise = new Promise<void>((resolve, reject) => {\n connectResolve = resolve;\n connectReject = reject;\n });\n\n socket = options.webSocketFactory\n ? (options.webSocketFactory(options.url) as WebSocketLike)\n : createNodeWebSocket(options.url);\n\n socket.on(\"open\", () => {\n reconnectAttempts = 0;\n isAuthed = false;\n currentConnectionId = null;\n const hello = makeEnvelope(\"auth.hello\", {\n secret: options.secret,\n secretId: options.secretId,\n clientName: options.clientName,\n });\n socket?.send(stringifyEnvelope(hello));\n authTimeoutTimer = setTimeout(() => {\n if (!isAuthed) {\n rejectConnect(\"Shardwire auth timed out.\");\n socket?.close();\n }\n }, requestTimeoutMs);\n });\n\n socket.on(\"message\", (raw) => {\n try {\n const serialized = typeof raw === \"string\" ? raw : String(raw);\n const envelope = parseEnvelope(serialized);\n switch (envelope.type) {\n case \"auth.ok\":\n isAuthed = true;\n if (\n envelope.payload &&\n typeof envelope.payload === \"object\" &&\n \"connectionId\" in envelope.payload &&\n typeof (envelope.payload as { connectionId?: unknown }).connectionId === \"string\"\n ) {\n currentConnectionId = (envelope.payload as { connectionId: string }).connectionId;\n }\n if (currentConnectionId) {\n for (const handler of connectedHandlers) {\n try {\n handler({ connectionId: currentConnectionId, connectedAt: Date.now() });\n } catch (error) {\n logger.warn(\"Connected handler threw an error.\", { error: String(error) });\n }\n }\n }\n resolveConnect();\n break;\n case \"auth.error\": {\n const payload = envelope.payload as AuthErrorPayload;\n logger.error(\"Authentication failed for consumer.\", {\n code: payload.code,\n message: payload.message,\n });\n rejectConnect(payload.message);\n rejectAllPending(\"UNAUTHORIZED\", \"Shardwire authentication failed.\");\n socket?.close();\n break;\n }\n case \"command.result\":\n case \"command.error\": {\n const requestId = envelope.requestId;\n if (!requestId) {\n return;\n }\n const pending = pendingRequests.get(requestId);\n if (!pending) {\n return;\n }\n clearTimeout(pending.timer);\n pending.resolve(envelope.payload as CommandResultPayload);\n pendingRequests.delete(requestId);\n break;\n }\n case \"event.emit\": {\n const payload = envelope.payload as EventEmitPayload;\n const meta: EventMeta = { ts: envelope.ts };\n if (envelope.source) {\n meta.source = envelope.source;\n }\n handleEvent(payload.name, payload.data, meta);\n break;\n }\n case \"ping\":\n sendRaw(stringifyEnvelope(makeEnvelope(\"pong\", {})));\n break;\n default:\n break;\n }\n } catch (error) {\n logger.warn(\"Failed to parse consumer message.\", { error: String(error) });\n }\n });\n\n socket.on(\"close\", () => {\n const willReconnect = !isClosed && reconnectEnabled;\n rejectConnect(\"Shardwire connection closed.\");\n isAuthed = false;\n currentConnectionId = null;\n rejectAllPending(\"DISCONNECTED\", \"Shardwire connection closed before command completed.\");\n for (const handler of disconnectedHandlers) {\n try {\n handler({\n reason: \"Shardwire connection closed.\",\n at: Date.now(),\n willReconnect,\n });\n } catch (error) {\n logger.warn(\"Disconnected handler threw an error.\", { error: String(error) });\n }\n }\n if (!isClosed) {\n scheduleReconnect();\n }\n });\n\n socket.on(\"error\", (error) => {\n logger.warn(\"Consumer socket error.\", { error: String(error) });\n });\n\n return connectPromise;\n }\n\n void connect().catch((error) => {\n logger.warn(\"Initial connection attempt failed.\", { error: String(error) });\n });\n\n return {\n mode: \"consumer\",\n async send<K extends keyof C & string>(\n name: K,\n payload: CommandRequestOf<C[K]>,\n sendOptions?: { timeoutMs?: number; requestId?: string },\n ): Promise<CommandResult<CommandResponseOf<C[K]>>> {\n assertMessageName(\"command\", name);\n assertJsonPayload(\"command\", name, payload);\n if (!isAuthed) {\n try {\n await connect();\n } catch (error) {\n return {\n ok: false,\n requestId: sendOptions?.requestId ?? \"unknown\",\n ts: Date.now(),\n error: {\n code: \"UNAUTHORIZED\",\n message: error instanceof Error ? error.message : \"Failed to authenticate.\",\n },\n } satisfies CommandFailure;\n }\n }\n if (!socket || socket.readyState !== 1) {\n return {\n ok: false,\n requestId: sendOptions?.requestId ?? \"unknown\",\n ts: Date.now(),\n error: {\n code: \"DISCONNECTED\",\n message: \"Not connected to Shardwire host.\",\n },\n } satisfies CommandFailure;\n }\n\n const requestId = sendOptions?.requestId ?? createRequestId();\n const timeoutMs = sendOptions?.timeoutMs ?? requestTimeoutMs;\n\n const promise = new Promise<CommandResult>((resolve, reject) => {\n const timer = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(new CommandRequestError(\"TIMEOUT\", `Command \"${name}\" timed out after ${timeoutMs}ms.`));\n }, timeoutMs);\n\n pendingRequests.set(requestId, {\n resolve,\n reject: (error) => reject(error),\n timer,\n });\n });\n\n sendRaw(\n stringifyEnvelope(\n makeEnvelope(\n \"command.request\",\n {\n name,\n data: payload,\n },\n { requestId },\n ),\n ),\n );\n\n try {\n return (await promise) as CommandResult<CommandResponseOf<C[K]>>;\n } catch (error) {\n const failureCode =\n error instanceof CommandRequestError\n ? error.code\n : !socket || socket.readyState !== 1\n ? \"DISCONNECTED\"\n : \"TIMEOUT\";\n return {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code: failureCode,\n message: error instanceof Error ? error.message : \"Command request failed.\",\n },\n } satisfies CommandFailure;\n }\n },\n on(name, handler) {\n assertMessageName(\"event\", name);\n const casted = handler as EventHandler;\n const existing = eventHandlers.get(name);\n if (existing) {\n existing.add(casted);\n } else {\n eventHandlers.set(name, new Set<EventHandler>([casted]));\n }\n return () => {\n const handlers = eventHandlers.get(name);\n if (!handlers) {\n return;\n }\n handlers.delete(casted);\n if (handlers.size === 0) {\n eventHandlers.delete(name);\n }\n };\n },\n off(name, handler) {\n assertMessageName(\"event\", name);\n const handlers = eventHandlers.get(name);\n if (!handlers) {\n return;\n }\n handlers.delete(handler as EventHandler);\n if (handlers.size === 0) {\n eventHandlers.delete(name);\n }\n },\n onConnected(handler) {\n connectedHandlers.add(handler);\n return () => {\n connectedHandlers.delete(handler);\n };\n },\n onDisconnected(handler) {\n disconnectedHandlers.add(handler);\n return () => {\n disconnectedHandlers.delete(handler);\n };\n },\n onReconnecting(handler) {\n reconnectingHandlers.add(handler);\n return () => {\n reconnectingHandlers.delete(handler);\n };\n },\n ready() {\n return connect();\n },\n connected() {\n return Boolean(socket && socket.readyState === 1 && isAuthed);\n },\n connectionId() {\n return currentConnectionId;\n },\n async close() {\n isClosed = true;\n isAuthed = false;\n currentConnectionId = null;\n rejectConnect(\"Shardwire consumer has been closed.\");\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n rejectAllPending(\"DISCONNECTED\", \"Shardwire consumer has been closed.\");\n if (!socket) {\n return;\n }\n await new Promise<void>((resolve) => {\n const current = socket;\n if (!current) {\n resolve();\n return;\n }\n current.once(\"close\", () => resolve());\n current.close();\n });\n socket = null;\n },\n };\n}\n","import type { DiscordClientLike, HostOptions } from \"../core/types\";\n\ninterface OwnedClientState {\n client?: DiscordClientLike;\n owned: boolean;\n}\n\nexport async function resolveDiscordClient<C extends Record<string, unknown>, E extends Record<string, unknown>>(\n options: HostOptions<C, E>,\n): Promise<OwnedClientState> {\n if (options.client) {\n return { client: options.client, owned: false };\n }\n\n if (!options.token) {\n return { owned: false };\n }\n\n const discordModule = await import(\"discord.js\");\n const created = new discordModule.Client({\n intents: [],\n });\n await created.login(options.token);\n return { client: created as unknown as DiscordClientLike, owned: true };\n}\n","export async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n timeoutMessage = \"Operation timed out.\",\n): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(timeoutMessage));\n }, timeoutMs);\n\n promise\n .then((value) => {\n clearTimeout(timeout);\n resolve(value);\n })\n .catch((error) => {\n clearTimeout(timeout);\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n });\n}\n\nexport class DedupeCache<T> {\n private readonly cache = new Map<string, { value: T; expiresAt: number }>();\n\n constructor(private readonly ttlMs: number) {}\n\n get(key: string): T | undefined {\n const entry = this.cache.get(key);\n if (!entry) {\n return undefined;\n }\n if (entry.expiresAt <= Date.now()) {\n this.cache.delete(key);\n return undefined;\n }\n return entry.value;\n }\n\n set(key: string, value: T): void {\n this.cache.set(key, { value, expiresAt: Date.now() + this.ttlMs });\n }\n}\n","import { WebSocketServer, type WebSocket } from \"ws\";\nimport type { IncomingMessage } from \"node:http\";\nimport {\n makeEnvelope,\n parseEnvelope,\n stringifyEnvelope,\n type AuthHelloPayload,\n type CommandRequestPayload,\n type EventEmitPayload,\n type WireEnvelope,\n} from \"../../core/protocol\";\nimport type { CommandFailure, CommandSuccess, HostOptions, ShardwireLogger } from \"../../core/types\";\nimport { withLogger } from \"../../utils/logger\";\nimport { createConnectionId } from \"../../utils/id\";\nimport type { HostConnectionState } from \"../../runtime/state\";\nimport { getSecretId, isSecretValid } from \"../../runtime/security\";\n\nconst CLOSE_AUTH_REQUIRED = 4001;\nconst CLOSE_AUTH_FAILED = 4003;\nconst CLOSE_INVALID_PAYLOAD = 4004;\n\ninterface HostServerConfig {\n options: HostOptions<Record<string, unknown>, Record<string, unknown>>;\n onCommandRequest: (\n connection: HostConnectionState,\n payload: CommandRequestPayload,\n requestId: string,\n source?: string,\n ) => Promise<CommandSuccess | CommandFailure>;\n}\n\nexport class HostWebSocketServer {\n private readonly wss: WebSocketServer;\n private readonly connections = new Map<WebSocket, HostConnectionState>();\n private readonly logger: Required<ShardwireLogger>;\n private readonly heartbeatMs: number;\n private readonly authTimeoutMs = 5000;\n private readonly interval: NodeJS.Timeout;\n\n constructor(private readonly config: HostServerConfig) {\n const serverConfig = config.options.server;\n this.heartbeatMs = serverConfig.heartbeatMs ?? 30000;\n this.logger = withLogger(config.options.logger);\n\n this.wss = new WebSocketServer({\n host: serverConfig.host,\n port: serverConfig.port,\n path: serverConfig.path ?? \"/shardwire\",\n maxPayload: serverConfig.maxPayloadBytes ?? 65536,\n });\n\n this.wss.on(\"connection\", (socket, request) => this.handleConnection(socket, request));\n this.wss.on(\"error\", (error) =>\n this.logger.error(\"Shardwire host server error.\", { error: String(error) }),\n );\n\n this.interval = setInterval(() => {\n this.checkHeartbeats();\n }, this.heartbeatMs);\n }\n\n emitEvent(name: string, data: unknown, source?: string): void {\n const envelope = makeEnvelope(\n \"event.emit\",\n { name, data } satisfies EventEmitPayload,\n source ? { source } : undefined,\n );\n const raw = stringifyEnvelope(envelope);\n\n for (const state of this.connections.values()) {\n if (!state.authenticated) {\n continue;\n }\n this.safeSend(state.socket, raw);\n }\n }\n\n async close(): Promise<void> {\n clearInterval(this.interval);\n for (const connection of this.connections.values()) {\n connection.socket.close();\n }\n this.connections.clear();\n await new Promise<void>((resolve, reject) => {\n this.wss.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n }\n\n private handleConnection(socket: WebSocket, request: IncomingMessage): void {\n const allowlist = this.config.options.server.corsOrigins;\n if (allowlist && allowlist.length > 0) {\n const origin = request.headers.origin;\n if (!origin || !allowlist.includes(origin)) {\n socket.close(CLOSE_AUTH_FAILED, \"Origin not allowed.\");\n return;\n }\n }\n\n const state: HostConnectionState = {\n id: createConnectionId(),\n socket,\n authenticated: false,\n lastHeartbeatAt: Date.now(),\n };\n this.connections.set(socket, state);\n\n const authTimer = setTimeout(() => {\n if (!state.authenticated) {\n socket.close(CLOSE_AUTH_REQUIRED, \"Authentication required.\");\n }\n }, this.authTimeoutMs);\n\n socket.on(\"message\", (raw) => {\n const serialized =\n typeof raw === \"string\" ? raw : Buffer.isBuffer(raw) ? raw.toString(\"utf8\") : undefined;\n if (!serialized) {\n this.logger.warn(\"Invalid message payload from client.\", { error: \"Unsupported payload type.\" });\n socket.close(CLOSE_INVALID_PAYLOAD, \"Invalid payload.\");\n return;\n }\n let parsed: WireEnvelope;\n try {\n parsed = parseEnvelope(serialized);\n } catch (error) {\n this.logger.warn(\"Invalid message payload from client.\", { error: String(error) });\n socket.close(CLOSE_INVALID_PAYLOAD, \"Invalid payload.\");\n return;\n }\n void this.handleMessage(state, parsed).catch((error: unknown) => {\n this.logger.warn(\"Invalid message payload from client.\", { error: String(error) });\n socket.close(CLOSE_INVALID_PAYLOAD, \"Invalid payload.\");\n });\n });\n\n socket.on(\"close\", () => {\n clearTimeout(authTimer);\n this.connections.delete(socket);\n });\n\n socket.on(\"error\", (error) =>\n this.logger.warn(\"Socket error.\", { connectionId: state.id, error: String(error) }),\n );\n }\n\n private async handleMessage(state: HostConnectionState, envelope: WireEnvelope): Promise<void> {\n if (envelope.type === \"ping\") {\n state.lastHeartbeatAt = Date.now();\n this.safeSend(state.socket, stringifyEnvelope(makeEnvelope(\"pong\", {})));\n return;\n }\n if (envelope.type === \"pong\") {\n state.lastHeartbeatAt = Date.now();\n return;\n }\n\n if (!state.authenticated) {\n if (envelope.type !== \"auth.hello\") {\n state.socket.close(CLOSE_AUTH_REQUIRED, \"Authentication required.\");\n return;\n }\n\n const payload = envelope.payload as AuthHelloPayload;\n const providedSecret = payload?.secret;\n const knownSecrets = this.config.options.server.secrets;\n const secretId = payload?.secretId;\n let authReason: \"unknown_secret_id\" | \"invalid_secret\" | null = null;\n\n if (!providedSecret) {\n authReason = \"invalid_secret\";\n } else if (secretId) {\n const secretIndex = knownSecrets.findIndex((_, index) => getSecretId(index) === secretId);\n if (secretIndex < 0) {\n authReason = \"unknown_secret_id\";\n } else {\n const expectedSecret = knownSecrets[secretIndex];\n if (!expectedSecret || !isSecretValid(providedSecret, expectedSecret)) {\n authReason = \"invalid_secret\";\n }\n }\n } else if (!knownSecrets.some((secret) => isSecretValid(providedSecret, secret))) {\n authReason = \"invalid_secret\";\n }\n\n if (authReason) {\n this.safeSend(\n state.socket,\n stringifyEnvelope(\n makeEnvelope(\"auth.error\", {\n code: \"UNAUTHORIZED\",\n reason: authReason,\n message: \"Authentication failed.\",\n }),\n ),\n );\n state.socket.close(CLOSE_AUTH_FAILED, \"Invalid secret.\");\n return;\n }\n\n state.authenticated = true;\n state.lastHeartbeatAt = Date.now();\n if (payload.clientName) {\n state.clientName = payload.clientName;\n }\n this.safeSend(\n state.socket,\n stringifyEnvelope(makeEnvelope(\"auth.ok\", { connectionId: state.id })),\n );\n return;\n }\n\n if (envelope.type === \"command.request\") {\n const payload = envelope.payload as CommandRequestPayload;\n if (!envelope.requestId || !payload?.name) {\n const invalid: CommandFailure = {\n ok: false,\n requestId: envelope.requestId ?? \"unknown\",\n ts: Date.now(),\n error: {\n code: \"VALIDATION_ERROR\",\n message: \"Invalid command request envelope.\",\n },\n };\n this.safeSend(\n state.socket,\n stringifyEnvelope(makeEnvelope(\"command.error\", invalid, { requestId: invalid.requestId })),\n );\n return;\n }\n\n const response = await this.config.onCommandRequest(\n state,\n payload,\n envelope.requestId,\n envelope.source,\n );\n const responseType = response.ok ? \"command.result\" : \"command.error\";\n this.safeSend(\n state.socket,\n stringifyEnvelope(makeEnvelope(responseType, response, { requestId: response.requestId })),\n );\n return;\n }\n }\n\n private checkHeartbeats(): void {\n const now = Date.now();\n const threshold = this.heartbeatMs * 2;\n\n for (const state of this.connections.values()) {\n if (!state.authenticated) {\n continue;\n }\n\n if (now - state.lastHeartbeatAt > threshold) {\n state.socket.terminate();\n this.connections.delete(state.socket);\n continue;\n }\n\n this.safeSend(state.socket, stringifyEnvelope(makeEnvelope(\"ping\", {})));\n }\n }\n\n private safeSend(socket: WebSocket, payload: string): void {\n if (socket.readyState === 1) {\n socket.send(payload);\n }\n }\n}\n","import { timingSafeEqual } from \"node:crypto\";\n\nexport function isSecretValid(provided: string, expected: string): boolean {\n const providedBuffer = Buffer.from(provided);\n const expectedBuffer = Buffer.from(expected);\n\n if (providedBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return timingSafeEqual(providedBuffer, expectedBuffer);\n}\n\nexport function getSecretId(secretIndex: number): string {\n return `s${secretIndex}`;\n}\n","import type {\n CommandContext,\n CommandFailure,\n CommandMap,\n CommandSuccess,\n EventMap,\n HostOptions,\n HostShardwire,\n} from \"../core/types\";\nimport { withTimeout, DedupeCache } from \"../runtime/reliability\";\nimport type { CommandHandler } from \"../runtime/state\";\nimport { HostWebSocketServer } from \"../transport/ws/host-server\";\nimport {\n assertJsonPayload,\n assertMessageName,\n parsePayloadWithSchema,\n PayloadValidationError,\n} from \"../runtime/validation\";\n\nconst DEFAULT_COMMAND_TIMEOUT_MS = 10000;\n\nexport function createHostShardwire<C extends CommandMap, E extends EventMap>(\n options: HostOptions<C, E>,\n runtimeHooks?: {\n onClose?: () => Promise<void> | void;\n },\n): HostShardwire<C, E> {\n const commandHandlers = new Map<string, CommandHandler>();\n const commandTimeoutMs = options.server.commandTimeoutMs ?? DEFAULT_COMMAND_TIMEOUT_MS;\n const dedupeCache = new DedupeCache<CommandSuccess | CommandFailure>(commandTimeoutMs * 2);\n\n const hostServer = new HostWebSocketServer({\n options,\n onCommandRequest: async (connection, payload, requestId, source) => {\n const cacheKey = `${connection.id}:${requestId}:${payload.name}`;\n const cached = dedupeCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const handler = commandHandlers.get(payload.name);\n if (!handler) {\n const failure: CommandFailure = {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code: \"COMMAND_NOT_FOUND\",\n message: `No command handler registered for \"${payload.name}\".`,\n },\n };\n dedupeCache.set(cacheKey, failure);\n return failure;\n }\n\n const context: CommandContext = {\n requestId,\n connectionId: connection.id,\n receivedAt: Date.now(),\n };\n if (source) {\n context.source = source;\n }\n\n try {\n const commandValidation = options.validation?.commands?.[payload.name];\n const validatedRequest = parsePayloadWithSchema(commandValidation?.request, payload.data, {\n name: payload.name,\n stage: \"command.request\",\n });\n\n const maybePromise = Promise.resolve(handler(validatedRequest, context));\n const value = await withTimeout(\n maybePromise,\n commandTimeoutMs,\n `Command \"${payload.name}\" timed out after ${commandTimeoutMs}ms.`,\n );\n const validatedResponse = parsePayloadWithSchema(commandValidation?.response, value, {\n name: payload.name,\n stage: \"command.response\",\n });\n const success: CommandSuccess = {\n ok: true,\n requestId,\n ts: Date.now(),\n data: validatedResponse,\n };\n dedupeCache.set(cacheKey, success);\n return success;\n } catch (error) {\n if (error instanceof PayloadValidationError) {\n const failure: CommandFailure = {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code: \"VALIDATION_ERROR\",\n message: error.message,\n details: error.details,\n },\n };\n dedupeCache.set(cacheKey, failure);\n return failure;\n }\n const isTimeout = error instanceof Error && /timed out/i.test(error.message);\n const failure: CommandFailure = {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code: isTimeout ? \"TIMEOUT\" : \"INTERNAL_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown command execution error.\",\n },\n };\n dedupeCache.set(cacheKey, failure);\n return failure;\n }\n },\n });\n\n return {\n mode: \"host\",\n onCommand(name, handler) {\n assertMessageName(\"command\", name);\n commandHandlers.set(name, handler as CommandHandler);\n return () => {\n commandHandlers.delete(name);\n };\n },\n emitEvent(name, payload) {\n assertMessageName(\"event\", name);\n const validatedPayload = parsePayloadWithSchema(options.validation?.events?.[name], payload, {\n name,\n stage: \"event.emit\",\n });\n assertJsonPayload(\"event\", name, validatedPayload);\n hostServer.emitEvent(name, validatedPayload, options.name);\n },\n broadcast(name, payload) {\n assertMessageName(\"event\", name);\n const validatedPayload = parsePayloadWithSchema(options.validation?.events?.[name], payload, {\n name,\n stage: \"event.emit\",\n });\n assertJsonPayload(\"event\", name, validatedPayload);\n hostServer.emitEvent(name, validatedPayload, options.name);\n },\n close() {\n return hostServer.close().then(async () => {\n await runtimeHooks?.onClose?.();\n });\n },\n };\n}\n","import type { RuntimeSchema, SchemaValidationIssue } from \"../core/types\";\n\nexport interface SafeParseResultSuccess<T> {\n success: true;\n data: T;\n}\n\nexport interface SafeParseResultFailure {\n success: false;\n error: {\n message: string;\n issues?: SchemaValidationIssue[];\n };\n}\n\nexport type SafeParseResult<T> = SafeParseResultSuccess<T> | SafeParseResultFailure;\n\nexport interface SafeParseSchema<T> {\n safeParse: (value: unknown) => SafeParseResult<T>;\n}\n\nexport function fromSafeParseSchema<T>(schema: SafeParseSchema<T>): RuntimeSchema<T> {\n return {\n parse(value) {\n const result = schema.safeParse(value);\n if (result.success) {\n return result.data;\n }\n const error = new Error(result.error.message) as Error & { issues?: SchemaValidationIssue[] };\n if (result.error.issues) {\n error.issues = result.error.issues;\n }\n throw error;\n },\n };\n}\n","import type { RuntimeSchema, SchemaValidationIssue } from \"../core/types\";\nimport { fromSafeParseSchema } from \"./index\";\nimport type { ZodType } from \"zod\";\n\nfunction normalizeZodPath(path: ReadonlyArray<PropertyKey>): string {\n if (path.length === 0) {\n return \"\";\n }\n return path\n .filter((segment): segment is string | number => typeof segment === \"string\" || typeof segment === \"number\")\n .map((segment) => String(segment))\n .join(\".\");\n}\n\nexport function fromZodSchema<T>(schema: ZodType<T>): RuntimeSchema<T> {\n return fromSafeParseSchema<T>({\n safeParse(value) {\n const result = schema.safeParse(value);\n if (result.success) {\n return { success: true, data: result.data };\n }\n const issues: SchemaValidationIssue[] = result.error.issues.map((issue) => ({\n path: normalizeZodPath(issue.path),\n message: issue.message,\n }));\n return {\n success: false,\n error: {\n message: \"Schema validation failed.\",\n issues,\n },\n };\n },\n });\n}\n","import { createConsumerShardwire } from \"./consumer\";\nimport { resolveDiscordClient } from \"./discord/client\";\nimport { createHostShardwire } from \"./host\";\nimport { assertConsumerOptions, assertHostOptions } from \"./runtime/validation\";\nimport type {\n CommandMap,\n ConsumerOptions,\n ConsumerShardwire,\n EventMap,\n HostOptions,\n HostShardwire,\n} from \"./core/types\";\n\nfunction isHostOptions<C extends CommandMap, E extends EventMap>(\n options: HostOptions<C, E> | ConsumerOptions,\n): options is HostOptions<C, E> {\n return \"server\" in options;\n}\n\nexport function createShardwire<C extends CommandMap = {}, E extends EventMap = {}>(\n options: HostOptions<C, E>,\n): HostShardwire<C, E>;\nexport function createShardwire<C extends CommandMap = {}, E extends EventMap = {}>(\n options: ConsumerOptions,\n): ConsumerShardwire<C, E>;\nexport function createShardwire<C extends CommandMap = {}, E extends EventMap = {}>(\n options: HostOptions<C, E> | ConsumerOptions,\n): HostShardwire<C, E> | ConsumerShardwire<C, E> {\n if (!isHostOptions(options)) {\n assertConsumerOptions(options);\n return createConsumerShardwire<C, E>(options);\n }\n assertHostOptions(options);\n\n let ownedClientPromise: Promise<{ destroy: () => void } | undefined> | undefined;\n\n if (!options.client && options.token) {\n ownedClientPromise = resolveDiscordClient(options)\n .then((state) => {\n if (!state.owned || !state.client) {\n return undefined;\n }\n return {\n destroy: () => state.client?.destroy(),\n };\n })\n .catch((error) => {\n options.logger?.error?.(\"Failed to initialize discord.js client from token.\", {\n error: String(error),\n });\n return undefined;\n });\n }\n\n return createHostShardwire<C, E>(options, {\n onClose: async () => {\n const owned = await ownedClientPromise;\n owned?.destroy();\n },\n });\n}\n\nexport { fromSafeParseSchema } from \"./schema\";\nexport { fromZodSchema } from \"./schema/zod\";\n\nexport type {\n CommandContext,\n CommandFailure,\n CommandMap,\n CommandRequestOf,\n CommandResult,\n CommandResponseOf,\n CommandSchema,\n CommandSuccess,\n ConsumerOptions,\n ConsumerShardwire,\n CreateShardwire,\n DiscordClientLike,\n EventMap,\n EventMeta,\n HostOptions,\n HostShardwire,\n RuntimeSchema,\n SchemaValidationIssue,\n ShardwireLogger,\n Unsubscribe,\n} from \"./core/types\";\n"],"mappings":"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","names":["failure"]}
|
|
1
|
+
{"version":3,"sources":["../src/discord/catalog.ts","../src/discord/runtime/adapter.ts","../src/discord/runtime/discordjs-adapter.ts","../src/utils/logger.ts","../src/utils/cache.ts","../src/discord/runtime/serializers.ts","../src/bridge/transport/server.ts","../src/utils/id.ts","../src/bridge/subscriptions.ts","../src/bridge/transport/security.ts","../src/bridge/transport/protocol.ts","../src/bridge/validation.ts","../src/bot/index.ts","../src/discord/types.ts","../src/bridge/transport/socket.ts","../src/utils/backoff.ts","../src/app/index.ts"],"sourcesContent":["import { GatewayIntentBits } from \"discord.js\";\nimport type { BotActionName, BotEventName, BotIntentName } from \"./types\";\n\nexport const BOT_EVENT_NAMES = [\n \"ready\",\n \"interactionCreate\",\n \"messageCreate\",\n \"messageUpdate\",\n \"messageDelete\",\n \"guildMemberAdd\",\n \"guildMemberRemove\",\n] as const satisfies readonly BotEventName[];\n\nexport const BOT_ACTION_NAMES = [\n \"sendMessage\",\n \"editMessage\",\n \"deleteMessage\",\n \"replyToInteraction\",\n \"deferInteraction\",\n \"followUpInteraction\",\n \"banMember\",\n \"kickMember\",\n \"addMemberRole\",\n \"removeMemberRole\",\n] as const satisfies readonly BotActionName[];\n\nexport const BOT_INTENT_BITS: Record<BotIntentName, number> = {\n Guilds: GatewayIntentBits.Guilds,\n GuildMembers: GatewayIntentBits.GuildMembers,\n GuildMessages: GatewayIntentBits.GuildMessages,\n MessageContent: GatewayIntentBits.MessageContent,\n};\n\nconst EVENT_REQUIRED_INTENTS: Record<BotEventName, readonly BotIntentName[]> = {\n ready: [],\n interactionCreate: [\"Guilds\"],\n messageCreate: [\"GuildMessages\"],\n messageUpdate: [\"GuildMessages\"],\n messageDelete: [\"GuildMessages\"],\n guildMemberAdd: [\"GuildMembers\"],\n guildMemberRemove: [\"GuildMembers\"],\n};\n\nexport function getAvailableEvents(intents: readonly BotIntentName[]): BotEventName[] {\n const enabled = new Set(intents);\n return BOT_EVENT_NAMES.filter((eventName) => EVENT_REQUIRED_INTENTS[eventName].every((intent) => enabled.has(intent)));\n}\n","import type {\n BotActionName,\n BotActionPayloadMap,\n BotActionResultDataMap,\n BotEventName,\n BotEventPayloadMap,\n BotIntentName,\n ShardwireLogger,\n Unsubscribe,\n} from \"../types\";\n\nexport interface DiscordRuntimeOptions {\n token: string;\n intents: readonly BotIntentName[];\n logger?: ShardwireLogger;\n}\n\nexport interface DiscordRuntimeAdapter {\n ready(): Promise<void>;\n close(): Promise<void>;\n isReady(): boolean;\n on<K extends BotEventName>(name: K, handler: (payload: BotEventPayloadMap[K]) => void): Unsubscribe;\n executeAction<K extends BotActionName>(\n name: K,\n payload: BotActionPayloadMap[K],\n ): Promise<BotActionResultDataMap[K]>;\n}\n\nexport class ActionExecutionError extends Error {\n constructor(\n public readonly code: \"FORBIDDEN\" | \"NOT_FOUND\" | \"INVALID_REQUEST\" | \"INTERNAL_ERROR\",\n message: string,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = \"ActionExecutionError\";\n }\n}\n","import type { APIAllowedMentions, APIEmbed, Snowflake } from \"discord-api-types/v10\";\nimport {\n Client,\n type GuildMember,\n type Interaction,\n type Message,\n MessageFlags,\n type PartialMessage,\n type PartialGuildMember,\n} from \"discord.js\";\nimport { BOT_INTENT_BITS } from \"../catalog\";\nimport type {\n BotActionName,\n BotActionPayloadMap,\n BotActionResultDataMap,\n BotEventName,\n BotEventPayloadMap,\n BridgeMessageInput,\n Unsubscribe,\n} from \"../types\";\nimport { withLogger } from \"../../utils/logger\";\nimport { DedupeCache } from \"../../utils/cache\";\nimport { ActionExecutionError, type DiscordRuntimeAdapter, type DiscordRuntimeOptions } from \"./adapter\";\nimport {\n serializeDeletedMessage,\n serializeGuildMember,\n serializeInteraction,\n serializeMessage,\n serializeUser,\n} from \"./serializers\";\n\ntype ReplyCapableInteraction = Interaction & {\n replied: boolean;\n deferred: boolean;\n reply(options: unknown): Promise<unknown>;\n deferReply(options?: unknown): Promise<unknown>;\n followUp(options: unknown): Promise<unknown>;\n};\n\ninterface SendCapableChannel {\n send(options: BridgeMessageInput): Promise<Message>;\n}\n\ninterface MessageManageableChannel extends SendCapableChannel {\n messages: {\n fetch(messageId: Snowflake): Promise<Message | PartialMessage>;\n };\n}\n\nfunction isSendCapableChannel(channel: unknown): channel is SendCapableChannel {\n return Boolean(channel && typeof (channel as { send?: unknown }).send === \"function\");\n}\n\nfunction isMessageManageableChannel(channel: unknown): channel is MessageManageableChannel {\n if (!isSendCapableChannel(channel)) {\n return false;\n }\n const messages = (channel as { messages?: { fetch?: unknown } }).messages;\n return Boolean(messages && typeof messages.fetch === \"function\");\n}\n\nfunction toSendOptions(input: BridgeMessageInput): {\n content?: string;\n embeds?: APIEmbed[];\n allowedMentions?: APIAllowedMentions;\n} {\n return {\n ...(input.content !== undefined ? { content: input.content } : {}),\n ...(input.embeds !== undefined ? { embeds: input.embeds } : {}),\n ...(input.allowedMentions !== undefined ? { allowedMentions: input.allowedMentions } : {}),\n };\n}\n\nexport class DiscordJsRuntimeAdapter implements DiscordRuntimeAdapter {\n private readonly client: Client;\n private readonly logger;\n private readonly interactionCache = new DedupeCache<ReplyCapableInteraction>(15 * 60 * 1000);\n private readyPromise: Promise<void> | null = null;\n private hasReady = false;\n\n constructor(private readonly options: DiscordRuntimeOptions) {\n const intentBits = options.intents.map((intent) => BOT_INTENT_BITS[intent]);\n this.logger = withLogger(options.logger);\n this.client = new Client({\n intents: intentBits,\n });\n this.client.once(\"ready\", () => {\n this.hasReady = true;\n });\n }\n\n isReady(): boolean {\n return this.hasReady && this.client.isReady();\n }\n\n ready(): Promise<void> {\n if (this.readyPromise) {\n return this.readyPromise;\n }\n if (this.isReady()) {\n return Promise.resolve();\n }\n this.readyPromise = new Promise<void>((resolve, reject) => {\n const onReady = () => {\n cleanup();\n this.hasReady = true;\n resolve();\n };\n const onError = (error: unknown) => {\n cleanup();\n reject(error instanceof Error ? error : new Error(String(error)));\n };\n const cleanup = () => {\n this.client.off(\"ready\", onReady);\n this.client.off(\"error\", onError);\n };\n\n this.client.once(\"ready\", onReady);\n this.client.once(\"error\", onError);\n void this.client.login(this.options.token).catch((error: unknown) => {\n cleanup();\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n });\n return this.readyPromise;\n }\n\n async close(): Promise<void> {\n this.client.removeAllListeners();\n await this.client.destroy();\n this.readyPromise = null;\n this.hasReady = false;\n }\n\n on<K extends BotEventName>(name: K, handler: (payload: BotEventPayloadMap[K]) => void): Unsubscribe {\n switch (name) {\n case \"ready\": {\n const listener = () => {\n if (!this.client.user) {\n return;\n }\n handler({\n receivedAt: Date.now(),\n user: serializeUser(this.client.user),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(\"ready\", listener);\n if (this.client.isReady() && this.client.user) {\n listener();\n }\n return () => {\n this.client.off(\"ready\", listener);\n };\n }\n case \"interactionCreate\": {\n const listener = (interaction: Interaction) => {\n if (isReplyCapableInteraction(interaction)) {\n this.interactionCache.set(interaction.id, interaction);\n }\n handler({\n receivedAt: Date.now(),\n interaction: serializeInteraction(interaction),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(\"interactionCreate\", listener);\n return () => {\n this.client.off(\"interactionCreate\", listener);\n };\n }\n case \"messageCreate\": {\n const listener = (message: Message) => {\n handler({\n receivedAt: Date.now(),\n message: serializeMessage(message),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(\"messageCreate\", listener);\n return () => {\n this.client.off(\"messageCreate\", listener);\n };\n }\n case \"messageUpdate\": {\n const listener = (oldMessage: Message | PartialMessage, newMessage: Message | PartialMessage) => {\n handler({\n receivedAt: Date.now(),\n oldMessage: serializeMessage(oldMessage),\n message: serializeMessage(newMessage),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(\"messageUpdate\", listener);\n return () => {\n this.client.off(\"messageUpdate\", listener);\n };\n }\n case \"messageDelete\": {\n const listener = (message: Message | PartialMessage) => {\n handler({\n receivedAt: Date.now(),\n message: serializeDeletedMessage(message),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(\"messageDelete\", listener);\n return () => {\n this.client.off(\"messageDelete\", listener);\n };\n }\n case \"guildMemberAdd\": {\n const listener = (member: GuildMember) => {\n handler({\n receivedAt: Date.now(),\n member: serializeGuildMember(member),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(\"guildMemberAdd\", listener);\n return () => {\n this.client.off(\"guildMemberAdd\", listener);\n };\n }\n case \"guildMemberRemove\": {\n const listener = (member: GuildMember | PartialGuildMember) => {\n handler({\n receivedAt: Date.now(),\n member: serializeGuildMember(member),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(\"guildMemberRemove\", listener);\n return () => {\n this.client.off(\"guildMemberRemove\", listener);\n };\n }\n default:\n return () => undefined;\n }\n }\n\n async executeAction<K extends BotActionName>(\n name: K,\n payload: BotActionPayloadMap[K],\n ): Promise<BotActionResultDataMap[K]> {\n await this.ready();\n try {\n switch (name) {\n case \"sendMessage\":\n return (await this.sendMessage(payload as BotActionPayloadMap[\"sendMessage\"])) as BotActionResultDataMap[K];\n case \"editMessage\":\n return (await this.editMessage(payload as BotActionPayloadMap[\"editMessage\"])) as BotActionResultDataMap[K];\n case \"deleteMessage\":\n return (await this.deleteMessage(payload as BotActionPayloadMap[\"deleteMessage\"])) as BotActionResultDataMap[K];\n case \"replyToInteraction\":\n return (await this.replyToInteraction(payload as BotActionPayloadMap[\"replyToInteraction\"])) as BotActionResultDataMap[K];\n case \"deferInteraction\":\n return (await this.deferInteraction(payload as BotActionPayloadMap[\"deferInteraction\"])) as BotActionResultDataMap[K];\n case \"followUpInteraction\":\n return (await this.followUpInteraction(payload as BotActionPayloadMap[\"followUpInteraction\"])) as BotActionResultDataMap[K];\n case \"banMember\":\n return (await this.banMember(payload as BotActionPayloadMap[\"banMember\"])) as BotActionResultDataMap[K];\n case \"kickMember\":\n return (await this.kickMember(payload as BotActionPayloadMap[\"kickMember\"])) as BotActionResultDataMap[K];\n case \"addMemberRole\":\n return (await this.addMemberRole(payload as BotActionPayloadMap[\"addMemberRole\"])) as BotActionResultDataMap[K];\n case \"removeMemberRole\":\n return (await this.removeMemberRole(payload as BotActionPayloadMap[\"removeMemberRole\"])) as BotActionResultDataMap[K];\n default:\n throw new ActionExecutionError(\"INVALID_REQUEST\", `Unsupported action \"${String(name)}\".`);\n }\n } catch (error) {\n if (error instanceof ActionExecutionError) {\n throw error;\n }\n this.logger.error(\"Discord action execution failed.\", { action: name, error: String(error) });\n throw new ActionExecutionError(\"INTERNAL_ERROR\", error instanceof Error ? error.message : \"Discord action failed.\");\n }\n }\n\n private async fetchSendableChannel(channelId: Snowflake): Promise<SendCapableChannel> {\n const channel = await this.client.channels.fetch(channelId);\n if (!isSendCapableChannel(channel)) {\n throw new ActionExecutionError(\"NOT_FOUND\", `Channel \"${channelId}\" cannot send messages.`);\n }\n return channel;\n }\n\n private async fetchMessageChannel(channelId: Snowflake): Promise<MessageManageableChannel> {\n const channel = await this.client.channels.fetch(channelId);\n if (!isMessageManageableChannel(channel)) {\n throw new ActionExecutionError(\"NOT_FOUND\", `Channel \"${channelId}\" does not support message operations.`);\n }\n return channel;\n }\n\n private getInteraction(interactionId: Snowflake): ReplyCapableInteraction {\n const interaction = this.interactionCache.get(interactionId);\n if (!interaction) {\n throw new ActionExecutionError(\"NOT_FOUND\", `Interaction \"${interactionId}\" is no longer available.`);\n }\n return interaction;\n }\n\n private async sendMessage(payload: BotActionPayloadMap[\"sendMessage\"]) {\n const channel = await this.fetchSendableChannel(payload.channelId);\n const message = await channel.send(toSendOptions(payload));\n return serializeMessage(message);\n }\n\n private async editMessage(payload: BotActionPayloadMap[\"editMessage\"]) {\n const channel = await this.fetchMessageChannel(payload.channelId);\n const message = await channel.messages.fetch(payload.messageId);\n const edited = await message.edit(toSendOptions(payload));\n return serializeMessage(edited);\n }\n\n private async deleteMessage(payload: BotActionPayloadMap[\"deleteMessage\"]) {\n const channel = await this.fetchMessageChannel(payload.channelId);\n const message = await channel.messages.fetch(payload.messageId);\n await message.delete();\n return {\n deleted: true,\n channelId: payload.channelId,\n messageId: payload.messageId,\n } as const;\n }\n\n private async replyToInteraction(payload: BotActionPayloadMap[\"replyToInteraction\"]) {\n const interaction = this.getInteraction(payload.interactionId);\n if (interaction.replied || interaction.deferred) {\n throw new ActionExecutionError(\"INVALID_REQUEST\", `Interaction \"${payload.interactionId}\" has already been acknowledged.`);\n }\n const reply = await interaction.reply({\n ...toSendOptions(payload),\n fetchReply: true,\n ...(payload.ephemeral ? { flags: MessageFlags.Ephemeral } : {}),\n });\n return serializeMessage(reply as Message);\n }\n\n private async deferInteraction(payload: BotActionPayloadMap[\"deferInteraction\"]) {\n const interaction = this.getInteraction(payload.interactionId);\n if (interaction.replied) {\n throw new ActionExecutionError(\"INVALID_REQUEST\", `Interaction \"${payload.interactionId}\" has already been replied to.`);\n }\n if (!interaction.deferred) {\n await interaction.deferReply({\n ...(payload.ephemeral ? { flags: MessageFlags.Ephemeral } : {}),\n });\n }\n return {\n deferred: true,\n interactionId: payload.interactionId,\n } as const;\n }\n\n private async followUpInteraction(payload: BotActionPayloadMap[\"followUpInteraction\"]) {\n const interaction = this.getInteraction(payload.interactionId);\n if (!interaction.replied && !interaction.deferred) {\n throw new ActionExecutionError(\"INVALID_REQUEST\", `Interaction \"${payload.interactionId}\" has not been acknowledged yet.`);\n }\n const followUp = await interaction.followUp({\n ...toSendOptions(payload),\n ...(payload.ephemeral ? { flags: MessageFlags.Ephemeral } : {}),\n });\n return serializeMessage(followUp as Message);\n }\n\n private async banMember(payload: BotActionPayloadMap[\"banMember\"]) {\n const guild = await this.client.guilds.fetch(payload.guildId);\n await guild.members.ban(payload.userId, {\n ...(payload.reason ? { reason: payload.reason } : {}),\n ...(payload.deleteMessageSeconds !== undefined ? { deleteMessageSeconds: payload.deleteMessageSeconds } : {}),\n });\n return {\n guildId: payload.guildId,\n userId: payload.userId,\n };\n }\n\n private async kickMember(payload: BotActionPayloadMap[\"kickMember\"]) {\n const guild = await this.client.guilds.fetch(payload.guildId);\n const member = await guild.members.fetch(payload.userId);\n await member.kick(payload.reason);\n return {\n guildId: payload.guildId,\n userId: payload.userId,\n };\n }\n\n private async addMemberRole(payload: BotActionPayloadMap[\"addMemberRole\"]) {\n const guild = await this.client.guilds.fetch(payload.guildId);\n const member = await guild.members.fetch(payload.userId);\n await member.roles.add(payload.roleId, payload.reason);\n const refreshed = await member.fetch();\n return serializeGuildMember(refreshed);\n }\n\n private async removeMemberRole(payload: BotActionPayloadMap[\"removeMemberRole\"]) {\n const guild = await this.client.guilds.fetch(payload.guildId);\n const member = await guild.members.fetch(payload.userId);\n await member.roles.remove(payload.roleId, payload.reason);\n const refreshed = await member.fetch();\n return serializeGuildMember(refreshed);\n }\n}\n\nexport function createDiscordJsRuntimeAdapter(options: DiscordRuntimeOptions): DiscordRuntimeAdapter {\n return new DiscordJsRuntimeAdapter(options);\n}\n\nfunction isReplyCapableInteraction(interaction: Interaction): interaction is ReplyCapableInteraction {\n return (\n interaction.isRepliable() &&\n typeof (interaction as { reply?: unknown }).reply === \"function\" &&\n typeof (interaction as { deferReply?: unknown }).deferReply === \"function\" &&\n typeof (interaction as { followUp?: unknown }).followUp === \"function\"\n );\n}\n","import type { ShardwireLogger } from \"../discord/types\";\n\nexport function withLogger(logger?: ShardwireLogger): Required<ShardwireLogger> {\n return {\n debug: logger?.debug ?? (() => undefined),\n info: logger?.info ?? (() => undefined),\n warn: logger?.warn ?? (() => undefined),\n error: logger?.error ?? (() => undefined),\n };\n}\n","export class DedupeCache<T> {\n private readonly cache = new Map<string, { value: T; expiresAt: number }>();\n\n constructor(private readonly ttlMs: number) {}\n\n get(key: string): T | undefined {\n const entry = this.cache.get(key);\n if (!entry) {\n return undefined;\n }\n if (entry.expiresAt <= Date.now()) {\n this.cache.delete(key);\n return undefined;\n }\n return entry.value;\n }\n\n set(key: string, value: T): void {\n this.cache.set(key, { value, expiresAt: Date.now() + this.ttlMs });\n }\n}\n","import type { APIEmbed } from \"discord-api-types/v10\";\nimport type {\n AnySelectMenuInteraction,\n ChatInputCommandInteraction,\n GuildMember,\n Interaction,\n Message,\n ModalSubmitInteraction,\n PartialGuildMember,\n PartialMessage,\n User,\n} from \"discord.js\";\nimport type {\n BridgeDeletedMessage,\n BridgeGuildMember,\n BridgeInteraction,\n BridgeMessage,\n BridgeUser,\n} from \"../types\";\n\nfunction serializeEmbeds(message: Message | PartialMessage): APIEmbed[] {\n return message.embeds.map((embed) => embed.toJSON());\n}\n\nexport function serializeUser(user: User): BridgeUser {\n return {\n id: user.id,\n username: user.username,\n discriminator: user.discriminator,\n ...(user.globalName !== undefined ? { globalName: user.globalName } : {}),\n avatarUrl: user.displayAvatarURL() || null,\n bot: user.bot,\n system: user.system ?? false,\n };\n}\n\nexport function serializeGuildMember(member: GuildMember | PartialGuildMember): BridgeGuildMember {\n return {\n id: member.id,\n guildId: member.guild.id,\n ...(\"user\" in member && member.user ? { user: serializeUser(member.user) } : {}),\n ...(\"displayName\" in member && typeof member.displayName === \"string\" ? { displayName: member.displayName } : {}),\n ...(\"nickname\" in member ? { nickname: member.nickname ?? null } : {}),\n roles: \"roles\" in member && \"cache\" in member.roles ? [...member.roles.cache.keys()] : [],\n ...(\"joinedAt\" in member ? { joinedAt: member.joinedAt?.toISOString() ?? null } : {}),\n ...(\"premiumSince\" in member ? { premiumSince: member.premiumSince?.toISOString() ?? null } : {}),\n ...(\"pending\" in member && typeof member.pending === \"boolean\" ? { pending: member.pending } : {}),\n ...(\n \"communicationDisabledUntil\" in member\n ? { communicationDisabledUntil: member.communicationDisabledUntil?.toISOString() ?? null }\n : {}\n ),\n };\n}\n\nexport function serializeMessage(message: Message | PartialMessage): BridgeMessage {\n const reference = message.reference\n ? {\n ...(message.reference.messageId ? { messageId: message.reference.messageId } : {}),\n ...(message.reference.channelId ? { channelId: message.reference.channelId } : {}),\n ...(message.reference.guildId ? { guildId: message.reference.guildId } : {}),\n }\n : undefined;\n\n return {\n id: message.id,\n channelId: message.channelId,\n ...(message.guildId ? { guildId: message.guildId } : {}),\n ...(\"author\" in message && message.author ? { author: serializeUser(message.author) } : {}),\n ...(\"member\" in message && message.member ? { member: serializeGuildMember(message.member) } : {}),\n ...(\"content\" in message && typeof message.content === \"string\" ? { content: message.content } : {}),\n ...(\"createdAt\" in message ? { createdAt: message.createdAt.toISOString() } : {}),\n ...(\"editedAt\" in message ? { editedAt: message.editedAt ? message.editedAt.toISOString() : null } : {}),\n attachments:\n \"attachments\" in message\n ? [...message.attachments.values()].map((attachment) => ({\n id: attachment.id,\n name: attachment.name,\n url: attachment.url,\n ...(attachment.contentType !== undefined ? { contentType: attachment.contentType } : {}),\n size: attachment.size,\n }))\n : [],\n embeds: serializeEmbeds(message),\n ...(reference ? { reference } : {}),\n };\n}\n\nexport function serializeDeletedMessage(message: Message | PartialMessage): BridgeDeletedMessage {\n return {\n id: message.id,\n channelId: message.channelId,\n ...(message.guildId ? { guildId: message.guildId } : {}),\n deletedAt: new Date().toISOString(),\n };\n}\n\nfunction serializeChatInputOptions(interaction: ChatInputCommandInteraction): Record<string, unknown> {\n const options: Record<string, unknown> = {};\n for (const option of interaction.options.data) {\n if (option.options && option.options.length > 0) {\n options[option.name] = option.options.map((child) => child.value);\n continue;\n }\n options[option.name] = option.value ?? null;\n }\n return options;\n}\n\nfunction serializeSelectMenu(interaction: AnySelectMenuInteraction): Pick<BridgeInteraction, \"customId\" | \"values\"> {\n return {\n customId: interaction.customId,\n values: [...interaction.values],\n };\n}\n\nfunction serializeModalFields(interaction: ModalSubmitInteraction): Record<string, string> {\n const fields: Record<string, string> = {};\n for (const field of interaction.fields.fields.values()) {\n if (\"value\" in field && typeof field.value === \"string\") {\n fields[field.customId] = field.value;\n continue;\n }\n if (\"values\" in field && Array.isArray(field.values)) {\n fields[field.customId] = field.values.join(\",\");\n }\n }\n return fields;\n}\n\nfunction serializeInteractionMessage(interaction: Interaction): BridgeMessage | undefined {\n if (\"message\" in interaction && interaction.message) {\n return serializeMessage(interaction.message);\n }\n return undefined;\n}\n\nexport function serializeInteraction(interaction: Interaction): BridgeInteraction {\n const base: BridgeInteraction = {\n id: interaction.id,\n applicationId: interaction.applicationId,\n kind: \"unknown\",\n ...(interaction.guildId ? { guildId: interaction.guildId } : {}),\n ...(interaction.channelId ? { channelId: interaction.channelId } : {}),\n user: serializeUser(interaction.user),\n ...(interaction.member && \"guild\" in interaction.member ? { member: serializeGuildMember(interaction.member) } : {}),\n };\n\n if (interaction.isChatInputCommand()) {\n return {\n ...base,\n kind: \"chatInput\",\n commandName: interaction.commandName,\n options: serializeChatInputOptions(interaction),\n };\n }\n if (interaction.isContextMenuCommand()) {\n return {\n ...base,\n kind: \"contextMenu\",\n commandName: interaction.commandName,\n };\n }\n if (interaction.isButton()) {\n const message = serializeInteractionMessage(interaction);\n return {\n ...base,\n kind: \"button\",\n customId: interaction.customId,\n ...(message ? { message } : {}),\n };\n }\n if (interaction.isStringSelectMenu()) {\n const message = serializeInteractionMessage(interaction);\n return {\n ...base,\n kind: \"stringSelect\",\n ...serializeSelectMenu(interaction),\n ...(message ? { message } : {}),\n };\n }\n if (interaction.isUserSelectMenu()) {\n const message = serializeInteractionMessage(interaction);\n return {\n ...base,\n kind: \"userSelect\",\n ...serializeSelectMenu(interaction),\n ...(message ? { message } : {}),\n };\n }\n if (interaction.isRoleSelectMenu()) {\n const message = serializeInteractionMessage(interaction);\n return {\n ...base,\n kind: \"roleSelect\",\n ...serializeSelectMenu(interaction),\n ...(message ? { message } : {}),\n };\n }\n if (interaction.isMentionableSelectMenu()) {\n const message = serializeInteractionMessage(interaction);\n return {\n ...base,\n kind: \"mentionableSelect\",\n ...serializeSelectMenu(interaction),\n ...(message ? { message } : {}),\n };\n }\n if (interaction.isChannelSelectMenu()) {\n const message = serializeInteractionMessage(interaction);\n return {\n ...base,\n kind: \"channelSelect\",\n ...serializeSelectMenu(interaction),\n ...(message ? { message } : {}),\n };\n }\n if (interaction.isModalSubmit()) {\n return {\n ...base,\n kind: \"modalSubmit\",\n customId: interaction.customId,\n fields: serializeModalFields(interaction),\n };\n }\n return base;\n}\n","import { WebSocketServer, type WebSocket } from \"ws\";\nimport type {\n ActionResult,\n BotActionName,\n BotBridgeOptions,\n BotEventName,\n BotEventPayloadMap,\n BridgeCapabilities,\n EventSubscription,\n ShardwireLogger,\n} from \"../../discord/types\";\nimport { withLogger } from \"../../utils/logger\";\nimport { createConnectionId } from \"../../utils/id\";\nimport { matchesEventSubscription, serializeEventSubscription } from \"../subscriptions\";\nimport { isSecretValid } from \"./security\";\nimport type { NormalizedSecretConfig } from \"../validation\";\nimport {\n makeEnvelope,\n parseEnvelope,\n stringifyEnvelope,\n type ActionRequestPayload,\n type AuthHelloPayload,\n type WireEnvelope,\n} from \"./protocol\";\n\nconst CLOSE_AUTH_REQUIRED = 4001;\nconst CLOSE_AUTH_FAILED = 4003;\nconst CLOSE_INVALID_PAYLOAD = 4004;\n\ninterface AuthSuccess {\n ok: true;\n secret: NormalizedSecretConfig;\n capabilities: BridgeCapabilities;\n}\n\ninterface AuthFailure {\n ok: false;\n reason: \"unknown_secret_id\" | \"invalid_secret\" | \"ambiguous_secret\";\n}\n\ninterface BridgeConnectionState {\n id: string;\n socket: WebSocket;\n authenticated: boolean;\n lastHeartbeatAt: number;\n appName?: string;\n secret?: NormalizedSecretConfig;\n capabilities?: BridgeCapabilities;\n subscriptions: Map<string, EventSubscription>;\n}\n\ninterface BridgeTransportServerConfig {\n options: BotBridgeOptions;\n logger?: ShardwireLogger;\n authenticate: (payload: AuthHelloPayload) => AuthSuccess | AuthFailure;\n onActionRequest: (\n connection: { id: string; appName?: string; secret: NormalizedSecretConfig; capabilities: BridgeCapabilities },\n actionName: BotActionName,\n payload: unknown,\n requestId: string,\n ) => Promise<ActionResult<unknown>>;\n}\n\nexport class BridgeTransportServer {\n private readonly wss: WebSocketServer;\n private readonly logger: Required<ShardwireLogger>;\n private readonly heartbeatMs: number;\n private readonly authTimeoutMs = 5000;\n private readonly interval: NodeJS.Timeout;\n private readonly connections = new Map<WebSocket, BridgeConnectionState>();\n private readonly stickyEvents = new Map<BotEventName, BotEventPayloadMap[BotEventName]>();\n\n constructor(private readonly config: BridgeTransportServerConfig) {\n this.logger = withLogger(config.logger);\n this.heartbeatMs = config.options.server.heartbeatMs ?? 30000;\n\n this.wss = new WebSocketServer({\n host: config.options.server.host,\n port: config.options.server.port,\n path: config.options.server.path ?? \"/shardwire\",\n maxPayload: config.options.server.maxPayloadBytes ?? 65536,\n });\n\n this.wss.on(\"connection\", (socket) => this.handleConnection(socket));\n this.wss.on(\"error\", (error) => this.logger.error(\"Bridge transport server error.\", { error: String(error) }));\n this.interval = setInterval(() => {\n this.checkHeartbeats();\n }, this.heartbeatMs);\n }\n\n connectionCount(): number {\n let count = 0;\n for (const state of this.connections.values()) {\n if (state.authenticated) {\n count += 1;\n }\n }\n return count;\n }\n\n setStickyEvent<K extends BotEventName>(name: K, payload: BotEventPayloadMap[K]): void {\n this.stickyEvents.set(name, payload);\n }\n\n publishEvent<K extends BotEventName>(name: K, payload: BotEventPayloadMap[K]): void {\n const envelope = stringifyEnvelope(makeEnvelope(\"discord.event\", { name, data: payload }));\n for (const state of this.connections.values()) {\n if (!state.authenticated) {\n continue;\n }\n const shouldReceive = [...state.subscriptions.values()].some((subscription) => {\n return subscription.name === name && matchesEventSubscription(subscription, payload);\n });\n if (!shouldReceive) {\n continue;\n }\n this.safeSend(state.socket, envelope);\n }\n }\n\n async close(): Promise<void> {\n clearInterval(this.interval);\n for (const state of this.connections.values()) {\n state.socket.close();\n }\n this.connections.clear();\n await new Promise<void>((resolve, reject) => {\n this.wss.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n }\n\n private handleConnection(socket: WebSocket): void {\n const state: BridgeConnectionState = {\n id: createConnectionId(),\n socket,\n authenticated: false,\n lastHeartbeatAt: Date.now(),\n subscriptions: new Map(),\n };\n this.connections.set(socket, state);\n\n const authTimer = setTimeout(() => {\n if (!state.authenticated) {\n socket.close(CLOSE_AUTH_REQUIRED, \"Authentication required.\");\n }\n }, this.authTimeoutMs);\n\n socket.on(\"message\", (raw) => {\n const serialized =\n typeof raw === \"string\" ? raw : Buffer.isBuffer(raw) ? raw.toString(\"utf8\") : undefined;\n if (!serialized) {\n socket.close(CLOSE_INVALID_PAYLOAD, \"Invalid payload.\");\n return;\n }\n let envelope: WireEnvelope;\n try {\n envelope = parseEnvelope(serialized);\n } catch (error) {\n this.logger.warn(\"Invalid transport envelope from app.\", { error: String(error) });\n socket.close(CLOSE_INVALID_PAYLOAD, \"Invalid payload.\");\n return;\n }\n void this.handleMessage(state, envelope).catch((error: unknown) => {\n this.logger.warn(\"Failed to handle transport message.\", { error: String(error) });\n socket.close(CLOSE_INVALID_PAYLOAD, \"Invalid payload.\");\n });\n });\n\n socket.on(\"close\", () => {\n clearTimeout(authTimer);\n this.connections.delete(socket);\n });\n\n socket.on(\"error\", (error) => {\n this.logger.warn(\"Transport socket error.\", { connectionId: state.id, error: String(error) });\n });\n }\n\n private async handleMessage(state: BridgeConnectionState, envelope: WireEnvelope): Promise<void> {\n if (envelope.type === \"ping\") {\n state.lastHeartbeatAt = Date.now();\n this.safeSend(state.socket, stringifyEnvelope(makeEnvelope(\"pong\", {})));\n return;\n }\n if (envelope.type === \"pong\") {\n state.lastHeartbeatAt = Date.now();\n return;\n }\n\n if (!state.authenticated) {\n if (envelope.type !== \"auth.hello\") {\n state.socket.close(CLOSE_AUTH_REQUIRED, \"Authentication required.\");\n return;\n }\n const authResult = this.config.authenticate(envelope.payload as AuthHelloPayload);\n if (!authResult.ok) {\n const message =\n authResult.reason === \"ambiguous_secret\"\n ? \"Authentication failed: secret matches multiple configured scopes. Supply secretId or use unique secret values.\"\n : \"Authentication failed.\";\n this.safeSend(\n state.socket,\n stringifyEnvelope(\n makeEnvelope(\"auth.error\", {\n code: \"UNAUTHORIZED\",\n reason: authResult.reason,\n message,\n }),\n ),\n );\n state.socket.close(CLOSE_AUTH_FAILED, \"Invalid secret.\");\n return;\n }\n\n state.authenticated = true;\n state.lastHeartbeatAt = Date.now();\n state.secret = authResult.secret;\n state.capabilities = authResult.capabilities;\n const payload = envelope.payload as AuthHelloPayload;\n if (payload.appName) {\n state.appName = payload.appName;\n }\n this.safeSend(\n state.socket,\n stringifyEnvelope(\n makeEnvelope(\"auth.ok\", {\n connectionId: state.id,\n capabilities: authResult.capabilities,\n }),\n ),\n );\n return;\n }\n\n if (!state.secret || !state.capabilities) {\n state.socket.close(CLOSE_AUTH_FAILED, \"Invalid state.\");\n return;\n }\n\n switch (envelope.type) {\n case \"subscribe\": {\n const rawSubscriptions = (envelope.payload as { subscriptions?: unknown }).subscriptions;\n if (!Array.isArray(rawSubscriptions)) {\n return;\n }\n const allowedEvents = new Set(state.capabilities.events);\n for (const rawSubscription of rawSubscriptions as EventSubscription[]) {\n if (!rawSubscription || typeof rawSubscription !== \"object\" || typeof rawSubscription.name !== \"string\") {\n continue;\n }\n const typedEvent = rawSubscription.name;\n if (!allowedEvents.has(typedEvent)) {\n continue;\n }\n const signature = serializeEventSubscription(rawSubscription);\n state.subscriptions.set(signature, rawSubscription);\n const stickyPayload = this.stickyEvents.get(typedEvent);\n if (stickyPayload && matchesEventSubscription(rawSubscription, stickyPayload)) {\n this.safeSend(\n state.socket,\n stringifyEnvelope(makeEnvelope(\"discord.event\", { name: typedEvent, data: stickyPayload })),\n );\n }\n }\n return;\n }\n case \"unsubscribe\": {\n const rawSubscriptions = (envelope.payload as { subscriptions?: unknown }).subscriptions;\n if (!Array.isArray(rawSubscriptions)) {\n return;\n }\n for (const rawSubscription of rawSubscriptions as EventSubscription[]) {\n if (!rawSubscription || typeof rawSubscription !== \"object\" || typeof rawSubscription.name !== \"string\") {\n continue;\n }\n state.subscriptions.delete(serializeEventSubscription(rawSubscription));\n }\n return;\n }\n case \"action.request\": {\n const requestId = envelope.requestId;\n const payload = envelope.payload as ActionRequestPayload;\n if (!requestId || !payload || typeof payload.name !== \"string\") {\n return;\n }\n const result = await this.config.onActionRequest(\n {\n id: state.id,\n ...(state.appName ? { appName: state.appName } : {}),\n secret: state.secret,\n capabilities: state.capabilities,\n },\n payload.name,\n payload.data,\n requestId,\n );\n this.safeSend(\n state.socket,\n stringifyEnvelope(makeEnvelope(result.ok ? \"action.result\" : \"action.error\", result, { requestId })),\n );\n return;\n }\n default:\n return;\n }\n }\n\n private checkHeartbeats(): void {\n const now = Date.now();\n const threshold = this.heartbeatMs * 2;\n\n for (const state of this.connections.values()) {\n if (!state.authenticated) {\n continue;\n }\n\n if (now - state.lastHeartbeatAt > threshold) {\n state.socket.terminate();\n this.connections.delete(state.socket);\n continue;\n }\n\n this.safeSend(state.socket, stringifyEnvelope(makeEnvelope(\"ping\", {})));\n }\n }\n\n private safeSend(socket: WebSocket, payload: string): void {\n if (socket.readyState === 1) {\n socket.send(payload);\n }\n }\n}\n\nexport function authenticateSecret(\n payload: AuthHelloPayload,\n secrets: readonly NormalizedSecretConfig[],\n resolver: (secret: NormalizedSecretConfig) => BridgeCapabilities,\n): AuthSuccess | AuthFailure {\n if (!payload.secret) {\n return { ok: false, reason: \"invalid_secret\" };\n }\n\n let matchedSecret: NormalizedSecretConfig | undefined;\n if (payload.secretId) {\n matchedSecret = secrets.find((secret) => secret.id === payload.secretId);\n if (!matchedSecret) {\n return { ok: false, reason: \"unknown_secret_id\" };\n }\n if (!isSecretValid(payload.secret, matchedSecret.value)) {\n return { ok: false, reason: \"invalid_secret\" };\n }\n } else {\n const matches = secrets.filter((secret) => isSecretValid(payload.secret, secret.value));\n if (matches.length === 0) {\n return { ok: false, reason: \"invalid_secret\" };\n }\n if (matches.length > 1) {\n return { ok: false, reason: \"ambiguous_secret\" };\n }\n matchedSecret = matches[0];\n }\n if (!matchedSecret) {\n return { ok: false, reason: \"invalid_secret\" };\n }\n\n return {\n ok: true,\n secret: matchedSecret,\n capabilities: resolver(matchedSecret),\n };\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function createRequestId(): string {\n return randomUUID();\n}\n\nexport function createConnectionId(): string {\n return randomUUID();\n}\n","import type {\n BotEventName,\n BotEventPayloadMap,\n EventSubscription,\n EventSubscriptionFilter,\n} from \"../discord/types\";\n\ninterface NormalizedEventSubscriptionFilter {\n guildId?: string[];\n channelId?: string[];\n userId?: string[];\n commandName?: string[];\n}\n\nexport interface NormalizedEventSubscription<K extends BotEventName = BotEventName> {\n name: K;\n filter?: NormalizedEventSubscriptionFilter;\n}\n\nfunction normalizeStringList(value: string | readonly string[] | undefined): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n const rawValues = Array.isArray(value) ? value : [value];\n const normalized = [...new Set(rawValues.filter((entry) => typeof entry === \"string\" && entry.length > 0))].sort();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nexport function normalizeEventSubscriptionFilter(\n filter?: EventSubscriptionFilter,\n): NormalizedEventSubscriptionFilter | undefined {\n if (!filter) {\n return undefined;\n }\n const normalized: NormalizedEventSubscriptionFilter = {};\n const guildIds = normalizeStringList(filter.guildId);\n const channelIds = normalizeStringList(filter.channelId);\n const userIds = normalizeStringList(filter.userId);\n const commandNames = normalizeStringList(filter.commandName);\n\n if (guildIds) {\n normalized.guildId = guildIds;\n }\n if (channelIds) {\n normalized.channelId = channelIds;\n }\n if (userIds) {\n normalized.userId = userIds;\n }\n if (commandNames) {\n normalized.commandName = commandNames;\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nexport function normalizeEventSubscription<K extends BotEventName>(\n subscription: EventSubscription<K>,\n): NormalizedEventSubscription<K> {\n const normalizedFilter = normalizeEventSubscriptionFilter(subscription.filter);\n return {\n name: subscription.name,\n ...(normalizedFilter ? { filter: normalizedFilter } : {}),\n };\n}\n\nexport function serializeEventSubscription(subscription: EventSubscription): string {\n return JSON.stringify(normalizeEventSubscription(subscription));\n}\n\nfunction matchesField(value: string | undefined, allowed: string[] | undefined): boolean {\n if (!allowed) {\n return true;\n }\n if (!value) {\n return false;\n }\n return allowed.includes(value);\n}\n\nfunction eventMetadata(name: BotEventName, payload: unknown): {\n guildId?: string;\n channelId?: string;\n userId?: string;\n commandName?: string;\n} {\n switch (name) {\n case \"ready\":\n return {};\n case \"interactionCreate\": {\n const interactionPayload = payload as BotEventPayloadMap[\"interactionCreate\"];\n return {\n ...(interactionPayload.interaction.guildId ? { guildId: interactionPayload.interaction.guildId } : {}),\n ...(interactionPayload.interaction.channelId ? { channelId: interactionPayload.interaction.channelId } : {}),\n userId: interactionPayload.interaction.user.id,\n ...(interactionPayload.interaction.commandName ? { commandName: interactionPayload.interaction.commandName } : {}),\n };\n }\n case \"messageCreate\": {\n const messagePayload = payload as BotEventPayloadMap[\"messageCreate\"];\n return {\n ...(messagePayload.message.guildId ? { guildId: messagePayload.message.guildId } : {}),\n channelId: messagePayload.message.channelId,\n ...(messagePayload.message.author ? { userId: messagePayload.message.author.id } : {}),\n };\n }\n case \"messageUpdate\": {\n const messagePayload = payload as BotEventPayloadMap[\"messageUpdate\"];\n return {\n ...(messagePayload.message.guildId ? { guildId: messagePayload.message.guildId } : {}),\n channelId: messagePayload.message.channelId,\n ...(messagePayload.message.author ? { userId: messagePayload.message.author.id } : {}),\n };\n }\n case \"messageDelete\": {\n const messagePayload = payload as BotEventPayloadMap[\"messageDelete\"];\n return {\n ...(messagePayload.message.guildId ? { guildId: messagePayload.message.guildId } : {}),\n channelId: messagePayload.message.channelId,\n };\n }\n case \"guildMemberAdd\": {\n const memberPayload = payload as BotEventPayloadMap[\"guildMemberAdd\"];\n return {\n guildId: memberPayload.member.guildId,\n userId: memberPayload.member.id,\n };\n }\n case \"guildMemberRemove\": {\n const memberPayload = payload as BotEventPayloadMap[\"guildMemberRemove\"];\n return {\n guildId: memberPayload.member.guildId,\n userId: memberPayload.member.id,\n };\n }\n default:\n return {};\n }\n}\n\nexport function matchesEventSubscription(subscription: EventSubscription, payload: unknown): boolean {\n const normalized = normalizeEventSubscription(subscription);\n if (!normalized.filter) {\n return true;\n }\n\n const metadata = eventMetadata(normalized.name, payload);\n return (\n matchesField(metadata.guildId, normalized.filter.guildId) &&\n matchesField(metadata.channelId, normalized.filter.channelId) &&\n matchesField(metadata.userId, normalized.filter.userId) &&\n matchesField(metadata.commandName, normalized.filter.commandName)\n );\n}\n","import { timingSafeEqual } from \"node:crypto\";\n\nexport function isSecretValid(provided: string, expected: string): boolean {\n const providedBuffer = Buffer.from(provided);\n const expectedBuffer = Buffer.from(expected);\n\n if (providedBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return timingSafeEqual(providedBuffer, expectedBuffer);\n}\n","import type {\n ActionResult,\n BotActionName,\n BridgeCapabilities,\n EventSubscription,\n BotEventPayloadMap,\n} from \"../../discord/types\";\n\nexport const PROTOCOL_VERSION = 2 as const;\n\nexport type WireType =\n | \"auth.hello\"\n | \"auth.ok\"\n | \"auth.error\"\n | \"subscribe\"\n | \"unsubscribe\"\n | \"discord.event\"\n | \"action.request\"\n | \"action.result\"\n | \"action.error\"\n | \"ping\"\n | \"pong\";\n\nexport interface WireEnvelope<TType extends WireType = WireType, TPayload = unknown> {\n v: typeof PROTOCOL_VERSION;\n type: TType;\n ts: number;\n requestId?: string;\n payload: TPayload;\n}\n\nexport interface AuthHelloPayload {\n secret: string;\n secretId?: string;\n appName?: string;\n}\n\nexport interface AuthOkPayload {\n connectionId: string;\n capabilities: BridgeCapabilities;\n}\n\nexport interface AuthErrorPayload {\n code: \"UNAUTHORIZED\";\n reason: \"unknown_secret_id\" | \"invalid_secret\" | \"ambiguous_secret\";\n message: string;\n}\n\nexport interface SubscribePayload {\n subscriptions: EventSubscription[];\n}\n\nexport interface UnsubscribePayload {\n subscriptions: EventSubscription[];\n}\n\nexport interface DiscordEventPayload<TName extends keyof BotEventPayloadMap = keyof BotEventPayloadMap> {\n name: TName;\n data: BotEventPayloadMap[TName];\n}\n\nexport interface ActionRequestPayload {\n name: BotActionName;\n data: unknown;\n}\n\nexport type ActionResponsePayload = ActionResult<unknown>;\n\nexport function makeEnvelope<TType extends WireType, TPayload>(\n type: TType,\n payload: TPayload,\n extras?: { requestId?: string },\n): WireEnvelope<TType, TPayload> {\n return {\n v: PROTOCOL_VERSION,\n type,\n ts: Date.now(),\n ...(extras?.requestId ? { requestId: extras.requestId } : {}),\n payload,\n };\n}\n\nexport function parseEnvelope(raw: string): WireEnvelope {\n const parsed = JSON.parse(raw) as WireEnvelope;\n if (!parsed || parsed.v !== PROTOCOL_VERSION || typeof parsed.type !== \"string\") {\n throw new Error(\"Invalid bridge envelope.\");\n }\n return parsed;\n}\n\nexport function stringifyEnvelope(envelope: WireEnvelope): string {\n return JSON.stringify(envelope);\n}\n","import type {\n AppBridgeOptions,\n BotActionName,\n BotBridgeOptions,\n BotBridgeSecret,\n BotEventName,\n BotIntentName,\n BridgeCapabilities,\n} from \"../discord/types\";\nimport { BOT_ACTION_NAMES, BOT_EVENT_NAMES, getAvailableEvents } from \"../discord/catalog\";\n\ninterface NormalizedSecretScope {\n events: \"*\" | Set<BotEventName>;\n actions: \"*\" | Set<BotActionName>;\n}\n\nexport interface NormalizedSecretConfig {\n id: string;\n value: string;\n scope: NormalizedSecretScope;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction assertPositiveNumber(name: string, value: unknown): void {\n if (typeof value !== \"number\" || Number.isNaN(value) || value <= 0) {\n throw new Error(`${name} must be a positive number.`);\n }\n}\n\nfunction normalizeScopeList<T extends string>(\n value: \"*\" | readonly T[] | undefined,\n known: readonly T[],\n label: string,\n): \"*\" | Set<T> {\n if (value === undefined || value === \"*\") {\n return \"*\";\n }\n if (!Array.isArray(value)) {\n throw new Error(`${label} must be \"*\" or an array.`);\n }\n const knownSet = new Set(known);\n const entries = new Set<T>();\n for (const rawItem of value as readonly unknown[]) {\n if (typeof rawItem !== \"string\") {\n throw new Error(`${label} contains a non-string value.`);\n }\n const item = rawItem as T;\n if (!knownSet.has(item)) {\n throw new Error(`${label} contains unsupported value \"${String(item)}\".`);\n }\n entries.add(item);\n }\n return entries;\n}\n\nfunction normalizeSecretEntry(secret: BotBridgeSecret, index: number): NormalizedSecretConfig {\n const defaultId = `s${index}`;\n if (typeof secret === \"string\") {\n if (!isNonEmptyString(secret)) {\n throw new Error(`server.secrets[${index}] must be a non-empty string.`);\n }\n return {\n id: defaultId,\n value: secret,\n scope: {\n events: \"*\",\n actions: \"*\",\n },\n };\n }\n\n const scoped = secret;\n if (!isNonEmptyString(scoped.value)) {\n throw new Error(`server.secrets[${index}].value must be a non-empty string.`);\n }\n if (scoped.id !== undefined && !isNonEmptyString(scoped.id)) {\n throw new Error(`server.secrets[${index}].id must be a non-empty string when provided.`);\n }\n\n return {\n id: scoped.id ?? defaultId,\n value: scoped.value,\n scope: {\n events: normalizeScopeList(scoped.allow?.events, BOT_EVENT_NAMES, `server.secrets[${index}].allow.events`),\n actions: normalizeScopeList(\n scoped.allow?.actions,\n BOT_ACTION_NAMES,\n `server.secrets[${index}].allow.actions`,\n ),\n },\n };\n}\n\nexport function assertBotBridgeOptions(options: BotBridgeOptions): void {\n if (!isNonEmptyString(options.token)) {\n throw new Error(\"Bot bridge requires `token`.\");\n }\n if (!Array.isArray(options.intents) || options.intents.length === 0) {\n throw new Error(\"Bot bridge requires at least one intent.\");\n }\n assertPositiveNumber(\"server.port\", options.server.port);\n if (options.server.heartbeatMs !== undefined) {\n assertPositiveNumber(\"server.heartbeatMs\", options.server.heartbeatMs);\n }\n if (options.server.maxPayloadBytes !== undefined) {\n assertPositiveNumber(\"server.maxPayloadBytes\", options.server.maxPayloadBytes);\n }\n if (!Array.isArray(options.server.secrets) || options.server.secrets.length === 0) {\n throw new Error(\"server.secrets must contain at least one secret.\");\n }\n const ids = new Set<string>();\n const values = new Set<string>();\n options.server.secrets.forEach((secret: BotBridgeSecret, index) => {\n const normalized = normalizeSecretEntry(secret, index);\n if (ids.has(normalized.id)) {\n throw new Error(`server.secrets contains duplicate secret id \"${normalized.id}\".`);\n }\n if (values.has(normalized.value)) {\n throw new Error(`server.secrets contains duplicate secret value at index ${index}.`);\n }\n ids.add(normalized.id);\n values.add(normalized.value);\n });\n}\n\nexport function normalizeSecrets(options: BotBridgeOptions): NormalizedSecretConfig[] {\n return options.server.secrets.map((secret, index) => normalizeSecretEntry(secret, index));\n}\n\nexport function assertAppBridgeOptions(options: AppBridgeOptions): void {\n if (!isNonEmptyString(options.url)) {\n throw new Error(\"App bridge requires `url`.\");\n }\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(options.url);\n } catch {\n throw new Error(\"App bridge option `url` must be a valid URL.\");\n }\n if (parsedUrl.protocol !== \"ws:\" && parsedUrl.protocol !== \"wss:\") {\n throw new Error(\"App bridge option `url` must use `ws://` or `wss://`.\");\n }\n const isLoopbackHost =\n parsedUrl.hostname === \"localhost\" || parsedUrl.hostname === \"127.0.0.1\" || parsedUrl.hostname === \"::1\";\n if (parsedUrl.protocol === \"ws:\" && !isLoopbackHost) {\n throw new Error(\"Non-loopback app bridge URLs must use `wss://`.\");\n }\n if (!isNonEmptyString(options.secret)) {\n throw new Error(\"App bridge requires `secret`.\");\n }\n if (options.secretId !== undefined && !isNonEmptyString(options.secretId)) {\n throw new Error(\"App bridge option `secretId` must be a non-empty string.\");\n }\n if (options.appName !== undefined && !isNonEmptyString(options.appName)) {\n throw new Error(\"App bridge option `appName` must be a non-empty string.\");\n }\n if (options.requestTimeoutMs !== undefined) {\n assertPositiveNumber(\"requestTimeoutMs\", options.requestTimeoutMs);\n }\n if (options.reconnect?.initialDelayMs !== undefined) {\n assertPositiveNumber(\"reconnect.initialDelayMs\", options.reconnect.initialDelayMs);\n }\n if (options.reconnect?.maxDelayMs !== undefined) {\n assertPositiveNumber(\"reconnect.maxDelayMs\", options.reconnect.maxDelayMs);\n }\n}\n\nexport function resolveCapabilitiesForSecret(\n intents: readonly BotIntentName[],\n secret: NormalizedSecretConfig,\n): BridgeCapabilities {\n const availableEvents = getAvailableEvents(intents);\n const events =\n secret.scope.events === \"*\"\n ? [...availableEvents]\n : availableEvents.filter((eventName) => {\n return secret.scope.events !== \"*\" && secret.scope.events.has(eventName);\n });\n const actions =\n secret.scope.actions === \"*\"\n ? [...BOT_ACTION_NAMES]\n : BOT_ACTION_NAMES.filter((action) => {\n return secret.scope.actions !== \"*\" && secret.scope.actions.has(action);\n });\n\n return {\n events: [...events],\n actions: [...actions],\n };\n}\n\nexport function secretAllowsEvent(secret: NormalizedSecretConfig, eventName: BotEventName): boolean {\n if (secret.scope.events === \"*\") {\n return true;\n }\n return secret.scope.events.has(eventName);\n}\n\nexport function secretAllowsAction(secret: NormalizedSecretConfig, actionName: BotActionName): boolean {\n if (secret.scope.actions === \"*\") {\n return true;\n }\n return secret.scope.actions.has(actionName);\n}\n","import type {\n ActionFailure,\n BotActionPayloadMap,\n BotBridge,\n BotBridgeOptions,\n ReadyEventPayload,\n} from \"../discord/types\";\nimport { getAvailableEvents } from \"../discord/catalog\";\nimport { ActionExecutionError, type DiscordRuntimeAdapter } from \"../discord/runtime/adapter\";\nimport { createDiscordJsRuntimeAdapter } from \"../discord/runtime/discordjs-adapter\";\nimport { BridgeTransportServer, authenticateSecret } from \"../bridge/transport/server\";\nimport {\n assertBotBridgeOptions,\n normalizeSecrets,\n resolveCapabilitiesForSecret,\n} from \"../bridge/validation\";\n\nexport function createBotBridge(options: BotBridgeOptions): BotBridge {\n const runtime = createDiscordJsRuntimeAdapter({\n token: options.token,\n intents: options.intents,\n ...(options.logger ? { logger: options.logger } : {}),\n });\n return createBotBridgeWithRuntime(options, runtime);\n}\n\nexport function createBotBridgeWithRuntime(options: BotBridgeOptions, runtime: DiscordRuntimeAdapter): BotBridge {\n assertBotBridgeOptions(options);\n const secrets = normalizeSecrets(options);\n const availableEvents = getAvailableEvents(options.intents);\n const server = new BridgeTransportServer({\n options,\n ...(options.logger ? { logger: options.logger } : {}),\n authenticate: (payload) =>\n authenticateSecret(payload, secrets, (secret) => resolveCapabilitiesForSecret(options.intents, secret)),\n onActionRequest: async (connection, actionName, payload, requestId) => {\n if (!connection.capabilities.actions.includes(actionName)) {\n return {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code: \"FORBIDDEN\",\n message: `Action \"${actionName}\" is not allowed for this app.`,\n },\n } satisfies ActionFailure;\n }\n\n try {\n const result = await runtime.executeAction(actionName, payload as BotActionPayloadMap[typeof actionName]);\n return {\n ok: true,\n requestId,\n ts: Date.now(),\n data: result,\n };\n } catch (error) {\n if (error instanceof ActionExecutionError) {\n return {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code: error.code,\n message: error.message,\n ...(error.details !== undefined ? { details: error.details } : {}),\n },\n } satisfies ActionFailure;\n }\n return {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code: \"INTERNAL_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown action failure.\",\n },\n } satisfies ActionFailure;\n }\n },\n });\n\n const unsubscribers = availableEvents.map((eventName) =>\n runtime.on(eventName, (payload) => {\n if (eventName === \"ready\") {\n server.setStickyEvent(\"ready\", payload as ReadyEventPayload);\n }\n server.publishEvent(eventName, payload);\n }),\n );\n\n return {\n async ready() {\n await runtime.ready();\n },\n async close() {\n for (const unsubscribe of unsubscribers) {\n unsubscribe();\n }\n await Promise.all([server.close(), runtime.close()]);\n },\n status() {\n return {\n ready: runtime.isReady(),\n connectionCount: server.connectionCount(),\n };\n },\n };\n}\n","import type { APIAllowedMentions, APIEmbed, Snowflake } from \"discord-api-types/v10\";\n\nexport type Unsubscribe = () => void;\n\nexport interface ShardwireLogger {\n debug?: (message: string, meta?: Record<string, unknown>) => void;\n info?: (message: string, meta?: Record<string, unknown>) => void;\n warn?: (message: string, meta?: Record<string, unknown>) => void;\n error?: (message: string, meta?: Record<string, unknown>) => void;\n}\n\nexport type BotIntentName =\n | \"Guilds\"\n | \"GuildMembers\"\n | \"GuildMessages\"\n | \"MessageContent\";\n\nexport interface BridgeUser {\n id: Snowflake;\n username: string;\n discriminator: string;\n globalName?: string | null;\n avatarUrl?: string | null;\n bot: boolean;\n system: boolean;\n}\n\nexport interface BridgeAttachment {\n id: Snowflake;\n name: string;\n url: string;\n contentType?: string | null;\n size: number;\n}\n\nexport interface BridgeMessageReference {\n messageId?: Snowflake;\n channelId?: Snowflake;\n guildId?: Snowflake;\n}\n\nexport interface BridgeGuildMember {\n id: Snowflake;\n guildId: Snowflake;\n user?: BridgeUser;\n displayName?: string;\n nickname?: string | null;\n roles: Snowflake[];\n joinedAt?: string | null;\n premiumSince?: string | null;\n pending?: boolean;\n communicationDisabledUntil?: string | null;\n}\n\nexport interface BridgeMessage {\n id: Snowflake;\n channelId: Snowflake;\n guildId?: Snowflake;\n author?: BridgeUser;\n member?: BridgeGuildMember;\n content?: string;\n createdAt?: string;\n editedAt?: string | null;\n attachments: BridgeAttachment[];\n embeds: APIEmbed[];\n reference?: BridgeMessageReference;\n}\n\nexport interface BridgeDeletedMessage {\n id: Snowflake;\n channelId: Snowflake;\n guildId?: Snowflake;\n deletedAt: string;\n}\n\nexport type BridgeInteractionKind =\n | \"chatInput\"\n | \"contextMenu\"\n | \"button\"\n | \"stringSelect\"\n | \"userSelect\"\n | \"roleSelect\"\n | \"mentionableSelect\"\n | \"channelSelect\"\n | \"modalSubmit\"\n | \"unknown\";\n\nexport interface BridgeInteraction {\n id: Snowflake;\n applicationId: Snowflake;\n kind: BridgeInteractionKind;\n guildId?: Snowflake;\n channelId?: Snowflake;\n user: BridgeUser;\n member?: BridgeGuildMember;\n commandName?: string;\n customId?: string;\n options?: Record<string, unknown>;\n values?: string[];\n fields?: Record<string, string>;\n message?: BridgeMessage;\n}\n\nexport interface EventEnvelopeBase {\n receivedAt: number;\n shardId?: number;\n}\n\nexport interface ReadyEventPayload extends EventEnvelopeBase {\n user: BridgeUser;\n}\n\nexport interface InteractionCreateEventPayload extends EventEnvelopeBase {\n interaction: BridgeInteraction;\n}\n\nexport interface MessageCreateEventPayload extends EventEnvelopeBase {\n message: BridgeMessage;\n}\n\nexport interface MessageUpdateEventPayload extends EventEnvelopeBase {\n oldMessage?: BridgeMessage;\n message: BridgeMessage;\n}\n\nexport interface MessageDeleteEventPayload extends EventEnvelopeBase {\n message: BridgeDeletedMessage;\n}\n\nexport interface GuildMemberAddEventPayload extends EventEnvelopeBase {\n member: BridgeGuildMember;\n}\n\nexport interface GuildMemberRemoveEventPayload extends EventEnvelopeBase {\n member: BridgeGuildMember;\n}\n\nexport interface BotEventPayloadMap {\n ready: ReadyEventPayload;\n interactionCreate: InteractionCreateEventPayload;\n messageCreate: MessageCreateEventPayload;\n messageUpdate: MessageUpdateEventPayload;\n messageDelete: MessageDeleteEventPayload;\n guildMemberAdd: GuildMemberAddEventPayload;\n guildMemberRemove: GuildMemberRemoveEventPayload;\n}\n\nexport type BotEventName = keyof BotEventPayloadMap;\n\nexport interface BridgeMessageInput {\n content?: string;\n embeds?: APIEmbed[];\n allowedMentions?: APIAllowedMentions;\n}\n\nexport interface SendMessageActionPayload extends BridgeMessageInput {\n channelId: Snowflake;\n}\n\nexport interface EditMessageActionPayload extends BridgeMessageInput {\n channelId: Snowflake;\n messageId: Snowflake;\n}\n\nexport interface DeleteMessageActionPayload {\n channelId: Snowflake;\n messageId: Snowflake;\n}\n\nexport interface ReplyToInteractionActionPayload extends BridgeMessageInput {\n interactionId: Snowflake;\n ephemeral?: boolean;\n}\n\nexport interface DeferInteractionActionPayload {\n interactionId: Snowflake;\n ephemeral?: boolean;\n}\n\nexport interface FollowUpInteractionActionPayload extends BridgeMessageInput {\n interactionId: Snowflake;\n ephemeral?: boolean;\n}\n\nexport interface BanMemberActionPayload {\n guildId: Snowflake;\n userId: Snowflake;\n reason?: string;\n deleteMessageSeconds?: number;\n}\n\nexport interface KickMemberActionPayload {\n guildId: Snowflake;\n userId: Snowflake;\n reason?: string;\n}\n\nexport interface AddMemberRoleActionPayload {\n guildId: Snowflake;\n userId: Snowflake;\n roleId: Snowflake;\n reason?: string;\n}\n\nexport interface RemoveMemberRoleActionPayload {\n guildId: Snowflake;\n userId: Snowflake;\n roleId: Snowflake;\n reason?: string;\n}\n\nexport interface BotActionPayloadMap {\n sendMessage: SendMessageActionPayload;\n editMessage: EditMessageActionPayload;\n deleteMessage: DeleteMessageActionPayload;\n replyToInteraction: ReplyToInteractionActionPayload;\n deferInteraction: DeferInteractionActionPayload;\n followUpInteraction: FollowUpInteractionActionPayload;\n banMember: BanMemberActionPayload;\n kickMember: KickMemberActionPayload;\n addMemberRole: AddMemberRoleActionPayload;\n removeMemberRole: RemoveMemberRoleActionPayload;\n}\n\nexport interface DeleteMessageActionResult {\n deleted: true;\n channelId: Snowflake;\n messageId: Snowflake;\n}\n\nexport interface DeferInteractionActionResult {\n deferred: true;\n interactionId: Snowflake;\n}\n\nexport interface MemberModerationActionResult {\n guildId: Snowflake;\n userId: Snowflake;\n}\n\nexport interface BotActionResultDataMap {\n sendMessage: BridgeMessage;\n editMessage: BridgeMessage;\n deleteMessage: DeleteMessageActionResult;\n replyToInteraction: BridgeMessage;\n deferInteraction: DeferInteractionActionResult;\n followUpInteraction: BridgeMessage;\n banMember: MemberModerationActionResult;\n kickMember: MemberModerationActionResult;\n addMemberRole: BridgeGuildMember;\n removeMemberRole: BridgeGuildMember;\n}\n\nexport type BotActionName = keyof BotActionPayloadMap;\n\nexport interface BridgeCapabilities {\n events: BotEventName[];\n actions: BotActionName[];\n}\n\nexport interface EventSubscriptionFilter {\n guildId?: Snowflake | readonly Snowflake[];\n channelId?: Snowflake | readonly Snowflake[];\n userId?: Snowflake | readonly Snowflake[];\n commandName?: string | readonly string[];\n}\n\nexport interface EventSubscription<K extends BotEventName = BotEventName> {\n name: K;\n filter?: EventSubscriptionFilter;\n}\n\nexport interface SecretPermissions {\n events?: \"*\" | readonly BotEventName[];\n actions?: \"*\" | readonly BotActionName[];\n}\n\nexport interface ScopedSecretConfig {\n id?: string;\n value: string;\n allow?: SecretPermissions;\n}\n\nexport type BotBridgeSecret = string | ScopedSecretConfig;\n\nexport interface BotBridgeOptions {\n token: string;\n intents: readonly BotIntentName[];\n server: {\n port: number;\n host?: string;\n path?: string;\n heartbeatMs?: number;\n maxPayloadBytes?: number;\n secrets: readonly BotBridgeSecret[];\n };\n logger?: ShardwireLogger;\n}\n\nexport interface AppBridgeOptions {\n url: string;\n secret: string;\n secretId?: string;\n appName?: string;\n reconnect?: {\n enabled?: boolean;\n initialDelayMs?: number;\n maxDelayMs?: number;\n jitter?: boolean;\n };\n requestTimeoutMs?: number;\n logger?: ShardwireLogger;\n}\n\nexport interface ActionError {\n code:\n | \"UNAUTHORIZED\"\n | \"TIMEOUT\"\n | \"DISCONNECTED\"\n | \"FORBIDDEN\"\n | \"NOT_FOUND\"\n | \"INVALID_REQUEST\"\n | \"INTERNAL_ERROR\";\n message: string;\n details?: unknown;\n}\n\nexport interface ActionSuccess<T> {\n ok: true;\n requestId: string;\n ts: number;\n data: T;\n}\n\nexport interface ActionFailure {\n ok: false;\n requestId: string;\n ts: number;\n error: ActionError;\n}\n\nexport type ActionResult<T> = ActionSuccess<T> | ActionFailure;\n\nexport class BridgeCapabilityError extends Error {\n constructor(\n public readonly kind: \"event\" | \"action\",\n public readonly name: string,\n message?: string,\n ) {\n super(message ?? `Capability \"${name}\" is not available for ${kind}.`);\n this.name = \"BridgeCapabilityError\";\n }\n}\n\nexport type EventHandler<K extends BotEventName> = (payload: BotEventPayloadMap[K]) => void;\n\nexport type AppBridgeActions = {\n [K in BotActionName]: (\n payload: BotActionPayloadMap[K],\n options?: { timeoutMs?: number; requestId?: string },\n ) => Promise<ActionResult<BotActionResultDataMap[K]>>;\n};\n\nexport interface BotBridge {\n ready(): Promise<void>;\n close(): Promise<void>;\n status(): { ready: boolean; connectionCount: number };\n}\n\nexport interface AppBridge {\n actions: AppBridgeActions;\n ready(): Promise<void>;\n close(): Promise<void>;\n connected(): boolean;\n connectionId(): string | null;\n capabilities(): BridgeCapabilities;\n on<K extends BotEventName>(name: K, handler: EventHandler<K>, filter?: EventSubscriptionFilter): Unsubscribe;\n off<K extends BotEventName>(name: K, handler: EventHandler<K>): void;\n}\n","import { WebSocket } from \"ws\";\n\nexport interface WebSocketLike {\n readyState: number;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n on(event: \"open\", listener: () => void): void;\n on(event: \"message\", listener: (data: unknown) => void): void;\n on(event: \"close\", listener: () => void): void;\n on(event: \"error\", listener: (error: unknown) => void): void;\n once(event: \"close\", listener: () => void): void;\n}\n\nexport function createNodeWebSocket(url: string): WebSocketLike {\n return new WebSocket(url) as unknown as WebSocketLike;\n}\n","export interface BackoffConfig {\n initialDelayMs: number;\n maxDelayMs: number;\n jitter: boolean;\n}\n\nexport function getBackoffDelay(attempt: number, config: BackoffConfig): number {\n const base = Math.min(config.maxDelayMs, config.initialDelayMs * 2 ** attempt);\n if (!config.jitter) {\n return base;\n }\n const spread = Math.floor(base * 0.2);\n const min = Math.max(0, base - spread);\n const max = base + spread;\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","import type {\n ActionFailure,\n ActionResult,\n AppBridge,\n AppBridgeActions,\n AppBridgeOptions,\n BotActionName,\n BotActionPayloadMap,\n BotActionResultDataMap,\n BotEventName,\n BridgeCapabilities,\n EventSubscription,\n EventSubscriptionFilter,\n EventHandler,\n} from \"../discord/types\";\nimport { BridgeCapabilityError } from \"../discord/types\";\nimport { matchesEventSubscription, serializeEventSubscription } from \"../bridge/subscriptions\";\nimport { createNodeWebSocket, type WebSocketLike } from \"../bridge/transport/socket\";\nimport {\n makeEnvelope,\n parseEnvelope,\n stringifyEnvelope,\n type ActionResponsePayload,\n type AuthErrorPayload,\n type AuthOkPayload,\n} from \"../bridge/transport/protocol\";\nimport { assertAppBridgeOptions } from \"../bridge/validation\";\nimport { createRequestId } from \"../utils/id\";\nimport { getBackoffDelay } from \"../utils/backoff\";\nimport { withLogger } from \"../utils/logger\";\n\ninterface PendingRequest {\n resolve: (value: ActionResult<unknown>) => void;\n reject: (error: AppRequestError) => void;\n timer: NodeJS.Timeout;\n}\n\nclass AppRequestError extends Error {\n constructor(\n public readonly code: \"TIMEOUT\" | \"DISCONNECTED\" | \"UNAUTHORIZED\",\n message: string,\n ) {\n super(message);\n this.name = \"AppRequestError\";\n }\n}\n\ninterface HandlerSubscriptionEntry {\n handler: EventHandler<BotEventName>;\n subscription: EventSubscription;\n signature: string;\n}\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10000;\n\nexport function connectBotBridge(options: AppBridgeOptions): AppBridge {\n assertAppBridgeOptions(options);\n\n const logger = withLogger(options.logger);\n const reconnectEnabled = options.reconnect?.enabled ?? true;\n const initialDelayMs = options.reconnect?.initialDelayMs ?? 500;\n const maxDelayMs = options.reconnect?.maxDelayMs ?? 10000;\n const jitter = options.reconnect?.jitter ?? true;\n const requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n\n let socket: WebSocketLike | null = null;\n let isClosed = false;\n let isAuthed = false;\n let currentConnectionId: string | null = null;\n let currentCapabilities: BridgeCapabilities = { events: [], actions: [] };\n let reconnectAttempts = 0;\n let reconnectTimer: NodeJS.Timeout | null = null;\n let connectPromise: Promise<void> | null = null;\n let connectResolve: (() => void) | null = null;\n let connectReject: ((error: Error) => void) | null = null;\n let authTimeoutTimer: NodeJS.Timeout | null = null;\n let capabilityError: BridgeCapabilityError | null = null;\n\n const pendingRequests = new Map<string, PendingRequest>();\n const eventHandlers = new Map<BotEventName, Set<HandlerSubscriptionEntry>>();\n const subscribedEntries = new Map<string, EventSubscription>();\n\n function clearAuthTimeout(): void {\n if (authTimeoutTimer) {\n clearTimeout(authTimeoutTimer);\n authTimeoutTimer = null;\n }\n }\n\n function resolveConnect(): void {\n clearAuthTimeout();\n connectResolve?.();\n connectResolve = null;\n connectReject = null;\n connectPromise = null;\n }\n\n function rejectConnect(message: string): void {\n clearAuthTimeout();\n if (connectReject) {\n connectReject(new Error(message));\n }\n connectResolve = null;\n connectReject = null;\n connectPromise = null;\n }\n\n function sendRaw(data: string): void {\n if (!socket || socket.readyState !== 1) {\n throw new Error(\"App bridge is not connected.\");\n }\n socket.send(data);\n }\n\n function rejectAllPending(\n code: \"TIMEOUT\" | \"DISCONNECTED\" | \"UNAUTHORIZED\",\n reason: string,\n ): void {\n for (const [requestId, pending] of pendingRequests.entries()) {\n clearTimeout(pending.timer);\n pending.reject(new AppRequestError(code, reason));\n pendingRequests.delete(requestId);\n }\n }\n\n function scheduleReconnect(): void {\n if (isClosed || !reconnectEnabled || reconnectTimer) {\n return;\n }\n const delay = getBackoffDelay(reconnectAttempts, { initialDelayMs, maxDelayMs, jitter });\n reconnectAttempts += 1;\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n void connect().catch((error) => {\n logger.warn(\"Reconnect attempt failed.\", { error: String(error) });\n });\n }, delay);\n }\n\n function evaluateSubscriptions(): Map<string, EventSubscription> {\n const desiredSubscriptions = new Map<string, EventSubscription>();\n if (currentCapabilities.events.length === 0) {\n capabilityError = null;\n for (const handlers of eventHandlers.values()) {\n for (const entry of handlers) {\n desiredSubscriptions.set(entry.signature, entry.subscription);\n }\n }\n return desiredSubscriptions;\n }\n\n const allowedEvents = new Set(currentCapabilities.events);\n const invalidEvents = [...eventHandlers.keys()].filter((eventName) => !allowedEvents.has(eventName));\n const firstInvalid = invalidEvents[0];\n capabilityError =\n firstInvalid !== undefined\n ? new BridgeCapabilityError(\"event\", firstInvalid, `Event \"${firstInvalid}\" is not available for this app.`)\n : null;\n\n for (const [eventName, handlers] of eventHandlers.entries()) {\n if (!allowedEvents.has(eventName)) {\n continue;\n }\n for (const entry of handlers) {\n desiredSubscriptions.set(entry.signature, entry.subscription);\n }\n }\n return desiredSubscriptions;\n }\n\n function syncSubscriptions(): void {\n if (!isAuthed || !socket || socket.readyState !== 1) {\n return;\n }\n\n const desiredSubscriptions = evaluateSubscriptions();\n\n const toSubscribe = [...desiredSubscriptions.entries()]\n .filter(([signature]) => !subscribedEntries.has(signature))\n .map(([, subscription]) => subscription);\n if (toSubscribe.length > 0) {\n sendRaw(stringifyEnvelope(makeEnvelope(\"subscribe\", { subscriptions: toSubscribe })));\n for (const subscription of toSubscribe) {\n subscribedEntries.set(serializeEventSubscription(subscription), subscription);\n }\n }\n\n const toUnsubscribe = [...subscribedEntries.entries()]\n .filter(([signature]) => !desiredSubscriptions.has(signature))\n .map(([, subscription]) => subscription);\n if (toUnsubscribe.length > 0) {\n sendRaw(stringifyEnvelope(makeEnvelope(\"unsubscribe\", { subscriptions: toUnsubscribe })));\n for (const subscription of toUnsubscribe) {\n subscribedEntries.delete(serializeEventSubscription(subscription));\n }\n }\n }\n\n function handleEvent(name: BotEventName, payload: unknown): void {\n const handlers = eventHandlers.get(name);\n if (!handlers || handlers.size === 0) {\n return;\n }\n for (const entry of handlers) {\n try {\n if (!matchesEventSubscription(entry.subscription, payload)) {\n continue;\n }\n entry.handler(payload as never);\n } catch (error) {\n logger.warn(\"App event handler threw an error.\", { event: name, error: String(error) });\n }\n }\n }\n\n async function connect(): Promise<void> {\n if (isClosed) {\n return;\n }\n if (socket && socket.readyState === 1 && isAuthed) {\n return;\n }\n if (connectPromise) {\n return connectPromise;\n }\n\n connectPromise = new Promise<void>((resolve, reject) => {\n connectResolve = resolve;\n connectReject = reject;\n });\n\n socket = createNodeWebSocket(options.url);\n\n socket.on(\"open\", () => {\n reconnectAttempts = 0;\n isAuthed = false;\n subscribedEntries.clear();\n currentConnectionId = null;\n currentCapabilities = { events: [], actions: [] };\n capabilityError = null;\n\n sendRaw(\n stringifyEnvelope(\n makeEnvelope(\"auth.hello\", {\n secret: options.secret,\n ...(options.secretId ? { secretId: options.secretId } : {}),\n ...(options.appName ? { appName: options.appName } : {}),\n }),\n ),\n );\n authTimeoutTimer = setTimeout(() => {\n if (!isAuthed) {\n rejectConnect(\"App bridge authentication timed out.\");\n socket?.close();\n }\n }, requestTimeoutMs);\n });\n\n socket.on(\"message\", (raw) => {\n try {\n const serialized = typeof raw === \"string\" ? raw : String(raw);\n const envelope = parseEnvelope(serialized);\n switch (envelope.type) {\n case \"auth.ok\": {\n const payload = envelope.payload as AuthOkPayload;\n isAuthed = true;\n currentConnectionId = payload.connectionId;\n currentCapabilities = payload.capabilities;\n syncSubscriptions();\n resolveConnect();\n break;\n }\n case \"auth.error\": {\n const payload = envelope.payload as AuthErrorPayload;\n rejectConnect(payload.message);\n rejectAllPending(\"UNAUTHORIZED\", payload.message);\n socket?.close();\n break;\n }\n case \"action.result\":\n case \"action.error\": {\n const requestId = envelope.requestId;\n if (!requestId) {\n return;\n }\n const pending = pendingRequests.get(requestId);\n if (!pending) {\n return;\n }\n clearTimeout(pending.timer);\n pending.resolve(envelope.payload as ActionResponsePayload);\n pendingRequests.delete(requestId);\n break;\n }\n case \"discord.event\": {\n const payload = envelope.payload as { name: BotEventName; data: unknown };\n handleEvent(payload.name, payload.data);\n break;\n }\n case \"ping\":\n sendRaw(stringifyEnvelope(makeEnvelope(\"pong\", {})));\n break;\n default:\n break;\n }\n } catch (error) {\n logger.warn(\"Failed to parse app bridge message.\", { error: String(error) });\n }\n });\n\n socket.on(\"close\", () => {\n rejectConnect(\"App bridge connection closed.\");\n isAuthed = false;\n currentConnectionId = null;\n currentCapabilities = { events: [], actions: [] };\n subscribedEntries.clear();\n rejectAllPending(\"DISCONNECTED\", \"App bridge connection closed before action completed.\");\n if (!isClosed) {\n scheduleReconnect();\n }\n });\n\n socket.on(\"error\", (error) => {\n logger.warn(\"App bridge socket error.\", { error: String(error) });\n });\n\n return connectPromise;\n }\n\n async function invokeAction<K extends BotActionName>(\n name: K,\n payload: BotActionPayloadMap[K],\n sendOptions?: { timeoutMs?: number; requestId?: string },\n ): Promise<ActionResult<BotActionResultDataMap[K]>> {\n try {\n await connect();\n } catch (error) {\n return {\n ok: false,\n requestId: sendOptions?.requestId ?? \"unknown\",\n ts: Date.now(),\n error: {\n code: \"UNAUTHORIZED\",\n message: error instanceof Error ? error.message : \"Failed to authenticate.\",\n },\n } satisfies ActionFailure;\n }\n\n if (!currentCapabilities.actions.includes(name)) {\n return {\n ok: false,\n requestId: sendOptions?.requestId ?? \"unknown\",\n ts: Date.now(),\n error: {\n code: \"FORBIDDEN\",\n message: `Action \"${name}\" is not available for this app.`,\n },\n } satisfies ActionFailure;\n }\n\n if (!socket || socket.readyState !== 1 || !isAuthed) {\n return {\n ok: false,\n requestId: sendOptions?.requestId ?? \"unknown\",\n ts: Date.now(),\n error: {\n code: \"DISCONNECTED\",\n message: \"Not connected to the bot bridge.\",\n },\n } satisfies ActionFailure;\n }\n\n const requestId = sendOptions?.requestId ?? createRequestId();\n const timeoutMs = sendOptions?.timeoutMs ?? requestTimeoutMs;\n const promise = new Promise<ActionResult<unknown>>((resolve, reject) => {\n const timer = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(new AppRequestError(\"TIMEOUT\", `Action \"${name}\" timed out after ${timeoutMs}ms.`));\n }, timeoutMs);\n\n pendingRequests.set(requestId, {\n resolve,\n reject: (error) => reject(error),\n timer,\n });\n });\n\n sendRaw(\n stringifyEnvelope(\n makeEnvelope(\n \"action.request\",\n {\n name,\n data: payload,\n },\n { requestId },\n ),\n ),\n );\n\n try {\n return (await promise) as ActionResult<BotActionResultDataMap[K]>;\n } catch (error) {\n const code =\n error instanceof AppRequestError\n ? error.code\n : !socket || socket.readyState !== 1\n ? \"DISCONNECTED\"\n : \"TIMEOUT\";\n return {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code,\n message: error instanceof Error ? error.message : \"Action request failed.\",\n },\n } satisfies ActionFailure;\n }\n }\n\n const actions: AppBridgeActions = {\n sendMessage: (payload, sendOptions) => invokeAction(\"sendMessage\", payload, sendOptions),\n editMessage: (payload, sendOptions) => invokeAction(\"editMessage\", payload, sendOptions),\n deleteMessage: (payload, sendOptions) => invokeAction(\"deleteMessage\", payload, sendOptions),\n replyToInteraction: (payload, sendOptions) => invokeAction(\"replyToInteraction\", payload, sendOptions),\n deferInteraction: (payload, sendOptions) => invokeAction(\"deferInteraction\", payload, sendOptions),\n followUpInteraction: (payload, sendOptions) => invokeAction(\"followUpInteraction\", payload, sendOptions),\n banMember: (payload, sendOptions) => invokeAction(\"banMember\", payload, sendOptions),\n kickMember: (payload, sendOptions) => invokeAction(\"kickMember\", payload, sendOptions),\n addMemberRole: (payload, sendOptions) => invokeAction(\"addMemberRole\", payload, sendOptions),\n removeMemberRole: (payload, sendOptions) => invokeAction(\"removeMemberRole\", payload, sendOptions),\n };\n\n return {\n actions,\n async ready() {\n await connect();\n if (capabilityError) {\n throw capabilityError;\n }\n },\n async close() {\n isClosed = true;\n isAuthed = false;\n currentConnectionId = null;\n currentCapabilities = { events: [], actions: [] };\n capabilityError = null;\n subscribedEntries.clear();\n rejectConnect(\"App bridge has been closed.\");\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n rejectAllPending(\"DISCONNECTED\", \"App bridge has been closed.\");\n if (!socket) {\n return;\n }\n await new Promise<void>((resolve) => {\n const current = socket;\n if (!current) {\n resolve();\n return;\n }\n current.once(\"close\", () => resolve());\n current.close();\n });\n socket = null;\n },\n connected() {\n return Boolean(socket && socket.readyState === 1 && isAuthed);\n },\n connectionId() {\n return currentConnectionId;\n },\n capabilities() {\n return {\n events: [...currentCapabilities.events],\n actions: [...currentCapabilities.actions],\n };\n },\n on(name, handler, filter?: EventSubscriptionFilter) {\n if (currentCapabilities.events.length > 0 && !currentCapabilities.events.includes(name)) {\n throw new BridgeCapabilityError(\"event\", name, `Event \"${name}\" is not available for this app.`);\n }\n const casted = handler as EventHandler<BotEventName>;\n const subscription: EventSubscription = filter ? { name, filter } : { name };\n const entry: HandlerSubscriptionEntry = {\n handler: casted,\n subscription,\n signature: serializeEventSubscription(subscription),\n };\n const existing = eventHandlers.get(name);\n if (existing) {\n existing.add(entry);\n } else {\n eventHandlers.set(name, new Set<HandlerSubscriptionEntry>([entry]));\n }\n if (this.connected()) {\n syncSubscriptions();\n }\n return () => {\n const handlers = eventHandlers.get(name);\n if (!handlers) {\n return;\n }\n handlers.delete(entry);\n if (handlers.size === 0) {\n eventHandlers.delete(name);\n }\n if (this.connected()) {\n syncSubscriptions();\n }\n };\n },\n off(name, handler) {\n const handlers = eventHandlers.get(name);\n if (!handlers) {\n return;\n }\n for (const entry of [...handlers]) {\n if (entry.handler === (handler as EventHandler<BotEventName>)) {\n handlers.delete(entry);\n }\n }\n if (handlers.size === 0) {\n eventHandlers.delete(name);\n }\n if (this.connected()) {\n syncSubscriptions();\n }\n },\n };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shardwire",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Discord-first bridge between a bot process and external apps over WebSocket.",
|
|
5
5
|
"homepage": "https://www.npmjs.com/package/shardwire",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -28,24 +28,20 @@
|
|
|
28
28
|
"lint": "eslint . --max-warnings=0",
|
|
29
29
|
"lint:fix": "eslint . --fix",
|
|
30
30
|
"test": "vitest run",
|
|
31
|
-
"example:
|
|
32
|
-
"example:
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"verify": "pnpm test && pnpm typecheck && pnpm build",
|
|
36
|
-
"prepublishOnly": "pnpm verify"
|
|
31
|
+
"example:bot": "tsx examples/bot-basic.ts",
|
|
32
|
+
"example:app": "tsx examples/app-basic.ts",
|
|
33
|
+
"verify": "npm run test && npm run typecheck && npm run build",
|
|
34
|
+
"prepublishOnly": "npm run verify"
|
|
37
35
|
},
|
|
38
36
|
"keywords": [
|
|
39
37
|
"discord",
|
|
40
38
|
"discord-bot",
|
|
41
39
|
"websocket",
|
|
42
|
-
"
|
|
40
|
+
"bot-bridge",
|
|
43
41
|
"realtime",
|
|
44
42
|
"typescript",
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"event-stream",
|
|
48
|
-
"typed-events",
|
|
43
|
+
"discord-events",
|
|
44
|
+
"discord-apps",
|
|
49
45
|
"discord-api"
|
|
50
46
|
],
|
|
51
47
|
"author": "Mohammed Haism <cored.developments@gmail.com>",
|
|
@@ -56,32 +52,24 @@
|
|
|
56
52
|
"engines": {
|
|
57
53
|
"node": ">=18.18"
|
|
58
54
|
},
|
|
59
|
-
"peerDependencies": {
|
|
60
|
-
"discord.js": "^14.0.0"
|
|
61
|
-
},
|
|
62
|
-
"peerDependenciesMeta": {
|
|
63
|
-
"discord.js": {
|
|
64
|
-
"optional": true
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
55
|
"dependencies": {
|
|
68
|
-
"
|
|
69
|
-
"
|
|
56
|
+
"discord-api-types": "^0.38.34",
|
|
57
|
+
"discord.js": "^14.26.2",
|
|
58
|
+
"ws": "^8.20.0"
|
|
70
59
|
},
|
|
71
60
|
"devDependencies": {
|
|
72
|
-
"@eslint/js": "^9.
|
|
73
|
-
"@types/node": "^
|
|
61
|
+
"@eslint/js": "^9.39.4",
|
|
62
|
+
"@types/node": "^25.6.0",
|
|
74
63
|
"@types/ws": "^8.18.1",
|
|
75
|
-
"eslint": "^
|
|
76
|
-
"globals": "^
|
|
77
|
-
"tsup": "^8.5.
|
|
78
|
-
"tsx": "^4.
|
|
79
|
-
"typescript
|
|
80
|
-
"typescript": "^
|
|
81
|
-
"vitest": "^
|
|
64
|
+
"eslint": "^10.2.0",
|
|
65
|
+
"globals": "^17.5.0",
|
|
66
|
+
"tsup": "^8.5.1",
|
|
67
|
+
"tsx": "^4.21.0",
|
|
68
|
+
"typescript": "^6.0.2",
|
|
69
|
+
"typescript-eslint": "^8.58.1",
|
|
70
|
+
"vitest": "^4.1.4"
|
|
82
71
|
},
|
|
83
72
|
"publishConfig": {
|
|
84
73
|
"access": "public"
|
|
85
|
-
}
|
|
86
|
-
"packageManager": "pnpm@10.22.0"
|
|
74
|
+
}
|
|
87
75
|
}
|