UNPKG

@cogniformai/instructor-stream

Version:

Streaming-first structured data extraction from LLMs with real-time updates

1 lines 49.6 kB
{"version":3,"sources":["/Users/m1mbp/WebstormProjects/instructor-stream-js/packages/instructor-stream/dist/chunk-2RKUKCF5.cjs","../src/effect/errors.ts","../src/effect/schema.ts","../src/utils/path.ts","../src/utils/streaming-json-parser.ts","../src/utils/token-type.ts","../src/utils/token-parser.ts"],"names":["ProviderError","StreamingError","SchemaResolutionError","SnapshotValidationError","resolveSchema","source","setDeep","obj","path","value","current","i","key","nextKey","lastKey","TokenType","token_type_default","TOKEN_STATE_LABELS","TokenParserStateToString","state","TokenParserError","message","__publicField","TokenParser","opts","paths","keepStack","separator","strictRootObject","pathParts","selector","stackEntry","popped","emit","item","token","partial","val"],"mappings":"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","file":"/Users/m1mbp/WebstormProjects/instructor-stream-js/packages/instructor-stream/dist/chunk-2RKUKCF5.cjs","sourcesContent":[null,"import * as Data from 'effect/Data'\n\nexport class ProviderError extends Data.TaggedClass('ProviderError')<{\n readonly message: string\n readonly cause?: unknown\n}> {}\n\nexport class StreamingError extends Data.TaggedClass('StreamingError')<{\n readonly message: string\n readonly cause?: unknown\n}> {}\n\nexport class SchemaResolutionError extends Data.TaggedClass('SchemaResolutionError')<{\n readonly message: string\n}> {}\n\nexport class SnapshotValidationError extends Data.TaggedClass('SnapshotValidationError')<{\n readonly reason: string\n readonly issues?: unknown\n}> {}\n\nexport type StreamingPipelineError =\n | ProviderError\n | StreamingError\n | SchemaResolutionError\n | SnapshotValidationError\n","import type { Schema } from 'effect/Schema'\nimport type { z } from 'zod'\nimport { SchemaResolutionError } from './errors.ts'\n\nexport type SchemaValidationMode = 'none' | 'on-complete' | 'final'\n\nexport type SchemaSource<A> = {\n readonly name: string\n readonly effect?: Schema<A>\n readonly zod?: z.ZodType<A>\n}\n\nexport type ResolvedSchema<A> = {\n readonly name: string\n readonly effect?: Schema<A>\n readonly zod?: z.ZodType<A>\n}\n\n/**\n * Resolves a schema source into a resolved schema with validated effect and/or zod schemas.\n *\n * @template A - The type parameter representing the schema's inferred type\n * @param {SchemaSource<A>} source - The schema source object containing optional effect/zod schemas and a name\n * @returns {ResolvedSchema<A>} A resolved schema object containing the name and available schemas\n * @throws {SchemaResolutionError} When neither an Effect schema nor a Zod schema is provided\n *\n * @example\n * ```typescript\n * const schema = resolveSchema({\n * name: 'UserSchema',\n * zod: z.object({ name: z.string() })\n * });\n * ```\n */\nexport const resolveSchema = <A>(source: SchemaSource<A>): ResolvedSchema<A> => {\n if (!source.effect && !source.zod) {\n throw new SchemaResolutionError({\n message: `Schema '${source.name}' must supply at least an Effect schema or a Zod schema.`,\n })\n }\n return {\n name: source.name,\n ...(source.effect ? { effect: source.effect } : {}),\n ...(source.zod ? { zod: source.zod } : {}),\n } as ResolvedSchema<A>\n}\n","/**\n * Lightweight imperative helpers to replace Ramda's lensPath / set / view.\n * These functions mutate the target object in-place for performance.\n * @todo: These will be replacing Ramda's lensPath / set / view for performance\n */\n\nexport type Path = (string | number | undefined)[]\n\n/**\n * Represents an Object/array that can be accessed by either string or numeric keys.\n * Using `unknown` rather than `any` to keep type-safety while still allowing\n * deep indexing. We purposefully avoid `any` so that values returned from these\n * helpers remain typed as `unknown`, forcing callers to narrow the result.\n */\nexport interface Indexable {\n [key: string]: unknown\n [key: number]: unknown\n}\n\n/**\n * Retrieves the value located at the specified path within a nested object or array.\n *\n * This function traverses the provided object or array using the keys in the path array,\n * returning the value found at the end of the path. If any part of the path is invalid\n * (i.e., an undefined or non-object value is encountered before reaching the end), the\n * function returns undefined.\n *\n * @param obj - The root object or array to traverse.\n * @param path - An array of keys representing the path to the desired value.\n * @returns The value located at the specified path, or undefined if the path is invalid.\n */\nexport function getDeep(obj: unknown, path: Path): unknown {\n let current: unknown = obj\n for (const key of path) {\n if (key === undefined) {\n return undefined\n }\n if (current == null || typeof current !== 'object') {\n return undefined\n }\n /** Safe cast – at this point we know `current` is an object/array. */\n current = (current as Indexable)[key]\n }\n return current\n}\n\n/**\n * Sets a value at a specified path within a nested object or array structure.\n * The function traverses the path, creating intermediate objects or arrays\n * as necessary, and sets the final key to the provided value.\n *\n * @param obj - The target object or array to modify.\n * @param path - An array of keys representing the path to the value.\n * @param value - The value to set at the specified path.\n */\nexport function setDeep(obj: Indexable, path: Path, value: unknown): void {\n if (path.length === 0) {\n return\n }\n let current: Indexable = obj as Indexable\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i]\n const nextKey = path[i + 1]\n if (key === undefined || nextKey === undefined) {\n return\n }\n if ((current as Indexable)[key] == null) {\n /** Decide container type based on next key */\n ;(current as Indexable)[key] = typeof nextKey === 'number' ? [] : {}\n }\n current = (current as Indexable)[key] as Indexable\n }\n const lastKey = path[path.length - 1]\n if (lastKey === undefined) {\n return\n }\n ;(current as Indexable)[lastKey] = value\n}\n","import { type Indexable, setDeep } from './path.ts'\nimport { z } from 'zod'\nimport JSONParser from './json-parser.ts'\nimport { ParsedTokenInfo, StackElement, TokenParserMode, TokenParserState } from './token-parser.ts'\nimport { charset } from './utf-8.ts'\n\ntype SchemaType = z.ZodType\ntype TypeDefaults = {\n string?: string | null | undefined\n number?: number | null | undefined\n boolean?: boolean | null | undefined\n}\ntype NestedPrimitive = string | number | boolean | null\ntype NestedValue = NestedPrimitive | NestedObject | NestedValue[]\ntype NestedObject = { [key: string]: NestedValue } & { [key: number]: NestedValue }\ntype PathSegment = string | number | undefined\ntype OnKeyCompleteCallbackParams = {\n activePath: PathSegment[]\n completedPaths: PathSegment[][]\n}\ntype OnKeyCompleteCallback = (data: OnKeyCompleteCallbackParams) => void\n\ntype AutoJSONMode = 'off' | 'object-or-array'\ntype SnapshotMode = 'object' | 'string'\n\ntype ParserContext = {\n readonly key: string\n readonly prefix: PathSegment[]\n parser: JSONParser | null\n activePath: PathSegment[]\n completedPaths: PathSegment[][]\n recentCompletions: PathSegment[][]\n structureDepth: number\n inString: boolean\n escaped: boolean\n}\n\ntype ParserOptions = {\n stringBufferSize?: number\n handleUnescapedNewLines?: boolean\n stringEmitInterval?: number\n}\n\nexport type IngestOutcome = {\n completions: PathSegment[][]\n closed: boolean\n}\n\n/**\n * SchemaStream builds a progressively populated \"stub\" object for a JSON stream\n * based on a provided Zod schema. This allows consumers to read a safe partial\n * structure before the upstream JSON has fully completed.\n *\n * All schema introspection relies exclusively on public Zod APIs compatible\n * with both Zod v3 and v4. No internal properties (e.g. `_def`) are used.\n */\nexport class SchemaStream {\n private readonly schemaInstance: NestedObject\n private readonly onKeyComplete: OnKeyCompleteCallback | null\n private readonly autoJSONMode: AutoJSONMode\n private readonly maxUnstringifyDepth: number\n private readonly snapshotMode: SnapshotMode\n private readonly contexts = new Map<string, ParserContext>()\n private activePath: PathSegment[] = []\n private completedPaths: PathSegment[][] = []\n\n constructor(\n schema: SchemaType,\n opts: {\n defaultData?: NestedObject\n typeDefaults?: TypeDefaults\n onKeyComplete?: OnKeyCompleteCallback\n autoJSONMode?: AutoJSONMode\n maxUnstringifyDepth?: number\n snapshotMode?: SnapshotMode\n } = {}\n ) {\n const {\n defaultData,\n onKeyComplete,\n typeDefaults,\n autoJSONMode = 'object-or-array',\n maxUnstringifyDepth = 2,\n snapshotMode = 'object',\n } = opts\n this.schemaInstance = this.createBlankObject(schema, defaultData, typeDefaults)\n this.onKeyComplete = onKeyComplete ?? null\n this.autoJSONMode = autoJSONMode\n this.maxUnstringifyDepth = maxUnstringifyDepth\n this.snapshotMode = snapshotMode\n this.ensureContext([], SchemaStream.defaultParserOpts)\n }\n\n private static defaultParserOpts: Required<ParserOptions> = {\n stringBufferSize: 0,\n handleUnescapedNewLines: true,\n stringEmitInterval: 256,\n }\n\n private static contextKey(prefix: PathSegment[]): string {\n if (prefix.length === 0) {\n return '$root'\n }\n return prefix\n .map((segment) => {\n if (segment === undefined) return 'u'\n if (typeof segment === 'number') return `#${segment}`\n return encodeURIComponent(segment)\n })\n .join('.')\n }\n\n private ensureContext(prefix: PathSegment[], opts: ParserOptions): ParserContext {\n const key = SchemaStream.contextKey(prefix)\n const existing = this.contexts.get(key)\n if (existing) {\n return existing\n }\n const parserOpts = {\n stringBufferSize: opts.stringBufferSize ?? SchemaStream.defaultParserOpts.stringBufferSize,\n handleUnescapedNewLines:\n opts.handleUnescapedNewLines ?? SchemaStream.defaultParserOpts.handleUnescapedNewLines,\n stringEmitInterval:\n opts.stringEmitInterval ?? SchemaStream.defaultParserOpts.stringEmitInterval,\n strictRootObject: true,\n }\n const context: ParserContext = {\n key,\n prefix: [...prefix],\n activePath: [],\n completedPaths: [],\n recentCompletions: [],\n structureDepth: 0,\n inString: false,\n escaped: false,\n parser: null,\n }\n context.parser = new JSONParser(parserOpts)\n this.configureParser(context)\n this.contexts.set(key, context)\n return context\n }\n\n private configureParser(context: ParserContext): void {\n if (!context.parser) {\n return\n }\n context.parser.onToken = (info) => this.handleToken(context, info)\n context.parser.onValue = () => undefined\n context.parser.onError = () => undefined\n context.parser.onEnd = () => {\n context.activePath = []\n }\n }\n\n private disposeParser(context: ParserContext): void {\n if (!context.parser) {\n return\n }\n const noop = () => undefined\n context.parser.onToken = noop as never\n context.parser.onValue = noop\n context.parser.onError = noop\n context.parser.onEnd = noop\n context.parser = null\n }\n\n private resetContext(context: ParserContext, opts: ParserOptions): void {\n const parserOpts = {\n stringBufferSize: opts.stringBufferSize ?? SchemaStream.defaultParserOpts.stringBufferSize,\n handleUnescapedNewLines:\n opts.handleUnescapedNewLines ?? SchemaStream.defaultParserOpts.handleUnescapedNewLines,\n stringEmitInterval:\n opts.stringEmitInterval ?? SchemaStream.defaultParserOpts.stringEmitInterval,\n strictRootObject: true,\n }\n this.disposeParser(context)\n context.parser = new JSONParser(parserOpts)\n context.recentCompletions = []\n context.structureDepth = 0\n context.inString = false\n context.escaped = false\n this.configureParser(context)\n }\n\n /**\n * Attempt to extract a default value for a schema using **only public APIs**.\n *\n * Strategy:\n * 1. `safeParse(undefined)` – captures `.default()`, `.catch()`, and Zod v4\n * short‑circuit behaviour without introspecting internals.\n * 2. Structural defaults for primitives/collections.\n * 3. Recursively unwrap optional/nullable/effects schemas via `unwrap()`.\n */\n private getDefaultValue(schema: SchemaType, typeDefaults?: TypeDefaults): unknown {\n /** Try parsing undefined to trigger defaults/catches. */\n try {\n const parsed = schema.safeParse(undefined)\n if (parsed.success && parsed.data !== undefined) {\n return parsed.data as unknown\n }\n } catch {\n /** ignore parse errors; fall through to structural defaults */\n }\n /** Structural defaults based on public instanceof checks. */\n if (schema instanceof z.ZodString) {\n return Object.prototype.hasOwnProperty.call(typeDefaults ?? {}, 'string') ?\n typeDefaults?.string\n : null\n }\n if (schema instanceof z.ZodNumber) {\n return Object.prototype.hasOwnProperty.call(typeDefaults ?? {}, 'number') ?\n typeDefaults?.number\n : null\n }\n if (schema instanceof z.ZodBoolean) {\n return Object.prototype.hasOwnProperty.call(typeDefaults ?? {}, 'boolean') ?\n typeDefaults?.boolean\n : null\n }\n if (schema instanceof z.ZodArray) {\n return []\n }\n if (schema instanceof z.ZodObject) {\n return this.createBlankObject(schema, undefined, typeDefaults)\n }\n if (schema instanceof z.ZodRecord) {\n /** Empty object for records; keys appear only as stream provides them. */\n return {}\n }\n if (\n schema instanceof z.ZodOptional ||\n schema instanceof z.ZodNullable ||\n /**\n /* ZodEffects (v3 + v4); public API exposes unwrap()\n * We intentionally check existence of unwrap to avoid instanceof mismatch across versions.\n */\n ('unwrap' in schema &&\n typeof (schema as unknown as { unwrap: () => unknown }).unwrap === 'function')\n ) {\n try {\n /** unwrap() exists on Optional/Nullable/Effects in both versions. */\n const unwrapped = (schema as unknown as { unwrap: () => SchemaType }).unwrap()\n return this.getDefaultValue(unwrapped as SchemaType, typeDefaults)\n } catch {\n /** Fallback for schemas that cannot be unwrapped or throw */\n return null\n }\n }\n /** Enums, native enums, unions etc. — no safe public way to pick one deterministically.*/\n return null\n }\n\n /**\n * Given a Zod schema, creates a blank object with default values for each property.\n *\n * @param schema - The Zod schema to use for creating the blank object.\n * @param defaultData - The default data to use for any properties\n * that are not explicitly set in the schema.\n * @param typeDefaults - The type defaults to use for any properties\n * that do not have an explicit default value.\n * @returns The blank object with default values for each property.\n */\n private createBlankObject(\n schema: SchemaType,\n defaultData?: NestedObject,\n typeDefaults?: TypeDefaults\n ): NestedObject {\n if (schema instanceof z.ZodObject) {\n const obj: NestedObject = {}\n const { shape } = schema\n for (const key in shape) {\n obj[key] =\n defaultData && Object.prototype.hasOwnProperty.call(defaultData, key) ?\n (defaultData[key as keyof NestedObject] as NestedValue)\n : (this.getDefaultValue(shape[key] as SchemaType, typeDefaults) as NestedValue)\n }\n return obj\n }\n /** Non-object root schema: wrap structural default (if object-like) or fallback to {} */\n const defaultValue = this.getDefaultValue(schema, typeDefaults)\n if (defaultValue && typeof defaultValue === 'object' && !Array.isArray(defaultValue)) {\n return defaultValue as NestedObject\n }\n return {}\n }\n\n /**\n * Returns the full path to the current value in the JSON structure as an array of keys.\n * This is used to track the position within the nested object being parsed.\n *\n * Args:\n * stack: The stack of parent elements leading to the current value.\n * key: The key or index of the current value.\n * Returns:\n * An array representing the path to the current value in the object.\n */\n private getPathFromStack(\n stack: StackElement[] = [],\n key: string | number | undefined\n ): PathSegment[] {\n /** Build path without intermediate array copies or shift */\n const stackLen = stack.length\n const pathLen = stackLen > 0 ? stackLen - 1 : 0\n const out: PathSegment[] = new Array(pathLen + 1)\n for (let i = 1; i < stackLen; i++) {\n const element = stack[i]\n out[i - 1] = element?.key\n }\n out[pathLen] = key\n return out\n }\n\n /**\n * Handle a single parsed token from the tokenizer.\n *\n * This function is called by the tokenizer for each parsed token.\n * It updates the `schemaInstance` with the new value and emits events\n * for key completion.\n *\n * Args:\n * {\n * parser: {\n * state: TokenParserState\n * key: string | number | undefined\n * mode: TokenParserMode | undefined\n * stack: StackElement[]\n * }\n * tokenizer: ParsedTokenInfo\n * }\n * Returns:\n * void\n */\n private handleToken(\n context: ParserContext,\n {\n parser: { key, stack },\n tokenizer: { value, partial },\n }: {\n parser: {\n state: TokenParserState\n key: string | number | undefined\n mode: TokenParserMode | undefined\n stack: StackElement[]\n }\n tokenizer: ParsedTokenInfo\n }\n ): void {\n const relativePath = this.getPathFromStack(stack, key)\n const fullPath = context.prefix.length > 0 ? [...context.prefix, ...relativePath] : relativePath\n const pathChanged =\n context.activePath.length === 0 || !this.arePathsEqual(context.activePath, fullPath)\n if (pathChanged) {\n context.activePath = [...fullPath]\n }\n if (!partial) {\n const completedPath = [...fullPath]\n context.completedPaths.push(completedPath)\n context.recentCompletions.push(completedPath)\n this.completedPaths.push(completedPath)\n }\n if ((pathChanged || !partial) && this.onKeyComplete) {\n this.activePath = [...fullPath]\n this.onKeyComplete({\n activePath: [...this.activePath],\n completedPaths: this.completedPaths.map((path) => [...path]),\n })\n }\n let nextValue: ParsedTokenInfo['value'] | NestedValue = value\n if (!partial && typeof value === 'string' && this.autoJSONMode !== 'off') {\n nextValue = this.unstringifyIfJSON(value)\n }\n setDeep(this.schemaInstance as Indexable, fullPath, nextValue)\n }\n /** Compare paths by value to avoid spurious updates on identical paths */\n private arePathsEqual(a: PathSegment[], b: PathSegment[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n }\n\n /**\n * Recursively attempts to parse a string value as JSON up to a maximum depth.\n *\n * This method handles cases where JSON has been stringified multiple times\n * (e.g., `\"\\\"{\\\\\"key\\\\\":\\\\\"value\\\\\"}\\\"\"`) by repeatedly parsing until reaching\n * a non-string value or the maximum depth limit.\n *\n * @param value - The string value to unstringify\n * @returns The parsed nested value (object or array) if successful, or the original\n * string if parsing fails or the value doesn't appear to be JSON\n *\n * @remarks\n * The method performs validation checks before attempting to parse:\n * - Checks if the string starts and ends with appropriate JSON delimiters (`{}`, `[]`, or `\"\"`)\n * - For quoted strings, checks if the inner content looks like JSON\n * - Only attempts parsing when the string structure suggests it contains JSON\n * - Respects `maxUnstringifyDepth` to prevent excessive recursion\n *\n * If parsing succeeds but results in a primitive value other than a string,\n * the original value is returned instead.\n */\n private unstringifyIfJSON(value: string): NestedValue | string {\n let remainingDepth = this.maxUnstringifyDepth\n let current: unknown = value\n while (remainingDepth > 0 && typeof current === 'string') {\n const trimmed = current.trim()\n if (trimmed.length < 2) {\n break\n }\n const first = trimmed.charCodeAt(0)\n const last = trimmed.charCodeAt(trimmed.length - 1)\n const couldBeObject =\n first === charset.LEFT_CURLY_BRACKET && last === charset.RIGHT_CURLY_BRACKET\n const couldBeArray =\n first === charset.LEFT_SQUARE_BRACKET && last === charset.RIGHT_SQUARE_BRACKET\n let shouldAttemptParse = couldBeObject || couldBeArray\n if (\n !shouldAttemptParse &&\n first === charset.QUOTATION_MARK &&\n last === charset.QUOTATION_MARK\n ) {\n const inner = trimmed.slice(1, -1).trim()\n if (inner.length >= 2) {\n const innerFirst = inner.charCodeAt(0)\n const innerLast = inner.charCodeAt(inner.length - 1)\n const innerLooksObject =\n innerFirst === charset.LEFT_CURLY_BRACKET && innerLast === charset.RIGHT_CURLY_BRACKET\n const innerLooksArray =\n innerFirst === charset.LEFT_SQUARE_BRACKET && innerLast === charset.RIGHT_SQUARE_BRACKET\n if (innerLooksObject || innerLooksArray) {\n shouldAttemptParse = true\n }\n }\n }\n if (!shouldAttemptParse) {\n break\n }\n try {\n const parsed = JSON.parse(trimmed) as unknown\n if (Array.isArray(parsed) || (parsed !== null && typeof parsed === 'object')) {\n return parsed as NestedValue\n }\n if (typeof parsed === 'string') {\n current = parsed\n remainingDepth--\n continue\n }\n return value\n } catch {\n return value\n }\n }\n return typeof current === 'string' ? current : value\n }\n\n /**\n * Get a \"stub\" object populated with default values for all\n * properties in the schema, using the provided default data\n * and type defaults if available.\n *\n * @param schema - The Zod schema to use for creating the stub.\n * @param defaultData - The default data to use for any properties\n * that are not explicitly set in the schema.\n * @param typeDefaults - The type defaults to use for any properties\n * that do not have an explicit default value.\n * @returns The stub object with all properties populated.\n */\n public getSchemaStub<S extends SchemaType>(\n schema: S,\n defaultData?: NestedObject,\n typeDefaults?: TypeDefaults\n ): z.infer<S> {\n return this.createBlankObject(schema, defaultData, typeDefaults) as z.infer<S>\n }\n\n /**\n * Parses a stream of JSON data and applies the default values\n * and type defaults to the schema instance.\n *\n * @param opts - Options for the JSON parser.\n * @param opts.stringBufferSize - The size of the internal string buffer.\n * @param opts.handleUnescapedNewLines - Whether to handle unescaped\n * newlines in the JSON data.\n * @returns A TransformStream that emits a JSON string for each\n * chunk of JSON data received, with the default values and type\n * defaults applied to the schema instance.\n */\n public parse(\n opts: ParserOptions = SchemaStream.defaultParserOpts\n ): TransformStream<string | Uint8Array, unknown> {\n const context = this.ensureContext([], opts)\n const textEncoder = this.snapshotMode === 'string' ? new TextEncoder() : null\n return new TransformStream<string | Uint8Array, unknown>({\n transform: (chunk, controller) => {\n try {\n this.writeChunk(context, chunk, opts)\n if (this.snapshotMode === 'object') {\n controller.enqueue(this.schemaInstance)\n } else if (textEncoder) {\n controller.enqueue(textEncoder.encode(JSON.stringify(this.schemaInstance)))\n }\n } catch (err) {\n if (typeof context.parser?.onError === 'function') {\n context.parser.onError(err as Error)\n }\n this.resetContext(context, opts)\n }\n },\n flush: () => {\n if (this.onKeyComplete) {\n this.onKeyComplete({\n completedPaths: this.completedPaths.map((path) => [...path]),\n activePath: [],\n })\n }\n this.activePath = []\n },\n })\n }\n\n public ingest(\n prefix: PathSegment[],\n chunk: string | Uint8Array,\n opts: ParserOptions = SchemaStream.defaultParserOpts\n ): IngestOutcome {\n const context = this.ensureContext(prefix, opts)\n return this.writeChunk(context, chunk, opts)\n }\n\n public releaseContext(prefix: PathSegment[]): void {\n const key = SchemaStream.contextKey(prefix)\n const context = this.contexts.get(key)\n if (!context) {\n return\n }\n this.disposeParser(context)\n context.activePath = []\n context.completedPaths = []\n context.recentCompletions = []\n context.structureDepth = 0\n context.inString = false\n context.escaped = false\n this.contexts.delete(key)\n }\n\n public current(): NestedObject {\n return this.schemaInstance\n }\n\n public getActivePath(): PathSegment[] {\n return [...this.activePath]\n }\n\n public getCompletedPaths(): PathSegment[][] {\n return this.completedPaths.map((path) => [...path])\n }\n\n private writeChunk(\n context: ParserContext,\n chunk: string | Uint8Array,\n opts: ParserOptions\n ): IngestOutcome {\n if (!context.parser) {\n return { completions: [], closed: true }\n }\n this.updateStructureDepth(context, chunk)\n try {\n context.parser.write(chunk)\n } catch (error) {\n if (typeof context.parser.onError === 'function') {\n context.parser.onError(error as Error)\n }\n this.resetContext(context, opts)\n }\n const completed = context.recentCompletions\n context.recentCompletions = []\n const closed = context.structureDepth <= 0\n return {\n completions: completed.map((path) => [...path]),\n closed,\n }\n }\n\n private static readonly textDecoder =\n typeof TextDecoder === 'undefined' ? null : new TextDecoder()\n\n private updateStructureDepth(context: ParserContext, chunk: string | Uint8Array): void {\n const decoder = SchemaStream.textDecoder\n const text =\n typeof chunk === 'string' ? chunk\n : decoder ? decoder.decode(chunk)\n : Array.from(chunk as Uint8Array)\n .map((code) => String.fromCharCode(code))\n .join('')\n let delta = 0\n let { inString, escaped } = context\n for (let i = 0; i < text.length; i++) {\n const char = text[i]\n if (inString) {\n if (escaped) {\n escaped = false\n continue\n }\n if (char === '\\\\') {\n escaped = true\n continue\n }\n if (char === '\"') {\n inString = false\n }\n continue\n }\n if (char === '\"') {\n inString = true\n continue\n }\n if (char === '{' || char === '[') {\n delta++\n continue\n }\n if (char === '}' || char === ']') {\n delta--\n }\n }\n\n context.structureDepth = Math.max(0, context.structureDepth + delta)\n context.inString = inString\n context.escaped = escaped\n }\n}\n","enum TokenType {\n LEFT_BRACE,\n RIGHT_BRACE,\n LEFT_BRACKET,\n RIGHT_BRACKET,\n COLON,\n COMMA,\n TRUE,\n FALSE,\n NULL,\n STRING,\n NUMBER,\n SEPARATOR,\n}\n\nexport default TokenType\n","/**\n * This file has been modified - but the majority pulled directly from\n * https://www.npmjs.com/package/@streamparser/json\n * https://github.com/juanjoDiaz/streamparser-json\n *\n * Copyright (c) 2020 Juanjo Diaz\n * https://github.com/juanjoDiaz\n *\n */\n\nimport TokenType from './token-type.ts'\n\nexport type JsonPrimitive = string | number | boolean | null\nexport type JsonKey = string | number | undefined\nexport type JsonObject = { [key: string]: JsonPrimitive | JsonStruct }\nexport type JsonArray = (JsonPrimitive | JsonStruct)[]\nexport type JsonStruct = JsonObject | JsonArray\n\nexport const enum TokenParserMode {\n OBJECT,\n ARRAY,\n}\n\nexport interface StackElement {\n key: JsonKey\n value: JsonStruct\n mode: TokenParserMode | undefined\n emit: boolean\n}\n\nexport interface ParsedTokenInfo {\n token: TokenType\n value: JsonPrimitive\n offset?: number\n partial?: boolean\n}\n\nexport interface ParsedElementInfo {\n value: JsonPrimitive | JsonStruct\n parent: JsonStruct | undefined\n key: JsonKey\n stack: StackElement[]\n}\n\nexport const enum TokenParserState {\n VALUE,\n KEY,\n COLON,\n COMMA,\n ENDED,\n ERROR,\n SEPARATOR,\n}\n\nconst TOKEN_STATE_LABELS = [\n 'VALUE',\n 'KEY',\n 'COLON',\n 'COMMA',\n 'ENDED',\n 'ERROR',\n 'SEPARATOR',\n] as const\n\nfunction TokenParserStateToString(state: TokenParserState): string {\n return TOKEN_STATE_LABELS[state] ?? 'UNKNOWN'\n}\n\nexport interface TokenParserOptions {\n paths?: string[] | undefined\n keepStack?: boolean | undefined\n separator?: string | undefined\n strictRootObject?: boolean | undefined\n}\n\nexport class TokenParserError extends Error {\n name = 'TokenParserError'\n constructor(message: string) {\n super(message)\n }\n}\n\nexport default class TokenParser {\n private readonly paths?: (string[] | undefined)[]\n private readonly keepStack: boolean\n private readonly separator: string | undefined\n private readonly strictRootObject: boolean\n state: TokenParserState = TokenParserState.VALUE\n mode: TokenParserMode | undefined = undefined\n key: JsonKey = undefined\n value: JsonStruct | undefined = undefined\n stack: StackElement[] = []\n private rootSeen = false\n\n constructor(opts: TokenParserOptions = {}) {\n const { paths, keepStack = true, separator, strictRootObject = false } = opts\n if (paths) {\n this.paths = paths.map((path) => {\n if (path === undefined || path === '$*') {\n return undefined\n }\n if (!path.startsWith('$')) {\n throw new TokenParserError(`Invalid selector \"${path}\". Should start with \"$\".`)\n }\n const pathParts = path.split('.').slice(1)\n if (pathParts.includes('')) {\n throw new TokenParserError(`Invalid selector \"${path}\". \"..\" syntax not supported.`)\n }\n return pathParts\n })\n }\n this.keepStack = keepStack\n this.separator = separator\n this.strictRootObject = strictRootObject\n }\n\n /**\n * Determines whether the current parser state should emit a value based on configured paths.\n *\n * @returns `true` if no paths are configured, or if the current stack and key match any of the configured paths; `false` otherwise.\n *\n * @remarks\n * This method compares the current parser stack against a list of path selectors to determine if\n * the current position in the JSON structure matches any target path. The comparison process:\n * - Returns `true` immediately if no paths filter is configured\n * - Checks if any configured path matches the current stack depth\n * - Supports wildcard selectors (`'*'`) that match any key at that level\n * - Validates each level of the path against the corresponding stack entry\n * - Special handling for the final selector in the path, comparing against the current key\n */\n private shouldEmit(): boolean {\n if (!this.paths) {\n return true\n }\n\n return this.paths.some((path) => {\n if (path === undefined) {\n return true\n }\n if (path.length !== this.stack.length) {\n return false\n }\n\n for (let i = 0; i < path.length - 1; i++) {\n const selector = path[i]\n const stackEntry = this.stack[i + 1]\n if (!stackEntry) {\n return false\n }\n const { key } = stackEntry\n if (selector === '*') {\n continue\n }\n if (selector !== key) {\n return false\n }\n }\n\n const selector = path[path.length - 1]\n if (selector === '*') {\n return true\n }\n return selector === this.key?.toString()\n })\n }\n\n private push(): void {\n this.stack.push({\n key: this.key,\n value: this.value as JsonStruct,\n mode: this.mode,\n emit: this.shouldEmit(),\n })\n }\n\n private pop(): void {\n const value = this.value\n\n const popped = this.stack.pop()\n if (!popped) {\n throw new TokenParserError('Unexpected parser stack underflow')\n }\n this.key = popped.key\n this.value = popped.value\n this.mode = popped.mode\n const emit = popped.emit\n\n this.state = this.mode !== undefined ? TokenParserState.COMMA : TokenParserState.VALUE\n\n this.emit(value as JsonPrimitive | JsonStruct, emit)\n }\n\n private emit(value: JsonPrimitive | JsonStruct, emit: boolean): void {\n if (!this.keepStack && this.value && this.stack.every((item) => !item.emit)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delete (this.value as JsonStruct as any)[this.key as string | number]\n }\n\n if (emit) {\n this.onValue({\n value,\n key: this.key,\n parent: this.value,\n stack: this.stack,\n })\n }\n\n if (this.stack.length === 0) {\n if (this.separator) {\n this.state = TokenParserState.SEPARATOR\n } else if (this.separator === undefined) {\n this.end()\n }\n this.rootSeen = false\n // else if separator === '', expect next JSON object.\n }\n }\n\n public get isEnded(): boolean {\n return this.state === TokenParserState.ENDED\n }\n\n public write({ token, value, partial }: Omit<ParsedTokenInfo, 'offset'>): void {\n if (partial) {\n return\n }\n\n if (\n !this.rootSeen &&\n this.strictRootObject &&\n this.state === TokenParserState.VALUE &&\n this.stack.length === 0\n ) {\n if (token !== TokenType.LEFT_BRACE) {\n this.rootSeen = true\n this.error(new TokenParserError('Root must be an object'))\n return\n }\n this.rootSeen = true\n }\n\n if (this.state === TokenParserState.VALUE) {\n if (\n token === TokenType.STRING ||\n token === TokenType.NUMBER ||\n token === TokenType.TRUE ||\n token === TokenType.FALSE ||\n token === TokenType.NULL\n ) {\n if (this.mode === TokenParserMode.OBJECT) {\n ;(this.value as JsonObject)[this.key as string] = value\n this.state = TokenParserState.COMMA\n } else if (this.mode === TokenParserMode.ARRAY) {\n ;(this.value as JsonArray).push(value)\n this.state = TokenParserState.COMMA\n }\n\n this.emit(value, this.shouldEmit())\n return\n }\n\n if (token === TokenType.LEFT_BRACE) {\n this.push()\n if (this.mode === TokenParserMode.OBJECT) {\n this.value = (this.value as JsonObject)[this.key as string] = {}\n } else if (this.mode === TokenParserMode.ARRAY) {\n const val = {}\n ;(this.value as JsonArray).push(val)\n this.value = val\n } else {\n this.value = {}\n }\n this.mode = TokenParserMode.OBJECT\n this.state = TokenParserState.KEY\n this.key = undefined\n return\n }\n\n if (token === TokenType.LEFT_BRACKET) {\n this.push()\n if (this.mode === TokenParserMode.OBJECT) {\n this.value = (this.value as JsonObject)[this.key as string] = []\n } else if (this.mode === TokenParserMode.ARRAY) {\n const val: JsonArray = []\n ;(this.value as JsonArray).push(val)\n this.value = val\n } else {\n this.value = []\n }\n this.mode = TokenParserMode.ARRAY\n this.state = TokenParserState.VALUE\n this.key = 0\n return\n }\n\n if (\n this.mode === TokenParserMode.ARRAY &&\n token === TokenType.RIGHT_BRACKET &&\n (this.value as JsonArray).length === 0\n ) {\n this.pop()\n return\n }\n }\n\n if (this.state === TokenParserState.KEY) {\n if (token === TokenType.STRING) {\n this.key = value as string\n this.state = TokenParserState.COLON\n return\n }\n\n if (token === TokenType.RIGHT_BRACE && Object.keys(this.value as JsonObject).length === 0) {\n this.pop()\n return\n }\n }\n\n if (this.state === TokenParserState.COLON && token === TokenType.COLON) {\n this.state = TokenParserState.VALUE\n return\n }\n\n if (this.state === TokenParserState.COMMA) {\n if (token === TokenType.COMMA) {\n if (this.mode === TokenParserMode.ARRAY) {\n this.state = TokenParserState.VALUE\n ;(this.key as number)++\n return\n }\n\n if (this.mode === TokenParserMode.OBJECT) {\n this.state = TokenParserState.KEY\n return\n }\n }\n\n if (\n (token === TokenType.RIGHT_BRACE && this.mode === TokenParserMode.OBJECT) ||\n (token === TokenType.RIGHT_BRACKET && this.mode === TokenParserMode.ARRAY)\n ) {\n this.pop()\n return\n }\n }\n\n if (\n this.state === TokenParserState.SEPARATOR &&\n token === TokenType.SEPARATOR &&\n value === this.separator\n ) {\n this.state = TokenParserState.VALUE\n return\n }\n\n this.error(\n new TokenParserError(\n `Unexpected ${TokenType[token]} (${JSON.stringify(\n value\n )}) in state ${TokenParserStateToString(this.state)}`\n )\n )\n return\n }\n\n public error(err: Error): void {\n if (this.state !== TokenParserState.ENDED) {\n this.state = TokenParserState.ERROR\n }\n\n this.onError(err)\n }\n\n public end(): void {\n if (\n (this.state !== TokenParserState.VALUE && this.state !== TokenParserState.SEPARATOR) ||\n this.stack.length > 0\n ) {\n this.error(\n new Error(\n `Parser ended in mid-parsing (state: ${TokenParserStateToString(\n this.state\n )}). Either not all the data was received or the data was invalid.`\n )\n )\n } else {\n this.state = TokenParserState.ENDED\n this.onEnd()\n }\n }\n\n /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\n public onValue(_parsedElementInfo: ParsedElementInfo): void {\n throw new TokenParserError('Can\\'t emit data before the \"onValue\" callback has been set up.')\n }\n\n public onError(err: Error): void {\n // Override me\n throw err\n }\n\n public onEnd(): void {\n // Override me\n }\n}\n"]}