experimental-a2 0.6.0 → 0.7.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/CHANGELOG.md +22 -0
- package/dist/ai-server.d.ts +4 -5
- package/dist/ai-server.d.ts.map +1 -1
- package/dist/ai-server.js +8 -7
- package/dist/ai-server.js.map +1 -1
- package/dist/ai.d.ts +334 -2
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +1 -1
- package/dist/client.d.ts +202 -2
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1025 -1
- package/dist/client.js.map +1 -0
- package/dist/errors-BQuJpe82.js.map +1 -1
- package/dist/index.d.ts +22 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/{internal-DstsI6Re.js → internal-DRXJ56EI.js} +5 -28
- package/dist/internal-DRXJ56EI.js.map +1 -0
- package/dist/react.d.ts +1 -1
- package/dist/react.js +1 -1
- package/dist/scheduler-qstash.d.ts +3 -3
- package/dist/scheduler-qstash.js +4 -5
- package/dist/scheduler-qstash.js.map +1 -1
- package/dist/scheduler-vercel.d.ts +2 -2
- package/dist/scheduler-vercel.js +4 -4
- package/dist/scheduler-vercel.js.map +1 -1
- package/dist/{server-Duw6MVlB.js → server-286j79Mt.js} +708 -79
- package/dist/server-286j79Mt.js.map +1 -0
- package/dist/{server-DpvjhdoE.d.ts → server-DgXmORIq.d.ts} +67 -49
- package/dist/server-DgXmORIq.d.ts.map +1 -0
- package/dist/server.d.ts +3 -3
- package/dist/server.js +1 -1
- package/dist/store-N8PXxDAS.js.map +1 -1
- package/dist/{store-DysUkTH3.d.ts → store-flRz1OWh.d.ts} +2 -57
- package/dist/store-flRz1OWh.d.ts.map +1 -0
- package/dist/store-memory.d.ts +1 -1
- package/dist/store-memory.d.ts.map +1 -1
- package/dist/store-memory.js +1 -59
- package/dist/store-memory.js.map +1 -1
- package/dist/{store-polling-dSeLxzfb.js → store-polling-6DW7F1DT.js} +2 -2
- package/dist/{store-polling-dSeLxzfb.js.map → store-polling-6DW7F1DT.js.map} +1 -1
- package/dist/store-postgres.d.ts +1 -1
- package/dist/store-postgres.js +1 -81
- package/dist/store-postgres.js.map +1 -1
- package/dist/{store-redis-core-BFLwz0Wj.js → store-redis-core-DEYO8Ryv.js} +48 -134
- package/dist/store-redis-core-DEYO8Ryv.js.map +1 -0
- package/dist/store-redis-http.d.ts +1 -1
- package/dist/store-redis-http.js +2 -3
- package/dist/store-redis-http.js.map +1 -1
- package/dist/store-redis.d.ts +1 -1
- package/dist/store-redis.js +3 -4
- package/dist/store-redis.js.map +1 -1
- package/dist/store-sqlite.d.ts +1 -1
- package/dist/store-sqlite.d.ts.map +1 -1
- package/dist/store-sqlite.js +1 -72
- package/dist/store-sqlite.js.map +1 -1
- package/dist/{wire-BFQmSJ-9.js → wire-B6te_wns.js} +4 -3
- package/dist/wire-B6te_wns.js.map +1 -0
- package/docs/guides/03-react.mdx +20 -28
- package/docs/guides/05-production.mdx +9 -11
- package/docs/guides/06-ai-agents.mdx +8 -14
- package/docs/guides/09-presence.mdx +14 -19
- package/docs/guides/10-transports.mdx +104 -86
- package/docs/reference/01-api.mdx +143 -277
- package/docs/reference/02-errors.mdx +5 -7
- package/package.json +1 -14
- package/src/ai-server.ts +9 -5
- package/src/client.ts +2 -2
- package/src/errors.ts +1 -0
- package/src/internal.ts +3 -62
- package/src/push-envelope.ts +24 -21
- package/src/scheduler-qstash.ts +3 -3
- package/src/scheduler-vercel.ts +2 -2
- package/src/server-fetch.ts +344 -0
- package/src/server.ts +73 -225
- package/src/session-socket.ts +36 -20
- package/src/sse.ts +2 -2
- package/src/store-memory.ts +0 -81
- package/src/store-postgres.ts +0 -100
- package/src/store-redis-core.ts +47 -211
- package/src/store-redis-http.ts +0 -1
- package/src/store-redis.ts +0 -1
- package/src/store-sqlite.ts +0 -119
- package/src/store.ts +0 -60
- package/src/wire.ts +2 -1
- package/dist/ai-D_PGS-JR.d.ts +0 -334
- package/dist/ai-D_PGS-JR.d.ts.map +0 -1
- package/dist/cli-B3VuxoDe.js +0 -599
- package/dist/cli-B3VuxoDe.js.map +0 -1
- package/dist/cli-bin.d.ts +0 -1
- package/dist/cli-bin.js +0 -7
- package/dist/cli-bin.js.map +0 -1
- package/dist/cli.d.ts +0 -20
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -2
- package/dist/client-CdMqi7mC.d.ts +0 -202
- package/dist/client-CdMqi7mC.d.ts.map +0 -1
- package/dist/client-Dj5d3SP_.js +0 -1026
- package/dist/client-Dj5d3SP_.js.map +0 -1
- package/dist/devtools-J_jZ2vQf.d.ts +0 -152
- package/dist/devtools-J_jZ2vQf.d.ts.map +0 -1
- package/dist/devtools-kJJaORn-.js +0 -340
- package/dist/devtools-kJJaORn-.js.map +0 -1
- package/dist/devtools-server.browser.d.ts +0 -1
- package/dist/devtools-server.browser.js +0 -6
- package/dist/devtools-server.browser.js.map +0 -1
- package/dist/devtools-server.d.ts +0 -23
- package/dist/devtools-server.d.ts.map +0 -1
- package/dist/devtools-server.js +0 -1270
- package/dist/devtools-server.js.map +0 -1
- package/dist/devtools.d.ts +0 -2
- package/dist/devtools.js +0 -2
- package/dist/errors-W6nwJ-fm.d.ts +0 -21
- package/dist/errors-W6nwJ-fm.d.ts.map +0 -1
- package/dist/http.d.ts +0 -151
- package/dist/http.d.ts.map +0 -1
- package/dist/http.js +0 -706
- package/dist/http.js.map +0 -1
- package/dist/inspection-DaxB5jM2.js +0 -13
- package/dist/inspection-DaxB5jM2.js.map +0 -1
- package/dist/internal-DstsI6Re.js.map +0 -1
- package/dist/platform-B4TnJtWu.js +0 -34
- package/dist/platform-B4TnJtWu.js.map +0 -1
- package/dist/server-DpvjhdoE.d.ts.map +0 -1
- package/dist/server-Duw6MVlB.js.map +0 -1
- package/dist/store-DysUkTH3.d.ts.map +0 -1
- package/dist/store-redis-core-BFLwz0Wj.js.map +0 -1
- package/dist/testing.browser.d.ts +0 -1
- package/dist/testing.browser.js +0 -6
- package/dist/testing.browser.js.map +0 -1
- package/dist/testing.d.ts +0 -32
- package/dist/testing.d.ts.map +0 -1
- package/dist/testing.js +0 -103
- package/dist/testing.js.map +0 -1
- package/dist/wire-BFQmSJ-9.js.map +0 -1
- package/docs/guides/07-devtools.mdx +0 -229
- package/src/cli-bin.ts +0 -5
- package/src/cli.ts +0 -1046
- package/src/devtools-app.ts +0 -989
- package/src/devtools-server.browser.ts +0 -5
- package/src/devtools-server.ts +0 -604
- package/src/devtools.ts +0 -716
- package/src/http.ts +0 -394
- package/src/inspection.ts +0 -39
- package/src/testing.browser.ts +0 -5
- package/src/testing.ts +0 -185
package/dist/cli-B3VuxoDe.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-B3VuxoDe.js","names":["nodeOpen","readFile","nodeReadFile"],"sources":["../src/cli.ts"],"sourcesContent":["import { open as nodeOpen, readFile as nodeReadFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport {\n DEVTOOLS_PROTOCOL_VERSION,\n DEVTOOLS_SESSION_PAGE_LIMIT,\n devtoolsSessionRevision,\n parseDevtoolsCapture,\n verifyDevtoolsCapture,\n type DevtoolsCapture,\n type DevtoolsContractsResponse,\n type DevtoolsSessionDetail,\n type DevtoolsSessionPage,\n type DevtoolsSessionsResponse,\n} from './devtools.ts'\n\nexport const DEVTOOLS_CLI_EXIT_ERROR = 1 as const\nexport const DEVTOOLS_CLI_EXIT_CHECK_FAILED = 2 as const\n\ntype OutputFormat = 'human' | 'json' | 'ndjson'\ntype Command = 'contracts' | 'sessions' | 'show' | 'export' | 'check' | 'verify'\n\nexport type DevtoolsCliOptions = {\n fetch?: typeof globalThis.fetch\n env?: Readonly<Record<string, string | undefined>>\n cwd?: string\n stdout?: (text: string) => void\n stderr?: (text: string) => void\n readFile?: (path: string) => Promise<Uint8Array>\n writeFile?: (\n path: string,\n data: Uint8Array,\n options: { flag: 'w' | 'wx'; mode: number },\n ) => Promise<void>\n}\n\ntype ParsedArguments = {\n command: Command | null\n help: boolean\n url: string | undefined\n format: OutputFormat\n contract: string | undefined\n session: string | undefined\n cursor: string | undefined\n limit: number | undefined\n output: string | undefined\n force: boolean\n bearerEnv: string | undefined\n headerEnvs: string[]\n settled: boolean\n noDeadLetters: boolean\n noCaughtFailures: boolean\n maxRedispatches: number | undefined\n positionals: string[]\n}\n\ntype CheckSummary = {\n ok: boolean\n contract: string\n sessionId: string\n revision: string\n eventCount: number\n snapshotCount: number\n pendingCount: number\n deadLetterCount: number\n caughtFailureCount: number\n redispatchCount: number\n failures: string[]\n}\n\nclass CliFailure extends Error {\n readonly exitCode: number\n\n constructor(message: string, exitCode: number = DEVTOOLS_CLI_EXIT_ERROR) {\n super(message)\n this.name = 'CliFailure'\n this.exitCode = exitCode\n }\n}\n\nclass IntegrityFailure extends CliFailure {\n constructor(message: string) {\n super(message, DEVTOOLS_CLI_EXIT_CHECK_FAILED)\n this.name = 'IntegrityFailure'\n }\n}\n\nconst USAGE = `Usage: a2 devtools <command> [options]\n\nCommands:\n contracts List mounted contracts\n sessions --contract NAME List a contract's sessions\n show --contract NAME --session ID\n Show one durable session\n export --contract NAME --session ID [--output FILE]\n Save an integrity-protected .a2log capture\n check --contract NAME --session ID [assertions]\n Verify a live session capture\n verify FILE Verify a saved .a2log capture\n\nConnection:\n --url URL Mounted devtools URL (or A2_DEVTOOLS_URL)\n --bearer-env ENV Read a bearer token from ENV\n --header-env HEADER=ENV Read a request header from ENV; repeatable\n\nOutput:\n --format human|json|ndjson Human output is the default\n --output FILE, -o FILE Export destination\n --force Allow export to replace FILE\n\nCheck assertions:\n --settled Require no pending events\n --no-dead-letters Require no dead-lettered events\n --no-caught-failures Require no caught handler failures\n --max-redispatches N Limit dispatches after each event's first claim\n`\n\nconst commandNames = new Set<Command>([\n 'contracts',\n 'sessions',\n 'show',\n 'export',\n 'check',\n 'verify',\n])\n\nconst fail = (message: string): never => {\n throw new CliFailure(message)\n}\n\nconst nextValue = (\n argv: readonly string[],\n index: number,\n option: string,\n): { value: string; next: number } => {\n const token = argv[index]!\n const equals = token.indexOf('=')\n if (equals !== -1) {\n const value = token.slice(equals + 1)\n if (value.length === 0) fail(`${option} requires a value`)\n return { value, next: index }\n }\n const value = argv[index + 1]\n if (value === undefined || value.startsWith('-')) {\n fail(`${option} requires a value`)\n }\n return { value: value!, next: index + 1 }\n}\n\nconst nonNegativeInteger = (value: string, option: string): number => {\n const parsed = Number(value)\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n fail(`${option} must be a non-negative integer`)\n }\n return parsed\n}\n\nconst positiveInteger = (value: string, option: string): number => {\n const parsed = nonNegativeInteger(value, option)\n if (parsed === 0) fail(`${option} must be a positive integer`)\n return parsed\n}\n\nconst parseArguments = (argv: readonly string[]): ParsedArguments => {\n if (argv[0] !== 'devtools') {\n if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {\n return {\n command: null,\n help: true,\n url: undefined,\n format: 'human',\n contract: undefined,\n session: undefined,\n cursor: undefined,\n limit: undefined,\n output: undefined,\n force: false,\n bearerEnv: undefined,\n headerEnvs: [],\n settled: false,\n noDeadLetters: false,\n noCaughtFailures: false,\n maxRedispatches: undefined,\n positionals: [],\n }\n }\n fail(\"expected the 'devtools' command namespace\")\n }\n\n const parsed: ParsedArguments = {\n command: null,\n help: false,\n url: undefined,\n format: 'human',\n contract: undefined,\n session: undefined,\n cursor: undefined,\n limit: undefined,\n output: undefined,\n force: false,\n bearerEnv: undefined,\n headerEnvs: [],\n settled: false,\n noDeadLetters: false,\n noCaughtFailures: false,\n maxRedispatches: undefined,\n positionals: [],\n }\n\n for (let index = 1; index < argv.length; index += 1) {\n const token = argv[index]!\n if (token === '--help' || token === '-h' || token === 'help') {\n parsed.help = true\n continue\n }\n if (\n token === '--token' ||\n token.startsWith('--token=') ||\n token === '--bearer' ||\n token.startsWith('--bearer=') ||\n token === '--header' ||\n token.startsWith('--header=')\n ) {\n fail(\n 'literal credential flags are not supported; use A2_DEVTOOLS_TOKEN, --bearer-env, or --header-env',\n )\n }\n if (token === '--force') {\n parsed.force = true\n continue\n }\n if (token === '--settled') {\n parsed.settled = true\n continue\n }\n if (token === '--no-dead-letters') {\n parsed.noDeadLetters = true\n continue\n }\n if (token === '--no-caught-failures') {\n parsed.noCaughtFailures = true\n continue\n }\n\n const option = token.split('=', 1)[0]!\n if (\n option === '--url' ||\n option === '--format' ||\n option === '--contract' ||\n option === '--session' ||\n option === '--cursor' ||\n option === '--limit' ||\n option === '--output' ||\n option === '-o' ||\n option === '--bearer-env' ||\n option === '--header-env' ||\n option === '--max-redispatches'\n ) {\n const result = nextValue(argv, index, option)\n index = result.next\n switch (option) {\n case '--url':\n parsed.url = result.value\n break\n case '--format':\n if (\n result.value !== 'human' &&\n result.value !== 'json' &&\n result.value !== 'ndjson'\n ) {\n fail('--format must be human, json, or ndjson')\n }\n parsed.format = result.value as OutputFormat\n break\n case '--contract':\n parsed.contract = result.value\n break\n case '--session':\n parsed.session = result.value\n break\n case '--cursor':\n parsed.cursor = result.value\n break\n case '--limit':\n parsed.limit = positiveInteger(result.value, '--limit')\n break\n case '--output':\n case '-o':\n parsed.output = result.value\n break\n case '--bearer-env':\n parsed.bearerEnv = result.value\n break\n case '--header-env':\n parsed.headerEnvs.push(result.value)\n break\n case '--max-redispatches':\n parsed.maxRedispatches = nonNegativeInteger(\n result.value,\n '--max-redispatches',\n )\n break\n }\n continue\n }\n if (token.startsWith('-')) fail(`unknown option '${token}'`)\n if (parsed.command === null && commandNames.has(token as Command)) {\n parsed.command = token as Command\n continue\n }\n if (parsed.command === null) fail(`unknown devtools command '${token}'`)\n parsed.positionals.push(token)\n }\n return parsed\n}\n\nconst required = (value: string | undefined, option: string): string => {\n if (value === undefined) fail(`${option} is required`)\n return value!\n}\n\nconst assertCommandArguments = (args: ParsedArguments): void => {\n if (args.command === null) return\n if (args.command === 'verify') {\n if (args.positionals.length !== 1) {\n fail('verify requires exactly one capture file')\n }\n return\n }\n if (args.positionals.length > 0) {\n fail(`unexpected argument '${args.positionals[0]}'`)\n }\n if (args.command !== 'contracts') {\n required(args.contract, '--contract')\n }\n if (\n args.command === 'show' ||\n args.command === 'export' ||\n args.command === 'check'\n ) {\n required(args.session, '--session')\n }\n}\n\nconst baseUrl = (value: string): URL => {\n const url = (() => {\n try {\n return new URL(value)\n } catch {\n return fail('--url must be an absolute HTTP(S) URL')\n }\n })()\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n fail('--url must use HTTP or HTTPS')\n }\n if (url.username || url.password) {\n fail('credentials must not be embedded in --url')\n }\n if (url.search || url.hash) {\n fail('--url must not contain a query string or fragment')\n }\n url.pathname = `${url.pathname.replace(/\\/+$/, '')}/`\n return url\n}\n\nconst environmentName = (value: string, option: string): string => {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(value)) {\n fail(`${option} must reference a valid environment variable name`)\n }\n return value\n}\n\nconst requestHeaders = (\n args: ParsedArguments,\n env: Readonly<Record<string, string | undefined>>,\n accept: string,\n): Headers => {\n const headers = new Headers({ accept })\n const bearerName =\n args.bearerEnv === undefined\n ? 'A2_DEVTOOLS_TOKEN'\n : environmentName(args.bearerEnv, '--bearer-env')\n const bearer = env[bearerName]\n if (args.bearerEnv !== undefined && !bearer) {\n fail(`environment variable '${bearerName}' is not set`)\n }\n if (bearer) headers.set('authorization', `Bearer ${bearer}`)\n\n for (const mapping of args.headerEnvs) {\n const equals = mapping.indexOf('=')\n if (equals < 1 || equals === mapping.length - 1) {\n fail('--header-env must use HEADER=ENV')\n }\n const name = mapping.slice(0, equals)\n const envName = environmentName(mapping.slice(equals + 1), '--header-env')\n const value = env[envName]\n if (!value) fail(`environment variable '${envName}' is not set`)\n if (headers.has(name)) fail(`request header '${name}' was configured twice`)\n try {\n headers.set(name, value!)\n } catch {\n fail(`--header-env contains an invalid header name or value`)\n }\n }\n return headers\n}\n\nconst resourceUrl = (\n base: URL,\n resource: string,\n params: Readonly<Record<string, string | number | undefined>>,\n): URL => {\n const url = new URL(`_a2/${resource}`, base)\n for (const [name, value] of Object.entries(params)) {\n if (value !== undefined) url.searchParams.set(name, String(value))\n }\n return url\n}\n\nconst terminalText = (value: string): string =>\n [...value]\n .map((character) => {\n const codePoint = character.codePointAt(0)!\n const isControl =\n codePoint <= 0x1f ||\n (codePoint >= 0x7f && codePoint <= 0x9f) ||\n codePoint === 0x2028 ||\n codePoint === 0x2029\n if (!isControl) return character\n if (character === '\\n') return '\\\\n'\n if (character === '\\r') return '\\\\r'\n if (character === '\\t') return '\\\\t'\n return codePoint <= 0xff\n ? `\\\\x${codePoint.toString(16).padStart(2, '0')}`\n : `\\\\u${codePoint.toString(16).padStart(4, '0')}`\n })\n .join('')\n\nconst fetchResponse = async (\n fetcher: typeof globalThis.fetch,\n url: URL,\n headers: Headers,\n resource: string,\n): Promise<Response> => {\n let response: Response\n try {\n response = await fetcher(url, {\n method: 'GET',\n headers,\n redirect: 'manual',\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new CliFailure(`could not fetch ${resource}: ${message}`)\n }\n if (!response.ok) {\n let text = ''\n try {\n text = await response.text()\n } catch {\n // The status remains useful when an error response has an unreadable body.\n }\n const detail = terminalText(text.trim().slice(0, 300))\n throw new CliFailure(\n `${resource} returned ${response.status}${detail ? `: ${detail}` : ''}`,\n )\n }\n return response\n}\n\nconst responseText = async (\n fetcher: typeof globalThis.fetch,\n url: URL,\n headers: Headers,\n resource: string,\n): Promise<string> =>\n (await fetchResponse(fetcher, url, headers, resource)).text()\n\nconst responseBytes = async (\n fetcher: typeof globalThis.fetch,\n url: URL,\n headers: Headers,\n resource: string,\n): Promise<Uint8Array> =>\n new Uint8Array(\n await (await fetchResponse(fetcher, url, headers, resource)).arrayBuffer(),\n )\n\nconst objectValue = (value: unknown): Record<string, unknown> | null =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n\nconst parseJson = (text: string, resource: string): unknown => {\n try {\n return JSON.parse(text) as unknown\n } catch {\n throw new CliFailure(`${resource} did not return valid JSON`)\n }\n}\n\nconst assertProtocol = (\n value: Record<string, unknown>,\n resource: string,\n): void => {\n if (value['protocolVersion'] !== DEVTOOLS_PROTOCOL_VERSION) {\n throw new CliFailure(`${resource} returned an unsupported protocol version`)\n }\n}\n\nconst hasContractName = (value: unknown): boolean => {\n const object = objectValue(value)\n return typeof object?.['name'] === 'string' && object['name'].length > 0\n}\n\nconst contractsResponse = (value: unknown): DevtoolsContractsResponse => {\n const object = objectValue(value)\n if (!object) throw new CliFailure('contracts returned an invalid response')\n assertProtocol(object, 'contracts')\n if (\n !Array.isArray(object['contracts']) ||\n !object['contracts'].every(hasContractName)\n ) {\n throw new CliFailure('contracts returned an invalid response')\n }\n return object as DevtoolsContractsResponse\n}\n\nconst sessionsResponse = (value: unknown): DevtoolsSessionsResponse => {\n const object = objectValue(value)\n if (!object) throw new CliFailure('sessions returned an invalid response')\n assertProtocol(object, 'sessions')\n if (\n !Array.isArray(object['sessions']) ||\n (object['cursor'] !== null && typeof object['cursor'] !== 'string')\n ) {\n throw new CliFailure('sessions returned an invalid response')\n }\n return object as DevtoolsSessionsResponse\n}\n\nconst sessionResponse = (value: unknown): DevtoolsSessionDetail => {\n const object = objectValue(value)\n if (!object) throw new CliFailure('session returned an invalid response')\n assertProtocol(object, 'session')\n if (\n typeof object['contract'] !== 'string' ||\n typeof object['sessionId'] !== 'string' ||\n typeof object['revision'] !== 'string' ||\n !Array.isArray(object['events']) ||\n !Array.isArray(object['snapshots'])\n ) {\n throw new CliFailure('session returned an invalid response')\n }\n return object as DevtoolsSessionDetail\n}\n\nconst sessionPageResponse = (value: unknown): DevtoolsSessionPage => {\n const object = objectValue(value)\n if (!object) throw new CliFailure('session returned an invalid response')\n assertProtocol(object, 'session')\n if (\n typeof object['contract'] !== 'string' ||\n typeof object['sessionId'] !== 'string' ||\n !Number.isSafeInteger(object['throughIndex']) ||\n (object['throughIndex'] as number) < 0 ||\n (object['cursor'] !== null && typeof object['cursor'] !== 'string') ||\n !Array.isArray(object['events']) ||\n !Array.isArray(object['snapshots'])\n ) {\n throw new CliFailure('session returned an invalid response')\n }\n return object as DevtoolsSessionPage\n}\n\nconst readSessionDetail = async (\n fetcher: typeof globalThis.fetch,\n base: URL,\n headers: Headers,\n contract: string,\n session: string,\n): Promise<DevtoolsSessionDetail> => {\n const events: DevtoolsSessionDetail['events'] = []\n let snapshots: DevtoolsSessionDetail['snapshots'] = []\n let cursor: string | undefined\n let throughIndex: number | undefined\n const seenCursors = new Set<string>()\n for (;;) {\n // oxlint-disable-next-line no-await-in-loop -- each HTTP request advances one frozen session page\n const text = await responseText(\n fetcher,\n resourceUrl(base, 'session', {\n contract,\n session,\n limit: DEVTOOLS_SESSION_PAGE_LIMIT,\n cursor,\n }),\n headers,\n 'session',\n )\n const parsed = parseJson(text, 'session')\n const object = objectValue(parsed)\n if (object && typeof object['revision'] === 'string') {\n if (events.length > 0) {\n throw new CliFailure('session changed response shape between pages')\n }\n return sessionResponse(parsed)\n }\n const page = sessionPageResponse(parsed)\n if (page.contract !== contract || page.sessionId !== session) {\n throw new CliFailure('session page returned a different identity')\n }\n if (throughIndex === undefined) {\n throughIndex = page.throughIndex\n snapshots = page.snapshots\n } else if (\n page.throughIndex !== throughIndex ||\n page.snapshots.length > 0\n ) {\n throw new CliFailure('session page changed its frozen frontier')\n }\n for (const event of page.events) {\n if (event.index !== events.length + 1 || event.index > throughIndex) {\n throw new CliFailure('session event pages are not contiguous')\n }\n events.push(event)\n }\n if (page.cursor === null) break\n if (\n page.events.length === 0 ||\n events.length === throughIndex ||\n seenCursors.has(page.cursor)\n ) {\n throw new CliFailure('session cursor did not advance')\n }\n seenCursors.add(page.cursor)\n cursor = page.cursor\n }\n if (throughIndex !== events.length) {\n throw new CliFailure('session ended before its frozen frontier')\n }\n return {\n protocolVersion: DEVTOOLS_PROTOCOL_VERSION,\n contract,\n sessionId: session,\n revision: await devtoolsSessionRevision({ events, snapshots }),\n events,\n snapshots,\n }\n}\n\nconst jsonText = (value: unknown): string =>\n `${JSON.stringify(value, null, 2)}\\n`\n\nconst ndjsonText = (values: readonly unknown[]): string =>\n values.map((value) => JSON.stringify(value)).join('\\n') +\n (values.length === 0 ? '' : '\\n')\n\nconst humanContracts = (response: DevtoolsContractsResponse): string =>\n response.contracts.length === 0\n ? 'No contracts.\\n'\n : `${response.contracts.map((contract) => terminalText(contract.name)).join('\\n')}\\n`\n\nconst humanSessions = (response: DevtoolsSessionsResponse): string => {\n if (response.sessions.length === 0) return 'No sessions.\\n'\n const rows = response.sessions.map((session) =>\n [\n terminalText(session.sessionId),\n session.eventCount,\n session.pendingCount,\n session.failedCount,\n session.attemptCount,\n session.failureCount,\n terminalText(session.updatedAt),\n ].join('\\t'),\n )\n return (\n [\n 'SESSION\\tEVENTS\\tPENDING\\tDEAD\\tATTEMPTS\\tFAILURES\\tUPDATED',\n ...rows,\n ].join('\\n') + '\\n'\n )\n}\n\nconst humanSession = (detail: DevtoolsSessionDetail): string => {\n const rows = detail.events.map((event) => {\n const status = event.failedAt\n ? 'dead-lettered'\n : event.processedAt\n ? 'completed'\n : 'pending'\n return `${event.index}\\t${status}\\t${terminalText(event.type)}\\t${terminalText(event.id)}`\n })\n const heading = `${terminalText(detail.contract)}/${terminalText(detail.sessionId)}: ${detail.events.length} events, ${detail.snapshots.length} snapshots\\n`\n return rows.length === 0\n ? heading\n : `${heading}INDEX\\tSTATUS\\tTYPE\\tID\\n${rows.join('\\n')}\\n`\n}\n\nconst emitResponse = (\n format: OutputFormat,\n value: unknown,\n ndjson: readonly unknown[],\n human: string,\n stdout: (text: string) => void,\n): void => {\n if (format === 'json') stdout(jsonText(value))\n else if (format === 'ndjson') stdout(ndjsonText(ndjson))\n else stdout(human)\n}\n\nconst parseAndVerifyCapture = async (\n bytes: Uint8Array,\n): Promise<DevtoolsCapture> => {\n let text: string\n try {\n text = new TextDecoder('utf-8', { fatal: true }).decode(bytes)\n } catch {\n throw new IntegrityFailure('capture is not valid UTF-8')\n }\n try {\n const capture = parseDevtoolsCapture(text)\n await verifyDevtoolsCapture(capture)\n return capture\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new IntegrityFailure(message)\n }\n}\n\nconst captureSummary = (capture: DevtoolsCapture): CheckSummary => {\n let pendingCount = 0\n let deadLetterCount = 0\n let caughtFailureCount = 0\n let redispatchCount = 0\n for (const event of capture.events) {\n if (event.processedAt === null && event.failedAt === null) pendingCount += 1\n if (event.failedAt !== null) deadLetterCount += 1\n if (\n !Number.isSafeInteger(event.failureCount) ||\n event.failureCount < 0 ||\n !Number.isSafeInteger(event.attemptCount) ||\n event.attemptCount < 0\n ) {\n throw new IntegrityFailure(\n `event #${event.index} has invalid attempt or failure counts`,\n )\n }\n caughtFailureCount += event.failureCount\n redispatchCount += Math.max(0, event.attemptCount - 1)\n }\n return {\n ok: true,\n contract: capture.contract,\n sessionId: capture.sessionId,\n revision: capture.revision,\n eventCount: capture.events.length,\n snapshotCount: capture.snapshots.length,\n pendingCount,\n deadLetterCount,\n caughtFailureCount,\n redispatchCount,\n failures: [],\n }\n}\n\nconst checkSummary = (\n capture: DevtoolsCapture,\n args: ParsedArguments,\n): CheckSummary => {\n const summary = captureSummary(capture)\n if (capture.contract !== args.contract) {\n summary.failures.push(\n `capture contract '${capture.contract}' does not match '${args.contract}'`,\n )\n }\n if (capture.sessionId !== args.session) {\n summary.failures.push(\n `capture session '${capture.sessionId}' does not match '${args.session}'`,\n )\n }\n if (args.settled && summary.pendingCount > 0) {\n summary.failures.push(`${summary.pendingCount} event(s) are pending`)\n }\n if (args.noDeadLetters && summary.deadLetterCount > 0) {\n summary.failures.push(\n `${summary.deadLetterCount} event(s) are dead-lettered`,\n )\n }\n if (args.noCaughtFailures && summary.caughtFailureCount > 0) {\n summary.failures.push(\n `${summary.caughtFailureCount} caught handler failure(s) were recorded`,\n )\n }\n if (\n args.maxRedispatches !== undefined &&\n summary.redispatchCount > args.maxRedispatches\n ) {\n summary.failures.push(\n `${summary.redispatchCount} redispatch(es) exceed the limit of ${args.maxRedispatches}`,\n )\n }\n summary.ok = summary.failures.length === 0\n return summary\n}\n\nconst assertCaptureIdentity = (\n capture: DevtoolsCapture,\n contract: string,\n sessionId: string,\n): void => {\n if (capture.contract !== contract) {\n throw new IntegrityFailure(\n `capture contract '${capture.contract}' does not match '${contract}'`,\n )\n }\n if (capture.sessionId !== sessionId) {\n throw new IntegrityFailure(\n `capture session '${capture.sessionId}' does not match '${sessionId}'`,\n )\n }\n}\n\nconst humanCheck = (summary: CheckSummary, verb: string): string =>\n `${verb} ${terminalText(summary.contract)}/${terminalText(summary.sessionId)}: ${summary.eventCount} events, ${summary.snapshotCount} snapshots, ${summary.pendingCount} pending, ${summary.deadLetterCount} dead-lettered, ${summary.caughtFailureCount} caught failures, ${summary.redispatchCount} redispatches\\n`\n\nconst defaultCaptureName = (contract: string, sessionId: string): string => {\n const safe = `${contract}-${sessionId}`\n .replaceAll(/[^a-zA-Z0-9._-]/g, '_')\n .slice(0, 160)\n return `${safe || 'a2-session'}.a2log`\n}\n\nconst errorCode = (error: unknown): string | undefined => {\n const object = objectValue(error)\n return typeof object?.['code'] === 'string' ? object['code'] : undefined\n}\n\nconst writeCaptureFile = async (\n path: string,\n data: Uint8Array,\n options: { flag: 'w' | 'wx'; mode: number },\n): Promise<void> => {\n const file = await nodeOpen(path, options.flag, options.mode)\n try {\n await file.chmod(options.mode)\n await file.writeFile(data)\n } finally {\n await file.close()\n }\n}\n\n/** Run the `a2 devtools` command namespace and return its process exit code. */\nexport async function runCli(\n argv: readonly string[],\n options: DevtoolsCliOptions = {},\n): Promise<number> {\n const stdout =\n options.stdout ?? ((text: string) => process.stdout.write(text))\n const stderr =\n options.stderr ?? ((text: string) => process.stderr.write(text))\n const env = options.env ?? process.env\n const fetcher = options.fetch ?? globalThis.fetch\n const cwd = options.cwd ?? process.cwd()\n const readFile = options.readFile ?? nodeReadFile\n const writeFile = options.writeFile ?? writeCaptureFile\n\n try {\n const args = parseArguments(argv)\n if (args.help || args.command === null) {\n stdout(USAGE)\n return 0\n }\n assertCommandArguments(args)\n\n if (args.command === 'verify') {\n const path = resolve(cwd, args.positionals[0]!)\n let bytes: Uint8Array\n try {\n bytes = await readFile(path)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new CliFailure(`could not read '${path}': ${message}`)\n }\n const summary = captureSummary(await parseAndVerifyCapture(bytes))\n emitResponse(\n args.format,\n summary,\n [summary],\n humanCheck(summary, 'Verified'),\n stdout,\n )\n return 0\n }\n\n const configuredUrl = args.url ?? env['A2_DEVTOOLS_URL']\n if (!configuredUrl) {\n fail('--url or A2_DEVTOOLS_URL is required')\n }\n const base = baseUrl(configuredUrl!)\n const headers = requestHeaders(args, env, 'application/json')\n\n if (args.command === 'contracts') {\n const text = await responseText(\n fetcher,\n resourceUrl(base, 'contracts', {}),\n headers,\n 'contracts',\n )\n const response = contractsResponse(parseJson(text, 'contracts'))\n emitResponse(\n args.format,\n response,\n response.contracts,\n humanContracts(response),\n stdout,\n )\n return 0\n }\n\n const contract = required(args.contract, '--contract')\n if (args.command === 'sessions') {\n const text = await responseText(\n fetcher,\n resourceUrl(base, 'sessions', {\n contract,\n cursor: args.cursor,\n limit: args.limit,\n }),\n headers,\n 'sessions',\n )\n const response = sessionsResponse(parseJson(text, 'sessions'))\n emitResponse(\n args.format,\n response,\n response.sessions,\n humanSessions(response),\n stdout,\n )\n return 0\n }\n\n const session = required(args.session, '--session')\n if (args.command === 'show') {\n const detail = await readSessionDetail(\n fetcher,\n base,\n headers,\n contract,\n session,\n )\n emitResponse(\n args.format,\n detail,\n [\n {\n kind: 'session',\n protocolVersion: detail.protocolVersion,\n contract: detail.contract,\n sessionId: detail.sessionId,\n revision: detail.revision,\n },\n ...detail.events.map((event) => ({ ...event, kind: 'event' })),\n ...detail.snapshots.map((snapshot) => ({\n ...snapshot,\n kind: 'snapshot',\n })),\n ],\n humanSession(detail),\n stdout,\n )\n return 0\n }\n\n const exportHeaders = requestHeaders(args, env, 'application/x-ndjson')\n const captureBytes = await responseBytes(\n fetcher,\n resourceUrl(base, 'export', { contract, session }),\n exportHeaders,\n 'export',\n )\n const capture = await parseAndVerifyCapture(captureBytes)\n\n if (args.command === 'check') {\n const summary = checkSummary(capture, args)\n emitResponse(\n args.format,\n summary,\n [summary],\n humanCheck(summary, summary.ok ? 'Checked' : 'Check failed for'),\n stdout,\n )\n if (!summary.ok) {\n for (const failure of summary.failures) {\n stderr(`a2 devtools: ${terminalText(failure)}\\n`)\n }\n return DEVTOOLS_CLI_EXIT_CHECK_FAILED\n }\n return 0\n }\n\n assertCaptureIdentity(capture, contract, session)\n\n const output = resolve(\n cwd,\n args.output ?? defaultCaptureName(contract, session),\n )\n try {\n await writeFile(output, captureBytes, {\n flag: args.force ? 'w' : 'wx',\n mode: 0o600,\n })\n } catch (error) {\n if (errorCode(error) === 'EEXIST') {\n throw new CliFailure(\n `'${output}' already exists; pass --force to replace it`,\n )\n }\n const message = error instanceof Error ? error.message : String(error)\n throw new CliFailure(`could not write '${output}': ${message}`)\n }\n const result = {\n path: output,\n contract: capture.contract,\n sessionId: capture.sessionId,\n eventCount: capture.events.length,\n snapshotCount: capture.snapshots.length,\n sha256: capture.footer.sha256,\n }\n emitResponse(\n args.format,\n result,\n [result],\n `Exported ${terminalText(capture.contract)}/${terminalText(capture.sessionId)}: ${capture.events.length} events, ${capture.snapshots.length} snapshots -> ${terminalText(output)}\\n`,\n stdout,\n )\n return 0\n } catch (error) {\n const failure =\n error instanceof CliFailure\n ? error\n : new CliFailure(error instanceof Error ? error.message : String(error))\n stderr(`a2 devtools: ${terminalText(failure.message)}\\n`)\n return failure.exitCode\n }\n}\n"],"mappings":"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"}
|
package/dist/cli-bin.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {}
|
package/dist/cli-bin.js
DELETED
package/dist/cli-bin.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-bin.js","names":[],"sources":["../src/cli-bin.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { runCli } from './cli.ts'\n\nprocess.exitCode = await runCli(process.argv.slice(2))\n"],"mappings":";;;AAIA,QAAQ,WAAW,MAAM,OAAO,QAAQ,KAAK,MAAM,CAAC,CAAC"}
|
package/dist/cli.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
//#region src/cli.d.ts
|
|
2
|
-
declare const DEVTOOLS_CLI_EXIT_ERROR: 1;
|
|
3
|
-
declare const DEVTOOLS_CLI_EXIT_CHECK_FAILED: 2;
|
|
4
|
-
type DevtoolsCliOptions = {
|
|
5
|
-
fetch?: typeof globalThis.fetch;
|
|
6
|
-
env?: Readonly<Record<string, string | undefined>>;
|
|
7
|
-
cwd?: string;
|
|
8
|
-
stdout?: (text: string) => void;
|
|
9
|
-
stderr?: (text: string) => void;
|
|
10
|
-
readFile?: (path: string) => Promise<Uint8Array>;
|
|
11
|
-
writeFile?: (path: string, data: Uint8Array, options: {
|
|
12
|
-
flag: "w" | "wx";
|
|
13
|
-
mode: number;
|
|
14
|
-
}) => Promise<void>;
|
|
15
|
-
};
|
|
16
|
-
/** Run the `a2 devtools` command namespace and return its process exit code. */
|
|
17
|
-
declare function runCli(argv: readonly string[], options?: DevtoolsCliOptions): Promise<number>;
|
|
18
|
-
//#endregion
|
|
19
|
-
export { DEVTOOLS_CLI_EXIT_CHECK_FAILED, DEVTOOLS_CLI_EXIT_ERROR, DevtoolsCliOptions, runCli };
|
|
20
|
-
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","names":[],"sources":["../src/cli.ts"],"mappings":";cAea;cACA;KAKD;EACV,eAAe,WAAW;EAC1B,MAAM,SAAS;EACf;EACA,UAAU;EACV,UAAU;EACV,YAAY,iBAAiB,QAAQ;EACrC,aACE,cACA,MAAM,YACN;IAAW;IAAkB;QAC1B;;;iBAozBe,OACpB,yBACA,UAAS,qBACR"}
|
package/dist/cli.js
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import { a as EventDefs, c as PresencePatch, d as WithPresence, o as PresenceDefs, p as Reducer, r as ContractEvent, s as PresenceMap, t as AppendInput } from "./contract-jIfaR085.js";
|
|
2
|
-
//#region src/client.d.ts
|
|
3
|
-
type ConnectionStatus = "idle" | "connecting" | "live" | "closed";
|
|
4
|
-
/**
|
|
5
|
-
* The connection, as a discriminated union — impossible states are
|
|
6
|
-
* unrepresentable: an error only exists while disconnected,
|
|
7
|
-
* `reconnects` only once a connection has been attempted.
|
|
8
|
-
* "Reconnecting…" is `status === 'connecting' && reconnects > 0`.
|
|
9
|
-
*/
|
|
10
|
-
type Connection = {
|
|
11
|
-
status: "idle";
|
|
12
|
-
} | {
|
|
13
|
-
status: "connecting";
|
|
14
|
-
/** Drops of an established stream so far. `0` = first connect. */
|
|
15
|
-
reconnects: number;
|
|
16
|
-
/** Why the last connection ended; `null` on the first connect. */
|
|
17
|
-
error: Error | null;
|
|
18
|
-
} | {
|
|
19
|
-
status: "live";
|
|
20
|
-
reconnects: number;
|
|
21
|
-
} | {
|
|
22
|
-
status: "closed";
|
|
23
|
-
};
|
|
24
|
-
/**
|
|
25
|
-
* What `push` returns: resolves at the server ack (exactly like a
|
|
26
|
-
* plain promise — `await push(...)` gives the acked events), and
|
|
27
|
-
* carries `confirmed` for the later moment when the live stream has
|
|
28
|
-
* delivered the whole batch back and the optimistic overlay entry
|
|
29
|
-
* retired — the view now shows server truth. `confirmed` is lazy:
|
|
30
|
-
* never accessed, never created. A rejected push rejects both.
|
|
31
|
-
*/
|
|
32
|
-
type PushResult<D extends EventDefs> = Promise<ContractEvent<D>[]> & {
|
|
33
|
-
readonly confirmed: Promise<ContractEvent<D>[]>;
|
|
34
|
-
};
|
|
35
|
-
type LoadHistoryOptions = {
|
|
36
|
-
/**
|
|
37
|
-
* Exclusive upper bound for the fetch. Defaults to the oldest
|
|
38
|
-
* already-loaded index — successive calls page backward — or one
|
|
39
|
-
* past the hydration frontier while nothing is loaded yet.
|
|
40
|
-
*/
|
|
41
|
-
before?: number;
|
|
42
|
-
/** Page size; defaults to 50. */
|
|
43
|
-
limit?: number;
|
|
44
|
-
};
|
|
45
|
-
/** Backscroll progress, derived from the raw event feed. */
|
|
46
|
-
type HistoryState = {
|
|
47
|
-
/** A `loadHistory` fetch is in flight. */
|
|
48
|
-
loading: boolean;
|
|
49
|
-
/** The feed reaches index 1 — nothing older remains to fetch. */
|
|
50
|
-
complete: boolean;
|
|
51
|
-
/** The oldest loaded index; `null` while nothing is loaded. */
|
|
52
|
-
oldestLoaded: number | null;
|
|
53
|
-
};
|
|
54
|
-
/** One immutable view of the session — stable identity between changes. */
|
|
55
|
-
type SessionSnapshot<D extends EventDefs, S, P extends PresenceDefs = Record<never, never>> = WithPresence<P, {
|
|
56
|
-
/** The replicated presence map, this client included (local echo). */
|
|
57
|
-
presence: PresenceMap<P>;
|
|
58
|
-
}> & {
|
|
59
|
-
/** The live view: server events folded, optimistic pushes applied. */
|
|
60
|
-
state: S;
|
|
61
|
-
/** The raw event feed: server truth — observed, seeded, or
|
|
62
|
-
* backscrolled via `loadHistory` — plus pending optimistic events
|
|
63
|
-
* (provisional indexes past the frontier). `state` never folds
|
|
64
|
-
* backscrolled events; they are display data below the frontier. */
|
|
65
|
-
events: ContractEvent<D>[];
|
|
66
|
-
/** The stream frontier: the last server-confirmed index. This is the
|
|
67
|
-
* `lastSeenIndex` cancellation wants. */
|
|
68
|
-
index: number;
|
|
69
|
-
/** Backscroll progress — `loadHistory` moves it. */
|
|
70
|
-
history: HistoryState;
|
|
71
|
-
connection: Connection;
|
|
72
|
-
};
|
|
73
|
-
/**
|
|
74
|
-
* The presence member of a client session — intersected in via
|
|
75
|
-
* `WithPresence`, so it exists exactly when the contract declares
|
|
76
|
-
* presence fields.
|
|
77
|
-
*/
|
|
78
|
-
type SessionClientPresence<P extends PresenceDefs> = {
|
|
79
|
-
/**
|
|
80
|
-
* Fire-and-forget presence: validates locally against the reducer's
|
|
81
|
-
* presence schemas, merges into the local map immediately (the
|
|
82
|
-
* echo), and coalesces on the wire to a fixed cadence — a leading
|
|
83
|
-
* send immediately, then at most one merged send per interval,
|
|
84
|
-
* later values winning field-wise. `null` clears a field. No ack,
|
|
85
|
-
* no retry, no rollback: a lost patch is repainted by the next one.
|
|
86
|
-
* Requires the session's `participant`.
|
|
87
|
-
*/
|
|
88
|
-
setPresence(values: PresencePatch<P>["values"]): void;
|
|
89
|
-
};
|
|
90
|
-
type SessionClient<D extends EventDefs, S, P extends PresenceDefs = Record<never, never>> = WithPresence<P, SessionClientPresence<P>> & {
|
|
91
|
-
readonly sessionId: string;
|
|
92
|
-
subscribe(listener: () => void): () => void;
|
|
93
|
-
getSnapshot(): SessionSnapshot<D, S, P>;
|
|
94
|
-
/**
|
|
95
|
-
* Optimistic append: validates locally against the reducer's event
|
|
96
|
-
* schemas (instant `INVALID_PAYLOAD`, no flicker), applies to the
|
|
97
|
-
* local fold, POSTs, swaps in the ack, rolls back on rejection.
|
|
98
|
-
* Auto-retries only `STORE_UNAVAILABLE`. Resolves with the appended
|
|
99
|
-
* events as the server recorded them. Overlapping calls on this
|
|
100
|
-
* handle enter the transport in invocation order without delaying
|
|
101
|
-
* their optimistic folds.
|
|
102
|
-
*/
|
|
103
|
-
push(...events: AppendInput<D>[]): PushResult<D>;
|
|
104
|
-
/**
|
|
105
|
-
* Backscroll: fetch a bounded slice of events from below the
|
|
106
|
-
* frontier and merge it into `events` — deduped, ordered, shared by
|
|
107
|
-
* every handle of this session. Folded state and the optimistic
|
|
108
|
-
* overlay are never touched. Calls serialize per session and skip
|
|
109
|
-
* already-loaded ranges, so overlapping backscrolls never fetch the
|
|
110
|
-
* same range twice. Resolves with the events in the requested range.
|
|
111
|
-
* Requires an http api; the `ws` transport has no history lane and
|
|
112
|
-
* this throws a TypeError there.
|
|
113
|
-
*/
|
|
114
|
-
loadHistory(options?: LoadHistoryOptions): Promise<ContractEvent<D>[]>;
|
|
115
|
-
/**
|
|
116
|
-
* Take a lease on the live stream and return its release. Leases
|
|
117
|
-
* refcount per handle — the first connects, releasing the last
|
|
118
|
-
* closes — so independent consumers of one identity-mapped handle
|
|
119
|
-
* (two hooks, a hook plus vanilla code) never fight over the
|
|
120
|
-
* stream. Releasing twice is a no-op. While any lease is held the
|
|
121
|
-
* stream reconnects with backoff and resumes from the frontier.
|
|
122
|
-
*/
|
|
123
|
-
connect(): () => void;
|
|
124
|
-
/**
|
|
125
|
-
* The hard stop: drops every outstanding lease and closes the
|
|
126
|
-
* stream now. Not terminal — a later `connect()` starts fresh from
|
|
127
|
-
* the current frontier.
|
|
128
|
-
*/
|
|
129
|
-
close(): void;
|
|
130
|
-
};
|
|
131
|
-
type SessionOptions<D extends EventDefs, S> = {
|
|
132
|
-
initialState?: S;
|
|
133
|
-
initialIndex?: number;
|
|
134
|
-
/** Server-rendered history through `initialIndex`. Seeds the event feed. */
|
|
135
|
-
initialEvents?: ContractEvent<D>[];
|
|
136
|
-
/** Overrides the client's `participant` for this session handle.
|
|
137
|
-
* Bound once per handle. */
|
|
138
|
-
participant?: string;
|
|
139
|
-
};
|
|
140
|
-
type A2Client<D extends EventDefs, S, P extends PresenceDefs = Record<never, never>> = {
|
|
141
|
-
session(sessionId: string, options?: SessionOptions<D, S>): SessionClient<D, S, P>;
|
|
142
|
-
};
|
|
143
|
-
/**
|
|
144
|
-
* The wire the client rides. The string form is one route serving GET
|
|
145
|
-
* (SSE stream) + POST (push). `http` splits the verbs across two
|
|
146
|
-
* routes, for when platform duration limits differ per verb. `ws`
|
|
147
|
-
* rides everything — every session of this client — over one
|
|
148
|
-
* multiplexed WebSocket, served by `sessionsSocket`.
|
|
149
|
-
*/
|
|
150
|
-
type ClientApi = string | {
|
|
151
|
-
type: "http";
|
|
152
|
-
push: string;
|
|
153
|
-
stream: string;
|
|
154
|
-
} | {
|
|
155
|
-
type: "ws";
|
|
156
|
-
url: string;
|
|
157
|
-
};
|
|
158
|
-
/**
|
|
159
|
-
* The socket surface the `ws` transport drives — satisfied structurally
|
|
160
|
-
* by the DOM `WebSocket` and Node's alike, and small enough to fake in
|
|
161
|
-
* tests.
|
|
162
|
-
*/
|
|
163
|
-
type ClientWebSocket = {
|
|
164
|
-
readonly readyState: number;
|
|
165
|
-
send(data: string): void;
|
|
166
|
-
close(code?: number, reason?: string): void;
|
|
167
|
-
addEventListener(type: "open", listener: () => void): void;
|
|
168
|
-
addEventListener(type: "message", listener: (event: {
|
|
169
|
-
data: unknown;
|
|
170
|
-
}) => void): void;
|
|
171
|
-
addEventListener(type: "close", listener: (event: {
|
|
172
|
-
code: number;
|
|
173
|
-
reason: string;
|
|
174
|
-
}) => void): void;
|
|
175
|
-
addEventListener(type: "error", listener: () => void): void;
|
|
176
|
-
};
|
|
177
|
-
type ClientWebSocketConstructor = new (url: string) => ClientWebSocket;
|
|
178
|
-
type CreateClientOptions<D extends EventDefs, S, P extends PresenceDefs = Record<never, never>> = {
|
|
179
|
-
reducer: Reducer<D, S, P>;
|
|
180
|
-
/** The route (or routes) the client speaks — see `ClientApi`. */
|
|
181
|
-
api: ClientApi;
|
|
182
|
-
/** Injectable fetch — defaults to the global. */
|
|
183
|
-
fetch?: typeof globalThis.fetch;
|
|
184
|
-
/** Injectable WebSocket constructor for the `ws` api — defaults to
|
|
185
|
-
* the global. The http transports never touch it. */
|
|
186
|
-
webSocket?: ClientWebSocketConstructor;
|
|
187
|
-
/** How long an idle session keeps its in-memory identity, in
|
|
188
|
-
* milliseconds. Defaults to five minutes; `Infinity` disables GC. */
|
|
189
|
-
gcTime?: number;
|
|
190
|
-
/**
|
|
191
|
-
* This client's presence identity — required to call `setPresence`.
|
|
192
|
-
* Caller-supplied (a user id, a tab nonce, a guest name): A2 does
|
|
193
|
-
* not invent an identity story; the app states it once here. The
|
|
194
|
-
* default for every session handle this client creates;
|
|
195
|
-
* `session(id, { participant })` overrides it per handle.
|
|
196
|
-
*/
|
|
197
|
-
participant?: string;
|
|
198
|
-
};
|
|
199
|
-
declare function createClient<D extends EventDefs, S, P extends PresenceDefs = Record<never, never>>(options: CreateClientOptions<D, S, P>): A2Client<D, S, P>;
|
|
200
|
-
//#endregion
|
|
201
|
-
export { Connection as a, HistoryState as c, SessionClient as d, SessionClientPresence as f, createClient as h, ClientWebSocketConstructor as i, LoadHistoryOptions as l, SessionSnapshot as m, ClientApi as n, ConnectionStatus as o, SessionOptions as p, ClientWebSocket as r, CreateClientOptions as s, A2Client as t, PushResult as u };
|
|
202
|
-
//# sourceMappingURL=client-CdMqi7mC.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-CdMqi7mC.d.ts","names":[],"sources":["../src/client.ts"],"mappings":";;KAoDY;;;;;;;KAQA;EACN;;EAEA;;EAEA;;EAEA,OAAO;;EAEP;EAAgB;;EAChB;;;;;;;;;;KAUM,WAAW,UAAU,aAAa,QAAQ,cAAc;WACzD,WAAW,QAAQ,cAAc;;KAGhC;;;;;;EAMV;;EAEA;;;KAIU;;EAEV;;EAEA;;EAEA;;;KAIU,gBACV,UAAU,WACV,GACA,UAAU,eAAe,wBACvB,aACF;;EAGE,UAAU,YAAY;;;EAIxB,OAAO;;;;;EAKP,QAAQ,cAAc;;;EAGtB;;EAEA,SAAS;EACT,YAAY;;;;;;;KAQF,sBAAsB,UAAU;;;;;;;;;;EAU1C,YAAY,QAAQ,cAAc;;KAGxB,cACV,UAAU,WACV,GACA,UAAU,eAAe,wBACvB,aAAa,GAAG,sBAAsB;WAC/B;EACT,UAAU;EACV,eAAe,gBAAgB,GAAG,GAAG;;;;;;;;;;EAUrC,QAAQ,QAAQ,YAAY,OAAO,WAAW;;;;;;;;;;;EAW9C,YAAY,UAAU,qBAAqB,QAAQ,cAAc;;;;;;;;;EASjE;;;;;;EAMA;;KAGU,eAAe,UAAU,WAAW;EAC9C,eAAe;EACf;;EAEA,gBAAgB,cAAc;;;EAG9B;;KAGU,SACV,UAAU,WACV,GACA,UAAU,eAAe;EAEzB,QACE,mBACA,UAAU,eAAe,GAAG,KAC3B,cAAc,GAAG,GAAG;;;;;;;;;KAUb;EAEN;EAAc;EAAc;;EAC5B;EAAY;;;;;;;KAON;WACD;EACT,KAAK;EACL,MAAM,eAAe;EACrB,iBAAiB,cAAc;EAC/B,iBACE,iBACA,WAAW;IAAS;;EAEtB,iBACE,eACA,WAAW;IAAS;IAAc;;EAEpC,iBAAiB,eAAe;;KAGtB,kCAAkC,gBAAgB;KAElD,oBACV,UAAU,WACV,GACA,UAAU,eAAe;EAEzB,SAAS,QAAQ,GAAG,GAAG;;EAEvB,KAAK;;EAEL,eAAe,WAAW;;;EAG1B,YAAY;;;EAGZ;;;;;;;;EAQA;;iBAirBc,aACd,UAAU,WACV,GACA,UAAU,eAAe,sBACzB,SAAS,oBAAoB,GAAG,GAAG,KAAK,SAAS,GAAG,GAAG"}
|