@jaypie/fabric 0.1.2 → 0.1.3
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/dist/cjs/commander/index.cjs +7 -7
- package/dist/cjs/commander/index.cjs.map +1 -1
- package/dist/cjs/data/index.cjs.map +1 -1
- package/dist/cjs/http/index.cjs.map +1 -1
- package/dist/cjs/index.cjs +8 -7
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/lambda/index.cjs +7 -7
- package/dist/cjs/lambda/index.cjs.map +1 -1
- package/dist/cjs/llm/index.cjs +7 -7
- package/dist/cjs/llm/index.cjs.map +1 -1
- package/dist/cjs/mcp/FabricMcpServer.d.ts +44 -0
- package/dist/cjs/mcp/index.cjs +156 -7
- package/dist/cjs/mcp/index.cjs.map +1 -1
- package/dist/cjs/mcp/index.d.ts +2 -1
- package/dist/cjs/mcp/types.d.ts +66 -0
- package/dist/cjs/service.d.ts +5 -0
- package/dist/esm/commander/index.js +7 -7
- package/dist/esm/commander/index.js.map +1 -1
- package/dist/esm/data/index.js.map +1 -1
- package/dist/esm/http/index.js.map +1 -1
- package/dist/esm/index.js +8 -8
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lambda/index.js +7 -7
- package/dist/esm/lambda/index.js.map +1 -1
- package/dist/esm/llm/index.js +7 -7
- package/dist/esm/llm/index.js.map +1 -1
- package/dist/esm/mcp/FabricMcpServer.d.ts +44 -0
- package/dist/esm/mcp/index.d.ts +2 -1
- package/dist/esm/mcp/index.js +155 -8
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/types.d.ts +66 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../../src/constants.ts","../../../../../src/resolve-date.ts","../../../../../src/resolve.ts","../../../../../src/service.ts","../../../../../src/http/authorization.ts","../../../../../src/http/httpTransform.ts","../../../../../src/http/fabricHttp.ts","../../../../../src/http/cors.ts","../../../../../src/http/types.ts","../../../../../src/http/FabricHttpServer.ts","../../../../../src/http/stream.ts"],"sourcesContent":["/**\n * Meta-modeling Constants\n */\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Root organizational unit */\nexport const APEX = \"@\";\n\n/** Fabric version - used to identify pre-instantiated Services */\nexport const FABRIC_VERSION = \"0.1.0\";\n\n/** Composite key separator */\nexport const SEPARATOR = \"#\";\n\n/** System-level models that describe other models */\nexport const SYSTEM_MODELS = [\"context\", \"field\", \"model\"] as const;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type SystemModel = (typeof SYSTEM_MODELS)[number];\n","/**\n * Date Type Conversion for @jaypie/fabric\n *\n * Adds Date as a supported type in the fabric type system.\n * Follows the same conversion patterns as String, Number, Boolean.\n */\n\nimport { BadRequestError } from \"@jaypie/errors\";\n\n/**\n * Check if a value is a valid Date\n */\nexport function isValidDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime());\n}\n\n/**\n * Convert a value to a Date\n *\n * Supported inputs:\n * - Date: returned as-is (validated)\n * - Number: treated as Unix timestamp (milliseconds)\n * - String: parsed via Date constructor (ISO 8601, etc.)\n * - Object with value property: unwrapped and converted\n *\n * @throws BadRequestError if value cannot be converted to valid Date\n */\nexport function fabricDate(value: unknown): Date {\n // Already a Date\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) {\n throw new BadRequestError(\"Invalid Date value\");\n }\n return value;\n }\n\n // Null/undefined\n if (value === null || value === undefined) {\n throw new BadRequestError(\"Cannot convert null or undefined to Date\");\n }\n\n // Object with value property (fabric pattern)\n if (typeof value === \"object\" && value !== null && \"value\" in value) {\n return fabricDate((value as { value: unknown }).value);\n }\n\n // Number (timestamp in milliseconds)\n if (typeof value === \"number\") {\n if (Number.isNaN(value)) {\n throw new BadRequestError(\"Cannot convert NaN to Date\");\n }\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new BadRequestError(`Cannot convert ${value} to Date`);\n }\n return date;\n }\n\n // String (ISO 8601 or parseable format)\n if (typeof value === \"string\") {\n // Empty string is invalid\n if (value.trim() === \"\") {\n throw new BadRequestError(\"Cannot convert empty string to Date\");\n }\n\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new BadRequestError(`Cannot convert \"${value}\" to Date`);\n }\n return date;\n }\n\n // Boolean cannot be converted to Date\n if (typeof value === \"boolean\") {\n throw new BadRequestError(\"Cannot convert boolean to Date\");\n }\n\n // Arrays - attempt single element extraction\n if (Array.isArray(value)) {\n if (value.length === 1) {\n return fabricDate(value[0]);\n }\n throw new BadRequestError(\n `Cannot convert array with ${value.length} elements to Date`,\n );\n }\n\n throw new BadRequestError(`Cannot convert ${typeof value} to Date`);\n}\n\n/**\n * Resolve a value from a Date to another type\n *\n * @param value - Date to convert\n * @param targetType - Target type (String, Number)\n */\nexport function resolveFromDate(\n value: Date,\n targetType: typeof Number | typeof String,\n): number | string {\n if (!isValidDate(value)) {\n throw new BadRequestError(\"Invalid Date value\");\n }\n\n if (targetType === String) {\n return value.toISOString();\n }\n\n if (targetType === Number) {\n return value.getTime();\n }\n\n throw new BadRequestError(`Cannot convert Date to ${targetType}`);\n}\n\n/**\n * Date type constant for use in fabricService input definitions\n *\n * Usage:\n * ```typescript\n * const handler = fabricService({\n * input: {\n * startDate: { type: Date },\n * endDate: { type: Date, default: undefined }\n * }\n * });\n * ```\n */\nexport const DateType = Date;\n\n/**\n * Type guard for Date type in schema definitions\n */\nexport function isDateType(type: unknown): type is typeof Date {\n return type === Date;\n}\n","// Fabric functions for @jaypie/fabric\n\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport { fabricDate, isDateType } from \"./resolve-date.js\";\nimport type { ConversionType, TypedArrayType } from \"./types.js\";\n\n/**\n * Try to parse a string as JSON if it looks like JSON\n * Returns the parsed value or the original string if not JSON\n */\nfunction tryParseJson(value: string): unknown {\n const trimmed = value.trim();\n if (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n ) {\n try {\n return JSON.parse(trimmed);\n } catch {\n // Not valid JSON, return original\n return value;\n }\n }\n return value;\n}\n\n/**\n * Unwrap arrays and objects to get to the scalar value\n * - Single-element arrays unwrap to their element\n * - Objects with value property unwrap to that value\n * - Recursively unwraps nested structures\n */\nfunction unwrapToScalar(value: unknown): unknown {\n if (value === undefined || value === null) {\n return value;\n }\n\n // Unwrap single-element arrays\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return undefined;\n }\n if (value.length === 1) {\n return unwrapToScalar(value[0]);\n }\n throw new BadRequestError(\"Cannot convert multi-value array to scalar\");\n }\n\n // Unwrap objects with value property\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n return unwrapToScalar(obj.value);\n }\n throw new BadRequestError(\"Object must have a value attribute\");\n }\n\n return value;\n}\n\n/**\n * Prepare a value for scalar conversion by parsing JSON strings and unwrapping\n */\nfunction prepareForScalarConversion(value: unknown): unknown {\n if (value === undefined || value === null) {\n return value;\n }\n\n // Try to parse JSON strings\n if (typeof value === \"string\") {\n const parsed = tryParseJson(value);\n if (parsed !== value) {\n // Successfully parsed, unwrap the result\n return unwrapToScalar(parsed);\n }\n return value;\n }\n\n // Unwrap arrays and objects\n if (Array.isArray(value) || typeof value === \"object\") {\n return unwrapToScalar(value);\n }\n\n return value;\n}\n\n/**\n * Convert a value to a boolean\n * - Arrays, objects, and JSON strings are unwrapped first\n * - String \"true\" becomes true\n * - String \"false\" becomes false\n * - Strings that parse to numbers: positive = true, zero or negative = false\n * - Numbers: positive = true, zero or negative = false\n * - Boolean passes through\n */\nexport function fabricBoolean(value: unknown): boolean | undefined {\n // Prepare value by parsing JSON and unwrapping arrays/objects\n const prepared = prepareForScalarConversion(value);\n\n if (prepared === undefined || prepared === null) {\n return undefined;\n }\n\n if (typeof prepared === \"boolean\") {\n return prepared;\n }\n\n if (typeof prepared === \"string\") {\n if (prepared === \"\") {\n return undefined;\n }\n const lower = prepared.toLowerCase();\n if (lower === \"true\") {\n return true;\n }\n if (lower === \"false\") {\n return false;\n }\n // Try to parse as number\n const num = parseFloat(prepared);\n if (isNaN(num)) {\n throw new BadRequestError(`Cannot convert \"${prepared}\" to Boolean`);\n }\n return num > 0;\n }\n\n if (typeof prepared === \"number\") {\n if (isNaN(prepared)) {\n throw new BadRequestError(\"Cannot convert NaN to Boolean\");\n }\n return prepared > 0;\n }\n\n throw new BadRequestError(`Cannot convert ${typeof prepared} to Boolean`);\n}\n\n/**\n * Convert a value to a number\n * - Arrays, objects, and JSON strings are unwrapped first\n * - String \"\" becomes undefined\n * - String \"true\" becomes 1\n * - String \"false\" becomes 0\n * - Strings that parse to numbers use those values\n * - Strings that parse to NaN throw BadRequestError\n * - Boolean true becomes 1, false becomes 0\n * - Number passes through\n */\nexport function fabricNumber(value: unknown): number | undefined {\n // Prepare value by parsing JSON and unwrapping arrays/objects\n const prepared = prepareForScalarConversion(value);\n\n if (prepared === undefined || prepared === null) {\n return undefined;\n }\n\n if (typeof prepared === \"number\") {\n if (isNaN(prepared)) {\n throw new BadRequestError(\"Cannot convert NaN to Number\");\n }\n return prepared;\n }\n\n if (typeof prepared === \"boolean\") {\n return prepared ? 1 : 0;\n }\n\n if (typeof prepared === \"string\") {\n if (prepared === \"\") {\n return undefined;\n }\n const lower = prepared.toLowerCase();\n if (lower === \"true\") {\n return 1;\n }\n if (lower === \"false\") {\n return 0;\n }\n const num = parseFloat(prepared);\n if (isNaN(num)) {\n throw new BadRequestError(`Cannot convert \"${prepared}\" to Number`);\n }\n return num;\n }\n\n throw new BadRequestError(`Cannot convert ${typeof prepared} to Number`);\n}\n\n/**\n * Convert a value to a string\n * - Arrays, objects, and JSON strings are unwrapped first\n * - String \"\" becomes undefined\n * - Boolean true becomes \"true\", false becomes \"false\"\n * - Number converts to string representation\n * - String passes through\n */\nexport function fabricString(value: unknown): string | undefined {\n // Prepare value by parsing JSON and unwrapping arrays/objects\n const prepared = prepareForScalarConversion(value);\n\n if (prepared === undefined || prepared === null) {\n return undefined;\n }\n\n if (typeof prepared === \"string\") {\n if (prepared === \"\") {\n return undefined;\n }\n return prepared;\n }\n\n if (typeof prepared === \"boolean\") {\n return prepared ? \"true\" : \"false\";\n }\n\n if (typeof prepared === \"number\") {\n if (isNaN(prepared)) {\n throw new BadRequestError(\"Cannot convert NaN to String\");\n }\n return String(prepared);\n }\n\n throw new BadRequestError(`Cannot convert ${typeof prepared} to String`);\n}\n\n/**\n * Convert a value to an array\n * - Non-arrays become arrays containing that value\n * - Arrays of a single value become that value (unwrapped)\n * - Multi-value arrays throw BadRequestError\n * - undefined/null become undefined\n */\nexport function fabricArray(value: unknown): unknown[] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n // Arrays pass through (single-element unwrapping happens when converting FROM array)\n return value;\n }\n\n // Non-arrays become single-element arrays\n return [value];\n}\n\n/**\n * Resolve a value from an array to a scalar\n * - Single-element arrays become that element\n * - Multi-element arrays throw BadRequestError\n * - Non-arrays pass through\n */\nexport function resolveFromArray(value: unknown): unknown {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return undefined;\n }\n if (value.length === 1) {\n return value[0];\n }\n throw new BadRequestError(\"Cannot convert multi-value array to scalar\");\n }\n\n return value;\n}\n\n/**\n * Convert a value to an object with a value property\n * - Scalars become { value: scalar }\n * - Arrays become { value: array }\n * - Objects with a value attribute pass through\n * - Objects without a value attribute throw BadRequestError\n * - undefined/null become undefined\n */\nexport function fabricObject(value: unknown): { value: unknown } | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n // Check if already an object (but not an array)\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n return obj as { value: unknown };\n }\n throw new BadRequestError(\"Object must have a value attribute\");\n }\n\n // Scalars and arrays become { value: ... }\n return { value };\n}\n\n/**\n * Resolve a value from an object to its value property\n * - Objects with a value property return that value\n * - Objects without a value throw BadRequestError\n * - Scalars pass through\n */\nexport function resolveFromObject(value: unknown): unknown {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n return obj.value;\n }\n throw new BadRequestError(\"Object must have a value attribute\");\n }\n\n return value;\n}\n\n/**\n * Check if a type is a typed array (e.g., [String], [Number], [], etc.)\n */\nfunction isTypedArrayType(type: ConversionType): type is TypedArrayType {\n return Array.isArray(type);\n}\n\n/**\n * Split a string on comma or tab delimiters for typed array conversion.\n * Only splits if the string contains commas or tabs.\n * Returns the original value if not a string or no delimiters found.\n */\nfunction splitStringForArray(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n\n // Check for comma or tab delimiters\n if (value.includes(\",\")) {\n return value.split(\",\").map((s) => s.trim());\n }\n if (value.includes(\"\\t\")) {\n return value.split(\"\\t\").map((s) => s.trim());\n }\n\n return value;\n}\n\n/**\n * Try to parse a string as JSON for array context.\n * Returns parsed value if it's an array, otherwise returns original.\n */\nfunction tryParseJsonArray(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n\n const trimmed = value.trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Not valid JSON, fall through\n }\n }\n\n return value;\n}\n\n/**\n * Get the element type from a typed array type\n * Returns undefined for untyped arrays ([])\n */\nfunction getArrayElementType(\n type: TypedArrayType,\n): \"boolean\" | \"number\" | \"object\" | \"string\" | undefined {\n if (type.length === 0) {\n return undefined; // Untyped array\n }\n\n const elementType = type[0];\n\n // Handle constructor types\n if (elementType === Boolean) return \"boolean\";\n if (elementType === Number) return \"number\";\n if (elementType === String) return \"string\";\n if (elementType === Object) return \"object\";\n\n // Handle string types\n if (elementType === \"boolean\") return \"boolean\";\n if (elementType === \"number\") return \"number\";\n if (elementType === \"string\") return \"string\";\n if (elementType === \"object\") return \"object\";\n\n // Handle shorthand types\n if (elementType === \"\") return \"string\"; // \"\" shorthand for String\n if (\n typeof elementType === \"object\" &&\n elementType !== null &&\n Object.keys(elementType).length === 0\n ) {\n return \"object\"; // {} shorthand for Object\n }\n\n throw new BadRequestError(\n `Unknown array element type: ${String(elementType)}`,\n );\n}\n\n/**\n * Convert a value to a typed array\n * - Tries to parse JSON arrays first\n * - Splits strings on comma/tab if present\n * - Wraps non-arrays in an array\n * - Converts each element to the specified element type\n */\nfunction fabricTypedArray(\n value: unknown,\n elementType: \"boolean\" | \"number\" | \"object\" | \"string\" | undefined,\n): unknown[] | undefined {\n // Try to parse JSON array first\n let processed = tryParseJsonArray(value);\n\n // If still a string, try to split on comma/tab\n processed = splitStringForArray(processed);\n\n // Convert to array (wraps non-arrays)\n const array = fabricArray(processed);\n\n if (array === undefined) {\n return undefined;\n }\n\n // If no element type specified, return as-is\n if (elementType === undefined) {\n return array;\n }\n\n // Convert each element to the element type\n return array.map((element, index) => {\n try {\n switch (elementType) {\n case \"boolean\":\n return fabricBoolean(element);\n case \"number\":\n return fabricNumber(element);\n case \"object\":\n return fabricObject(element);\n case \"string\":\n return fabricString(element);\n default:\n throw new BadRequestError(`Unknown element type: ${elementType}`);\n }\n } catch (error) {\n if (error instanceof BadRequestError) {\n throw new BadRequestError(\n `Cannot convert array element at index ${index}: ${error.message}`,\n );\n }\n throw error;\n }\n });\n}\n\n/**\n * Fabric a value to the specified type\n */\nexport function fabric(value: unknown, type: ConversionType): unknown {\n // Check for Date type first\n if (isDateType(type)) {\n return fabricDate(value);\n }\n\n // Check for typed array types\n if (isTypedArrayType(type)) {\n const elementType = getArrayElementType(type);\n return fabricTypedArray(value, elementType);\n }\n\n const normalizedType = normalizeType(type);\n\n switch (normalizedType) {\n case \"array\":\n return fabricArray(value);\n case \"boolean\":\n return fabricBoolean(value);\n case \"number\":\n return fabricNumber(value);\n case \"object\":\n return fabricObject(value);\n case \"string\":\n return fabricString(value);\n default:\n throw new BadRequestError(`Unknown type: ${String(type)}`);\n }\n}\n\n/**\n * Normalize type to string representation\n */\nfunction normalizeType(\n type: ConversionType,\n): \"array\" | \"boolean\" | \"number\" | \"object\" | \"string\" {\n if (type === Array || type === \"array\") {\n return \"array\";\n }\n if (type === Boolean || type === \"boolean\") {\n return \"boolean\";\n }\n if (type === Number || type === \"number\") {\n return \"number\";\n }\n if (type === Object || type === \"object\") {\n return \"object\";\n }\n if (type === String || type === \"string\") {\n return \"string\";\n }\n throw new BadRequestError(`Unknown type: ${String(type)}`);\n}\n","// Service for @jaypie/fabric\n\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport { FABRIC_VERSION } from \"./constants.js\";\nimport { fabric } from \"./resolve.js\";\nimport type {\n ConversionType,\n InputFieldDefinition,\n Service,\n ServiceConfig,\n ServiceContext,\n ValidateFunction,\n} from \"./types.js\";\n\n/**\n * Check if a single-element array is a typed array type constructor.\n */\nfunction isTypedArrayConstructor(element: unknown): boolean {\n return (\n element === Boolean ||\n element === Number ||\n element === String ||\n element === Object ||\n element === \"boolean\" ||\n element === \"number\" ||\n element === \"string\" ||\n element === \"object\" ||\n element === \"\" ||\n (typeof element === \"object\" &&\n element !== null &&\n !(element instanceof RegExp) &&\n Object.keys(element as Record<string, unknown>).length === 0)\n );\n}\n\n/**\n * Check if a type is a validated string type (array of string literals and/or RegExp).\n * Distinguishes from typed arrays like [String], [Number], etc.\n */\nfunction isValidatedStringType(\n type: ConversionType,\n): type is Array<string | RegExp> {\n if (!Array.isArray(type)) {\n return false;\n }\n\n // Empty array is untyped array, not validated string\n if (type.length === 0) {\n return false;\n }\n\n // Single-element arrays with type constructors are typed arrays\n if (type.length === 1 && isTypedArrayConstructor(type[0])) {\n return false;\n }\n\n // Check that all elements are strings or RegExp\n return type.every(\n (item) => typeof item === \"string\" || item instanceof RegExp,\n );\n}\n\n/**\n * Check if a type is a validated number type (array of number literals).\n * Distinguishes from typed arrays like [Number], etc.\n */\nfunction isValidatedNumberType(type: ConversionType): type is Array<number> {\n if (!Array.isArray(type)) {\n return false;\n }\n\n // Empty array is untyped array, not validated number\n if (type.length === 0) {\n return false;\n }\n\n // Single-element arrays with type constructors are typed arrays\n if (type.length === 1 && isTypedArrayConstructor(type[0])) {\n return false;\n }\n\n // Check that all elements are numbers\n return type.every((item) => typeof item === \"number\");\n}\n\n/**\n * Parse input string as JSON if it's a string\n */\nfunction parseInput(input: unknown): Record<string, unknown> {\n if (input === undefined || input === null) {\n return {};\n }\n\n if (typeof input === \"string\") {\n if (input === \"\") {\n return {};\n }\n try {\n const parsed = JSON.parse(input);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n throw new BadRequestError(\"Input must be an object\");\n }\n return parsed as Record<string, unknown>;\n } catch (error) {\n if (error instanceof BadRequestError) {\n throw error;\n }\n throw new BadRequestError(\"Invalid JSON input\");\n }\n }\n\n if (typeof input === \"object\" && !Array.isArray(input)) {\n return input as Record<string, unknown>;\n }\n\n throw new BadRequestError(\"Input must be an object or JSON string\");\n}\n\n/**\n * Run validation on a value (supports async validators)\n */\nasync function runValidation(\n value: unknown,\n validate: ValidateFunction | RegExp | Array<unknown>,\n fieldName: string,\n): Promise<void> {\n if (typeof validate === \"function\") {\n const result = await validate(value);\n if (result === false) {\n throw new BadRequestError(`Validation failed for field \"${fieldName}\"`);\n }\n } else if (validate instanceof RegExp) {\n if (typeof value !== \"string\" || !validate.test(value)) {\n throw new BadRequestError(`Validation failed for field \"${fieldName}\"`);\n }\n } else if (Array.isArray(validate)) {\n // Check if value matches any item in the array\n for (const item of validate) {\n if (item instanceof RegExp) {\n if (typeof value === \"string\" && item.test(value)) {\n return; // Match found\n }\n } else if (typeof item === \"function\") {\n try {\n const result = await (item as ValidateFunction)(value);\n if (result !== false) {\n return; // Match found\n }\n } catch {\n // Continue to next item\n }\n } else if (value === item) {\n return; // Scalar match found\n }\n }\n throw new BadRequestError(`Validation failed for field \"${fieldName}\"`);\n }\n}\n\n/**\n * Check if a field is required\n * A field is required unless it has a default OR required is explicitly false\n */\nfunction isFieldRequired(definition: InputFieldDefinition): boolean {\n if (definition.required === false) {\n return false;\n }\n if (definition.default !== undefined) {\n return false;\n }\n return true;\n}\n\n/**\n * Process a single field through conversion and validation\n */\nasync function processField(\n fieldName: string,\n value: unknown,\n definition: InputFieldDefinition,\n): Promise<unknown> {\n // Apply default if value is undefined\n let processedValue = value;\n if (processedValue === undefined && definition.default !== undefined) {\n processedValue = definition.default;\n }\n\n // Determine actual type and validation\n let actualType: ConversionType = definition.type;\n let validation = definition.validate;\n\n // Handle bare RegExp shorthand: /regex/\n if (definition.type instanceof RegExp) {\n actualType = String;\n validation = definition.type; // The RegExp becomes the validation\n }\n // Handle validated string shorthand: [\"value1\", \"value2\"] or [/regex/]\n else if (isValidatedStringType(definition.type)) {\n actualType = String;\n validation = definition.type; // The array becomes the validation\n }\n // Handle validated number shorthand: [1, 2, 3]\n else if (isValidatedNumberType(definition.type)) {\n actualType = Number;\n validation = definition.type; // The array becomes the validation\n }\n\n // Fabric to target type\n const convertedValue = fabric(processedValue, actualType);\n\n // Check if required field is missing\n if (convertedValue === undefined && isFieldRequired(definition)) {\n throw new BadRequestError(`Missing required field \"${fieldName}\"`);\n }\n\n // Run validation if provided\n if (validation !== undefined && convertedValue !== undefined) {\n await runValidation(convertedValue, validation, fieldName);\n }\n\n return convertedValue;\n}\n\n/**\n * Fabric a service function\n *\n * Service builds a function that initiates a \"controller\" step that:\n * - Parses the input if it is a string to object\n * - Fabrics each input field to its type\n * - Calls the validation function or regular expression or checks the array\n * - Calls the service function and returns the response\n *\n * The returned function has config properties for introspection.\n */\nexport function fabricService<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n>(config: ServiceConfig<TInput, TOutput>): Service<TInput, TOutput> {\n const { input: inputDefinitions, service } = config;\n\n const handler = async (\n rawInput?: Partial<TInput> | string,\n context?: ServiceContext,\n ): Promise<TOutput> => {\n // Parse input (handles string JSON)\n const parsedInput = parseInput(rawInput);\n\n // If no input definitions, pass through to service or return parsed input\n if (!inputDefinitions) {\n if (service) {\n return service(parsedInput as TInput, context);\n }\n return parsedInput as TOutput;\n }\n\n // Process all fields in parallel\n const entries = Object.entries(inputDefinitions);\n const processedValues = await Promise.all(\n entries.map(([fieldName, definition]) =>\n processField(fieldName, parsedInput[fieldName], definition),\n ),\n );\n\n // Build processed input object\n const processedInput: Record<string, unknown> = {};\n entries.forEach(([fieldName], index) => {\n processedInput[fieldName] = processedValues[index];\n });\n\n // Return processed input if no service, otherwise call service\n if (service) {\n return service(processedInput as TInput, context);\n }\n return processedInput as TOutput;\n };\n\n // Attach config properties directly to handler for flat access\n const typedHandler = handler as Service<TInput, TOutput>;\n typedHandler.$fabric = FABRIC_VERSION;\n if (config.alias !== undefined) typedHandler.alias = config.alias;\n if (config.description !== undefined)\n typedHandler.description = config.description;\n if (config.input !== undefined) typedHandler.input = config.input;\n if (config.service !== undefined) typedHandler.service = config.service;\n\n return typedHandler;\n}\n","import { UnauthorizedError } from \"@jaypie/errors\";\n\nimport type { AuthorizationConfig, AuthorizationFunction } from \"./types.js\";\n\n/**\n * Extract token from Authorization header\n * Removes \"Bearer \" prefix (case insensitive) and strips whitespace\n *\n * Examples:\n * - \"Bearer eyJhbGc...\" → \"eyJhbGc...\"\n * - \"bearer eyJhbGc...\" → \"eyJhbGc...\"\n * - \"BEARER eyJhbGc...\" → \"eyJhbGc...\"\n * - \"eyJhbGc...\" → \"eyJhbGc...\"\n * - \" eyJhbGc... \" → \"eyJhbGc...\"\n */\nexport function extractToken(authHeader: string | null | undefined): string {\n if (!authHeader) {\n return \"\";\n }\n\n let token = authHeader.trim();\n\n // Remove \"Bearer \" prefix (case insensitive)\n const bearerRegex = /^bearer\\s+/i;\n if (bearerRegex.test(token)) {\n token = token.replace(bearerRegex, \"\");\n }\n\n return token.trim();\n}\n\n/**\n * Get authorization header from Headers object\n */\nexport function getAuthHeader(headers: Headers): string | null {\n return headers.get(\"authorization\");\n}\n\n/**\n * Validate authorization and return auth context\n *\n * @param headers - Request headers\n * @param config - Authorization configuration (function or false)\n * @returns Auth context from the authorization function, or undefined if public\n * @throws UnauthorizedError if authorization fails\n */\nexport async function validateAuthorization<TAuth = unknown>(\n headers: Headers,\n config: AuthorizationConfig<TAuth>,\n): Promise<TAuth | undefined> {\n // Public endpoint - no authorization required\n if (config === false) {\n return undefined;\n }\n\n const authHeader = getAuthHeader(headers);\n const token = extractToken(authHeader);\n\n // If authorization is required but no token provided\n if (!token) {\n throw new UnauthorizedError(\"Authorization header required\");\n }\n\n // Call the authorization function\n const authFunction = config as AuthorizationFunction<TAuth>;\n return authFunction(token);\n}\n\n/**\n * Check if authorization is required\n */\nexport function isAuthorizationRequired(\n config: AuthorizationConfig<unknown>,\n): boolean {\n return config !== false;\n}\n","import type { HttpContext, HttpTransformFunction } from \"./types.js\";\n\n/**\n * Default HTTP transformation function\n * Merges query parameters with body (body takes precedence)\n */\nexport const defaultHttpTransform: HttpTransformFunction = ({\n body,\n query,\n}) => {\n const queryObject = Object.fromEntries(query.entries());\n const bodyObject = typeof body === \"object\" && body !== null ? body : {};\n\n return {\n ...queryObject,\n ...bodyObject,\n } as Record<string, unknown>;\n};\n\n/**\n * Parse query string into URLSearchParams\n */\nexport function parseQueryString(queryString: string): URLSearchParams {\n // Remove leading ? if present\n const normalized = queryString.startsWith(\"?\")\n ? queryString.slice(1)\n : queryString;\n return new URLSearchParams(normalized);\n}\n\n/**\n * Parse path parameters from a URL path using a route pattern\n * @param path - The actual URL path (e.g., \"/users/123\")\n * @param pattern - The route pattern (e.g., \"/users/:id\")\n * @returns Object with extracted parameters\n */\nexport function parsePathParams(\n path: string,\n pattern: string,\n): Record<string, string> {\n const params: Record<string, string> = {};\n\n const pathParts = path.split(\"/\").filter(Boolean);\n const patternParts = pattern.split(\"/\").filter(Boolean);\n\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i];\n const pathPart = pathParts[i];\n\n if (patternPart.startsWith(\":\")) {\n // Extract parameter name (remove : prefix and ? suffix for optional params)\n const paramName = patternPart.slice(1).replace(\"?\", \"\");\n if (pathPart !== undefined) {\n params[paramName] = pathPart;\n }\n }\n }\n\n return params;\n}\n\n/**\n * Parse request body from string or return as-is if already parsed\n */\nexport function parseBody(body: unknown): unknown {\n if (typeof body === \"string\") {\n try {\n return JSON.parse(body);\n } catch {\n // Return as-is if not valid JSON\n return body;\n }\n }\n return body;\n}\n\n/**\n * Create HTTP context from raw request data\n */\nexport function createHttpContext(options: {\n body?: unknown;\n headers?: Headers | Record<string, string>;\n method?: string;\n path?: string;\n queryString?: string;\n params?: Record<string, string>;\n}): HttpContext {\n const {\n body = {},\n headers = {},\n method = \"GET\",\n path = \"/\",\n queryString = \"\",\n params = {},\n } = options;\n\n // Normalize headers to Headers object\n const normalizedHeaders =\n headers instanceof Headers\n ? headers\n : new Headers(headers as Record<string, string>);\n\n return {\n body: parseBody(body),\n headers: normalizedHeaders,\n method: method.toUpperCase(),\n path,\n query: parseQueryString(queryString),\n params,\n };\n}\n\n/**\n * Apply HTTP transformation to get service input\n */\nexport async function transformHttpToInput<TInput = Record<string, unknown>>(\n context: HttpContext,\n transform: HttpTransformFunction<TInput> = defaultHttpTransform as HttpTransformFunction<TInput>,\n): Promise<TInput> {\n return transform(context);\n}\n","import { fabricService } from \"../service.js\";\nimport type { Service, ServiceConfig, ServiceContext } from \"../types.js\";\n\nimport { validateAuthorization } from \"./authorization.js\";\nimport { defaultHttpTransform } from \"./httpTransform.js\";\nimport type {\n FabricHttpConfig,\n FabricHttpService,\n HttpContext,\n HttpTransformFunction,\n} from \"./types.js\";\n\n/**\n * Check if a value is a fabricService (has $fabric property)\n */\nfunction isFabricService<TInput extends Record<string, unknown>, TOutput>(\n value: unknown,\n): value is Service<TInput, TOutput> {\n return (\n typeof value === \"function\" &&\n \"$fabric\" in value &&\n typeof (value as Service<TInput, TOutput>).$fabric === \"string\"\n );\n}\n\n/**\n * Extended service context with auth information\n */\nexport interface HttpServiceContext<TAuth = unknown> extends ServiceContext {\n /** Authorization result (returned from authorization function) */\n auth?: TAuth;\n /** HTTP context for advanced use cases */\n http?: HttpContext;\n}\n\n/**\n * Create an HTTP-aware fabric service\n *\n * Extends fabricService with:\n * - HTTP context transformation (body, headers, method, path, query, params)\n * - Authorization handling (token extraction from Authorization header)\n * - CORS configuration (enabled by default)\n *\n * Accepts either:\n * - Inline service definition (with `service` function)\n * - Pre-built `fabricService` instance (via `service` property)\n */\nexport function fabricHttp<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n TAuth = unknown,\n>(\n config: FabricHttpConfig<TInput, TOutput, TAuth>,\n): FabricHttpService<TInput, TOutput, TAuth> {\n const {\n authorization = false,\n cors = true,\n http = defaultHttpTransform as HttpTransformFunction<TInput>,\n service: serviceConfig,\n stream = false,\n ...baseConfig\n } = config;\n\n // Resolve the underlying service\n let underlyingService: Service<TInput, TOutput>;\n\n if (isFabricService<TInput, TOutput>(serviceConfig)) {\n // Pre-built fabricService - merge configs\n underlyingService = serviceConfig;\n\n // Merge base config properties from the pre-built service\n if (\n baseConfig.alias === undefined &&\n underlyingService.alias !== undefined\n ) {\n baseConfig.alias = underlyingService.alias;\n }\n if (\n baseConfig.description === undefined &&\n underlyingService.description !== undefined\n ) {\n baseConfig.description = underlyingService.description;\n }\n if (\n baseConfig.input === undefined &&\n underlyingService.input !== undefined\n ) {\n baseConfig.input = underlyingService.input;\n }\n } else {\n // Inline service definition or plain function\n const serviceFunction = serviceConfig as ServiceConfig<\n TInput,\n TOutput\n >[\"service\"];\n underlyingService = fabricService<TInput, TOutput>({\n ...baseConfig,\n service: serviceFunction,\n } as ServiceConfig<TInput, TOutput>);\n }\n\n // Create the HTTP handler that processes HTTP context\n const httpHandler = async (\n input?: Partial<TInput> | string,\n context?: HttpServiceContext<TAuth>,\n ): Promise<TOutput> => {\n // If context has HTTP info, process authorization\n // (HTTP context is added by the adapter layer like fabricExpress)\n if (context?.http && authorization !== false) {\n const authResult = await validateAuthorization<TAuth>(\n context.http.headers,\n authorization,\n );\n // Add auth result to context\n (context as HttpServiceContext<TAuth>).auth = authResult;\n }\n\n // Call the underlying service\n return underlyingService(input, context);\n };\n\n // Create the HTTP service with all properties\n const httpService = httpHandler as FabricHttpService<TInput, TOutput, TAuth>;\n\n // Copy properties from config (which may have been merged with underlying service)\n httpService.$fabric = underlyingService.$fabric;\n\n // Use baseConfig values (which include overrides) or fall back to underlying service\n const resolvedAlias = baseConfig.alias ?? underlyingService.alias;\n const resolvedDescription =\n baseConfig.description ?? underlyingService.description;\n const resolvedInput = baseConfig.input ?? underlyingService.input;\n\n if (resolvedAlias !== undefined) {\n httpService.alias = resolvedAlias;\n }\n if (resolvedDescription !== undefined) {\n httpService.description = resolvedDescription;\n }\n if (resolvedInput !== undefined) {\n httpService.input = resolvedInput;\n }\n if (underlyingService.service !== undefined) {\n httpService.service = underlyingService.service;\n }\n\n // Add HTTP-specific properties\n httpService.authorization = authorization;\n httpService.cors = cors;\n httpService.http = http;\n httpService.stream = stream;\n\n return httpService;\n}\n\n/**\n * Check if a service is an HTTP service (has http, authorization, cors properties)\n */\nexport function isFabricHttpService<\n TInput extends Record<string, unknown>,\n TOutput,\n TAuth,\n>(value: unknown): value is FabricHttpService<TInput, TOutput, TAuth> {\n return (\n isFabricService<TInput, TOutput>(value) &&\n \"authorization\" in value &&\n \"cors\" in value &&\n \"http\" in value &&\n \"stream\" in value\n );\n}\n","import type {\n CorsConfig,\n CorsHeaders,\n CorsOption,\n HttpMethod,\n} from \"./types.js\";\n\n/**\n * Default CORS configuration\n */\nexport const DEFAULT_CORS_CONFIG: CorsConfig = {\n origin: \"*\",\n credentials: false,\n headers: [\"Content-Type\", \"Authorization\"],\n exposeHeaders: [],\n maxAge: 86400, // 24 hours\n};\n\n/**\n * Default allowed methods for CORS\n */\nexport const DEFAULT_CORS_METHODS: HttpMethod[] = [\n \"GET\",\n \"POST\",\n \"DELETE\",\n \"OPTIONS\",\n];\n\n/**\n * Normalize CORS option to CorsConfig\n * - true → default config\n * - false → disabled (returns undefined)\n * - CorsConfig → merged with defaults\n */\nexport function normalizeCorsConfig(\n option: CorsOption | undefined,\n): CorsConfig | undefined {\n // Undefined or true → use defaults\n if (option === undefined || option === true) {\n return { ...DEFAULT_CORS_CONFIG };\n }\n\n // False → disabled\n if (option === false) {\n return undefined;\n }\n\n // Merge with defaults\n return {\n ...DEFAULT_CORS_CONFIG,\n ...option,\n };\n}\n\n/**\n * Get the allowed origin for a request\n * @param config - CORS configuration\n * @param requestOrigin - Origin header from request\n * @returns The origin to allow, or undefined if not allowed\n */\nexport function getAllowedOrigin(\n config: CorsConfig,\n requestOrigin: string | null,\n): string | undefined {\n const { origin } = config;\n\n // Wildcard allows all\n if (origin === \"*\") {\n return \"*\";\n }\n\n // No origin in request\n if (!requestOrigin) {\n return undefined;\n }\n\n // Array of allowed origins\n if (Array.isArray(origin)) {\n if (origin.includes(requestOrigin)) {\n return requestOrigin;\n }\n return undefined;\n }\n\n // Single origin string\n if (origin === requestOrigin) {\n return requestOrigin;\n }\n\n return undefined;\n}\n\n/**\n * Build CORS headers for a response\n * @param config - CORS configuration\n * @param requestOrigin - Origin header from request\n * @param methods - Allowed HTTP methods\n * @returns Object with CORS headers, or empty object if CORS is disabled\n */\nexport function buildCorsHeaders(\n config: CorsConfig | undefined,\n requestOrigin: string | null,\n methods: HttpMethod[] = DEFAULT_CORS_METHODS,\n): CorsHeaders {\n if (!config) {\n return {};\n }\n\n const headers: CorsHeaders = {};\n\n // Access-Control-Allow-Origin\n const allowedOrigin = getAllowedOrigin(config, requestOrigin);\n if (allowedOrigin) {\n headers[\"Access-Control-Allow-Origin\"] = allowedOrigin;\n }\n\n // Access-Control-Allow-Methods\n headers[\"Access-Control-Allow-Methods\"] = methods.join(\", \");\n\n // Access-Control-Allow-Headers\n if (config.headers && config.headers.length > 0) {\n headers[\"Access-Control-Allow-Headers\"] = config.headers.join(\", \");\n }\n\n // Access-Control-Allow-Credentials\n if (config.credentials) {\n headers[\"Access-Control-Allow-Credentials\"] = \"true\";\n }\n\n // Access-Control-Expose-Headers\n if (config.exposeHeaders && config.exposeHeaders.length > 0) {\n headers[\"Access-Control-Expose-Headers\"] = config.exposeHeaders.join(\", \");\n }\n\n // Access-Control-Max-Age\n if (config.maxAge !== undefined) {\n headers[\"Access-Control-Max-Age\"] = String(config.maxAge);\n }\n\n return headers;\n}\n\n/**\n * Check if request is a CORS preflight request\n */\nexport function isPreflightRequest(method: string, headers: Headers): boolean {\n return (\n method.toUpperCase() === \"OPTIONS\" &&\n headers.has(\"access-control-request-method\")\n );\n}\n\n/**\n * Build preflight response headers\n * Includes all CORS headers needed for preflight response\n */\nexport function buildPreflightHeaders(\n config: CorsConfig | undefined,\n requestOrigin: string | null,\n requestMethod: string | null,\n requestHeaders: string | null,\n methods: HttpMethod[] = DEFAULT_CORS_METHODS,\n): CorsHeaders {\n if (!config) {\n return {};\n }\n\n const headers = buildCorsHeaders(config, requestOrigin, methods);\n\n // Include requested headers in response if not already covered\n if (requestHeaders) {\n const requestedHeaders = requestHeaders.split(\",\").map((h) => h.trim());\n const allowedHeaders = config.headers || [];\n const combinedHeaders = [\n ...new Set([...allowedHeaders, ...requestedHeaders]),\n ];\n headers[\"Access-Control-Allow-Headers\"] = combinedHeaders.join(\", \");\n }\n\n return headers;\n}\n","import type { Service, ServiceConfig } from \"../types.js\";\n\n// #region HTTP Context\n\n/**\n * HTTP request context passed to the `http` transformation function\n */\nexport interface HttpContext {\n /** Parsed request body */\n body: unknown;\n /** Request headers */\n headers: Headers;\n /** HTTP method (GET, POST, PUT, DELETE, PATCH) */\n method: string;\n /** URL path */\n path: string;\n /** Query string parameters */\n query: URLSearchParams;\n /** Path parameters extracted from route pattern (e.g., :id) */\n params: Record<string, string>;\n}\n\n/**\n * Function that transforms HTTP context to fabric service input\n */\nexport type HttpTransformFunction<TInput = Record<string, unknown>> = (\n context: HttpContext,\n) => TInput | Promise<TInput>;\n\n// #endregion\n\n// #region Authorization\n\n/**\n * Authorization function that validates a token and returns auth context\n * Token is extracted from Authorization header with Bearer prefix removed\n */\nexport type AuthorizationFunction<TAuth = unknown> = (\n token: string,\n) => TAuth | Promise<TAuth>;\n\n/**\n * Authorization configuration - either a function or false for public endpoints\n */\nexport type AuthorizationConfig<TAuth = unknown> =\n | AuthorizationFunction<TAuth>\n | false;\n\n// #endregion\n\n// #region CORS\n\n/**\n * CORS configuration options\n */\nexport interface CorsConfig {\n /** Allowed origins - \"*\" for all, or array of specific origins */\n origin?: string | string[];\n /** Allow credentials (Access-Control-Allow-Credentials) */\n credentials?: boolean;\n /** Additional allowed headers (Access-Control-Allow-Headers) */\n headers?: string[];\n /** Headers to expose to the client (Access-Control-Expose-Headers) */\n exposeHeaders?: string[];\n /** Preflight cache duration in seconds (Access-Control-Max-Age) */\n maxAge?: number;\n}\n\n/**\n * CORS configuration - object config, true for defaults, or false to disable\n */\nexport type CorsOption = CorsConfig | boolean;\n\n/**\n * Resolved CORS headers to send in response\n */\nexport interface CorsHeaders {\n \"Access-Control-Allow-Origin\"?: string;\n \"Access-Control-Allow-Methods\"?: string;\n \"Access-Control-Allow-Headers\"?: string;\n \"Access-Control-Allow-Credentials\"?: string;\n \"Access-Control-Expose-Headers\"?: string;\n \"Access-Control-Max-Age\"?: string;\n}\n\n// #endregion\n\n// #region Response Format\n\n/**\n * JSON:API-style success response envelope\n */\nexport interface DataResponse<T = unknown> {\n data: T;\n}\n\n/**\n * JSON:API-style error object\n */\nexport interface ErrorObject {\n status: number;\n title: string;\n detail?: string;\n}\n\n/**\n * JSON:API-style error response envelope\n */\nexport interface ErrorResponse {\n errors: ErrorObject[];\n}\n\n// #endregion\n\n// #region fabricHttp Config\n\n/**\n * HTTP service configuration - extends base ServiceConfig with HTTP-specific options\n */\nexport interface FabricHttpConfig<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n TAuth = unknown,\n> extends Omit<ServiceConfig<TInput, TOutput>, \"service\"> {\n /** Pre-built fabricService or inline service function */\n service?:\n | Service<TInput, TOutput>\n | ServiceConfig<TInput, TOutput>[\"service\"];\n\n /** Transform HTTP context to service input (defaults to body + query merge) */\n http?: HttpTransformFunction<TInput>;\n\n /** Authorization function or false for public endpoints */\n authorization?: AuthorizationConfig<TAuth>;\n\n /** CORS configuration (enabled by default) */\n cors?: CorsOption;\n\n /** Streaming configuration (disabled by default) */\n stream?: StreamOption;\n}\n\n/**\n * HTTP service - fabricService with HTTP-specific metadata\n */\nexport interface FabricHttpService<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n TAuth = unknown,\n> extends Service<TInput, TOutput> {\n /** HTTP transformation function */\n http: HttpTransformFunction<TInput>;\n /** Authorization configuration */\n authorization: AuthorizationConfig<TAuth>;\n /** CORS configuration */\n cors: CorsOption;\n /** Streaming configuration */\n stream: StreamOption;\n}\n\n// #endregion\n\n// #region HTTP Methods\n\n/**\n * Supported HTTP methods\n */\nexport type HttpMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"DELETE\"\n | \"PATCH\"\n | \"OPTIONS\";\n\n/**\n * Default HTTP methods for fabric services\n */\nexport const DEFAULT_HTTP_METHODS: HttpMethod[] = [\"GET\", \"POST\", \"DELETE\"];\n\n// #endregion\n\n// #region Streaming\n\n/**\n * HTTP stream event types for SSE/NDJSON streaming\n */\nexport enum HttpStreamEventType {\n /** Stream complete */\n Complete = \"complete\",\n /** Final response data */\n Data = \"data\",\n /** Error event */\n Error = \"error\",\n /** Fabric progress message (from sendMessage) */\n Message = \"message\",\n /** Keep-alive signal (no content) */\n Noop = \"noop\",\n /** LLM text chunk */\n Text = \"text\",\n /** LLM tool call event */\n ToolCall = \"tool_call\",\n /** LLM tool result event */\n ToolResult = \"tool_result\",\n}\n\n/**\n * Base stream event structure\n */\nexport interface HttpStreamEventBase {\n stream: HttpStreamEventType;\n}\n\n/**\n * Message event - progress updates from sendMessage\n */\nexport interface HttpStreamEventMessage extends HttpStreamEventBase {\n stream: HttpStreamEventType.Message;\n content: string;\n level?: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\";\n}\n\n/**\n * Text event - LLM text chunk\n */\nexport interface HttpStreamEventText extends HttpStreamEventBase {\n stream: HttpStreamEventType.Text;\n content: string;\n}\n\n/**\n * Tool call event - LLM requesting tool execution\n */\nexport interface HttpStreamEventToolCall extends HttpStreamEventBase {\n stream: HttpStreamEventType.ToolCall;\n toolCall: {\n id: string;\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Tool result event - result from tool execution\n */\nexport interface HttpStreamEventToolResult extends HttpStreamEventBase {\n stream: HttpStreamEventType.ToolResult;\n toolResult: {\n id: string;\n name: string;\n result: unknown;\n };\n}\n\n/**\n * Data event - final response data\n */\nexport interface HttpStreamEventData<T = unknown> extends HttpStreamEventBase {\n stream: HttpStreamEventType.Data;\n data: T;\n}\n\n/**\n * Error event\n */\nexport interface HttpStreamEventError extends HttpStreamEventBase {\n stream: HttpStreamEventType.Error;\n error: {\n status: number | string;\n title: string;\n detail?: string;\n };\n}\n\n/**\n * Complete event - stream complete\n */\nexport interface HttpStreamEventComplete extends HttpStreamEventBase {\n stream: HttpStreamEventType.Complete;\n}\n\n/**\n * Noop event - keep-alive signal\n */\nexport interface HttpStreamEventNoop extends HttpStreamEventBase {\n stream: HttpStreamEventType.Noop;\n}\n\n/**\n * Union of all stream event types\n */\nexport type HttpStreamEvent =\n | HttpStreamEventComplete\n | HttpStreamEventData\n | HttpStreamEventError\n | HttpStreamEventMessage\n | HttpStreamEventNoop\n | HttpStreamEventText\n | HttpStreamEventToolCall\n | HttpStreamEventToolResult;\n\n/**\n * Stream configuration options (internal)\n */\nexport interface StreamConfig {\n /** Output format - NDJSON (default) or SSE */\n format?: \"ndjson\" | \"sse\";\n /** Keep-alive heartbeat interval in ms (default: 15000) */\n heartbeat?: number;\n /** Include tool calls/results in stream (default: true) */\n includeTools?: boolean;\n}\n\n/**\n * Stream option - true to enable streaming, false to disable\n */\nexport type StreamOption = boolean;\n\n/**\n * Streaming service function that yields events\n */\nexport type StreamingServiceFunction<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n> = (\n input: TInput,\n context: unknown,\n) => AsyncIterable<HttpStreamEvent> | Promise<AsyncIterable<HttpStreamEvent>>;\n\n// #endregion\n\n// #region FabricHttpServer Config\n\n/**\n * Route entry for FabricHttpServer - service with path and method configuration\n */\nexport interface FabricHttpServerRoute<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n TAuth = unknown,\n> {\n /** The FabricHttpService to handle requests */\n service: FabricHttpService<TInput, TOutput, TAuth>;\n /** Route path pattern (defaults to /${alias}) */\n path?: string;\n /** Allowed HTTP methods (defaults to DEFAULT_HTTP_METHODS) */\n methods?: HttpMethod[];\n}\n\n/**\n * Service entry - either a FabricHttpService or a route config\n */\nexport type FabricHttpServerServiceEntry =\n | FabricHttpService\n | FabricHttpServerRoute;\n\n/**\n * Configuration for FabricHttpServer\n */\nexport interface FabricHttpServerConfig {\n /** Array of services or route configs to register */\n services: FabricHttpServerServiceEntry[];\n /** Server-level authorization (applied to all services unless overridden) */\n authorization?: AuthorizationConfig;\n /** Server-level CORS config (applied to all services unless overridden) */\n cors?: CorsOption;\n /** Path prefix for all routes (e.g., \"/api\") */\n prefix?: string;\n}\n\n/**\n * API Gateway v1 (REST API) event format\n */\nexport interface ApiGatewayV1Event {\n body: string | null;\n headers: Record<string, string>;\n httpMethod: string;\n path: string;\n pathParameters?: Record<string, string> | null;\n queryStringParameters?: Record<string, string> | null;\n requestContext?: {\n requestId?: string;\n };\n}\n\n/**\n * API Gateway v2 (HTTP API) event format\n */\nexport interface ApiGatewayV2Event {\n body?: string;\n headers: Record<string, string>;\n rawPath: string;\n rawQueryString?: string;\n requestContext: {\n http: {\n method: string;\n path: string;\n };\n requestId?: string;\n };\n pathParameters?: Record<string, string>;\n queryStringParameters?: Record<string, string>;\n}\n\n/**\n * Union of API Gateway event types\n */\nexport type ApiGatewayEvent = ApiGatewayV1Event | ApiGatewayV2Event;\n\n/**\n * API Gateway response format (compatible with v1 and v2)\n */\nexport interface ApiGatewayResponse {\n statusCode: number;\n headers: Record<string, string>;\n body: string;\n}\n\n/**\n * Registered route with resolved path and methods\n */\nexport interface RegisteredRoute {\n /** Compiled path pattern */\n path: string;\n /** Path segments for matching */\n segments: string[];\n /** Allowed methods */\n methods: HttpMethod[];\n /** The service to handle requests */\n service: FabricHttpService;\n}\n\n/**\n * Match result from route matching\n */\nexport interface RouteMatch {\n /** The matched route */\n route: RegisteredRoute;\n /** Extracted path parameters */\n params: Record<string, string>;\n}\n\n/**\n * FabricHttpServer handler function\n */\nexport type FabricHttpServerHandler = (\n event: ApiGatewayEvent,\n) => Promise<ApiGatewayResponse>;\n\n/**\n * FabricHttpServer with metadata\n */\nexport interface FabricHttpServer extends FabricHttpServerHandler {\n /** Registered services */\n services: FabricHttpService[];\n /** Route prefix */\n prefix?: string;\n /** Registered routes */\n routes: RegisteredRoute[];\n}\n\n// #endregion\n","// FabricHttpServer - Standalone Lambda/server for multi-service HTTP routing\n\nimport { isJaypieError, JaypieError } from \"@jaypie/errors\";\n\nimport type { HttpServiceContext } from \"./fabricHttp.js\";\nimport { isFabricHttpService } from \"./fabricHttp.js\";\nimport {\n buildCorsHeaders,\n buildPreflightHeaders,\n isPreflightRequest,\n normalizeCorsConfig,\n} from \"./cors.js\";\nimport { createHttpContext, transformHttpToInput } from \"./httpTransform.js\";\nimport type {\n ApiGatewayEvent,\n ApiGatewayResponse,\n ApiGatewayV1Event,\n ApiGatewayV2Event,\n AuthorizationConfig,\n CorsHeaders,\n CorsOption,\n DataResponse,\n ErrorResponse,\n FabricHttpServer as FabricHttpServerType,\n FabricHttpServerConfig,\n FabricHttpServerRoute,\n FabricHttpService,\n HttpMethod,\n RegisteredRoute,\n RouteMatch,\n} from \"./types.js\";\nimport { DEFAULT_HTTP_METHODS } from \"./types.js\";\n\n/**\n * Check if event is API Gateway v2 format\n */\nfunction isApiGatewayV2Event(event: ApiGatewayEvent): event is ApiGatewayV2Event {\n return \"requestContext\" in event && \"http\" in (event as ApiGatewayV2Event).requestContext;\n}\n\n/**\n * Check if entry is a FabricHttpServerRoute (has service property)\n */\nfunction isRouteConfig(\n entry: FabricHttpService | FabricHttpServerRoute,\n): entry is FabricHttpServerRoute {\n return (\n typeof entry === \"object\" &&\n entry !== null &&\n \"service\" in entry &&\n isFabricHttpService(entry.service)\n );\n}\n\n/**\n * Extract request data from API Gateway event (v1 or v2)\n */\nfunction extractRequestData(event: ApiGatewayEvent): {\n body: string | null;\n headers: Record<string, string>;\n method: string;\n path: string;\n queryString: string;\n pathParams: Record<string, string>;\n} {\n if (isApiGatewayV2Event(event)) {\n // API Gateway v2 (HTTP API)\n return {\n body: event.body ?? null,\n headers: event.headers ?? {},\n method: event.requestContext.http.method,\n path: event.rawPath,\n queryString: event.rawQueryString ?? \"\",\n pathParams: event.pathParameters ?? {},\n };\n } else {\n // API Gateway v1 (REST API)\n const v1Event = event as ApiGatewayV1Event;\n // Convert query params to query string\n const queryParams = v1Event.queryStringParameters ?? {};\n const queryString = new URLSearchParams(queryParams).toString();\n\n return {\n body: v1Event.body,\n headers: v1Event.headers ?? {},\n method: v1Event.httpMethod,\n path: v1Event.path,\n queryString,\n pathParams: v1Event.pathParameters ?? {},\n };\n }\n}\n\n/**\n * Match a request path against a route pattern\n * Returns extracted params if matched, undefined if not\n */\nfunction matchRoute(\n requestPath: string,\n route: RegisteredRoute,\n): Record<string, string> | undefined {\n const requestSegments = requestPath.split(\"/\").filter(Boolean);\n const routeSegments = route.segments;\n\n // Check segment count (allow route to have optional params)\n if (requestSegments.length < routeSegments.filter((s) => !s.endsWith(\"?\")).length) {\n return undefined;\n }\n if (requestSegments.length > routeSegments.length) {\n return undefined;\n }\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < routeSegments.length; i++) {\n const routeSegment = routeSegments[i];\n const requestSegment = requestSegments[i];\n\n if (routeSegment.startsWith(\":\")) {\n // Parameter segment\n const paramName = routeSegment.slice(1).replace(\"?\", \"\");\n const isOptional = routeSegment.endsWith(\"?\");\n\n if (requestSegment !== undefined) {\n params[paramName] = requestSegment;\n } else if (!isOptional) {\n return undefined; // Required param missing\n }\n } else {\n // Literal segment - must match exactly\n if (requestSegment !== routeSegment) {\n return undefined;\n }\n }\n }\n\n return params;\n}\n\n/**\n * Find matching route for a request\n */\nfunction findRoute(\n path: string,\n method: string,\n routes: RegisteredRoute[],\n prefix?: string,\n): RouteMatch | undefined {\n // Remove prefix from path if present\n let normalizedPath = path;\n if (prefix && normalizedPath.startsWith(prefix)) {\n normalizedPath = normalizedPath.slice(prefix.length) || \"/\";\n }\n\n // Find first matching route\n for (const route of routes) {\n // Check method first\n if (!route.methods.includes(method.toUpperCase() as HttpMethod)) {\n continue;\n }\n\n // Try to match path\n const params = matchRoute(normalizedPath, route);\n if (params !== undefined) {\n return { route, params };\n }\n }\n\n return undefined;\n}\n\n/**\n * Find route by path only (ignoring method) for 405 responses\n */\nfunction findRouteByPath(\n path: string,\n routes: RegisteredRoute[],\n prefix?: string,\n): RegisteredRoute | undefined {\n let normalizedPath = path;\n if (prefix && normalizedPath.startsWith(prefix)) {\n normalizedPath = normalizedPath.slice(prefix.length) || \"/\";\n }\n\n for (const route of routes) {\n const params = matchRoute(normalizedPath, route);\n if (params !== undefined) {\n return route;\n }\n }\n\n return undefined;\n}\n\n/**\n * Build API Gateway response\n */\nfunction buildResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = {},\n): ApiGatewayResponse {\n return {\n statusCode,\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify(body),\n };\n}\n\n/**\n * Apply CORS headers to response headers object\n */\nfunction applyCorsHeaders(\n responseHeaders: Record<string, string>,\n corsHeaders: CorsHeaders,\n): void {\n for (const [key, value] of Object.entries(corsHeaders)) {\n if (value !== undefined) {\n responseHeaders[key] = value;\n }\n }\n}\n\n/**\n * Create a standalone HTTP server for Lambda\n *\n * Routes multiple FabricHttpService instances without Express:\n * - Parses API Gateway v1 and v2 events\n * - Matches routes by path pattern and HTTP method\n * - Handles CORS preflight and response headers\n * - Returns JSON:API formatted responses\n *\n * @example\n * ```typescript\n * import { FabricHttpServer } from \"@jaypie/fabric/http\";\n * import { lambdaHandler } from \"@jaypie/lambda\";\n *\n * const server = FabricHttpServer({\n * services: [\n * userService,\n * { service: productService, path: \"/products/:id\", methods: [\"GET\", \"PUT\"] },\n * ],\n * prefix: \"/api\",\n * });\n *\n * export const handler = lambdaHandler(server);\n * ```\n */\nexport function FabricHttpServer(\n config: FabricHttpServerConfig,\n): FabricHttpServerType {\n const {\n services,\n authorization: serverAuthorization,\n cors: serverCors = true,\n prefix,\n } = config;\n\n // Build routes from services\n const routes: RegisteredRoute[] = [];\n const registeredServices: FabricHttpService[] = [];\n\n for (const entry of services) {\n let service: FabricHttpService;\n let path: string | undefined;\n let methods: HttpMethod[] | undefined;\n\n if (isRouteConfig(entry)) {\n service = entry.service;\n path = entry.path;\n methods = entry.methods;\n } else if (isFabricHttpService(entry)) {\n service = entry;\n } else {\n throw new Error(\n \"FabricHttpServer: Each service entry must be a FabricHttpService or { service: FabricHttpService }\",\n );\n }\n\n // Determine path from config or service alias\n const routePath = path ?? (service.alias ? `/${service.alias}` : \"/\");\n\n // Parse route segments\n const segments = routePath.split(\"/\").filter(Boolean);\n\n routes.push({\n path: routePath,\n segments,\n methods: methods ?? DEFAULT_HTTP_METHODS,\n service,\n });\n\n registeredServices.push(service);\n }\n\n // Normalize server-level CORS config\n const serverCorsConfig = normalizeCorsConfig(serverCors);\n\n /**\n * Main request handler\n */\n const handler = async (event: ApiGatewayEvent): Promise<ApiGatewayResponse> => {\n // Extract request data from API Gateway event\n const { body, headers, method, path: requestPath, queryString, pathParams } =\n extractRequestData(event);\n\n // Normalize headers to Headers object for consistency\n const headersObj = new Headers(headers);\n const origin = headersObj.get(\"origin\");\n\n // Collect all methods for matched path (for 405 and OPTIONS)\n const pathRoute = findRouteByPath(requestPath, routes, prefix);\n const allowedMethods = pathRoute?.methods ?? [];\n\n // Handle CORS preflight\n if (isPreflightRequest(method, headersObj)) {\n const preflightHeaders = buildPreflightHeaders(\n serverCorsConfig,\n origin,\n headersObj.get(\"access-control-request-method\"),\n headersObj.get(\"access-control-request-headers\"),\n allowedMethods.length > 0 ? allowedMethods : DEFAULT_HTTP_METHODS,\n );\n\n const responseHeaders: Record<string, string> = {};\n applyCorsHeaders(responseHeaders, preflightHeaders);\n\n return {\n statusCode: 204,\n headers: responseHeaders,\n body: \"\",\n };\n }\n\n // Build CORS headers for response\n const corsHeaders = buildCorsHeaders(serverCorsConfig, origin, allowedMethods);\n const responseHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n applyCorsHeaders(responseHeaders, corsHeaders);\n\n // Find matching route\n const match = findRoute(requestPath, method, routes, prefix);\n\n // 404 - No route found\n if (!match && !pathRoute) {\n const errorResponse: ErrorResponse = {\n errors: [\n {\n status: 404,\n title: \"Not Found\",\n detail: `No route matches ${requestPath}`,\n },\n ],\n };\n return buildResponse(404, errorResponse, responseHeaders);\n }\n\n // 405 - Path exists but method not allowed\n if (!match && pathRoute) {\n const errorResponse: ErrorResponse = {\n errors: [\n {\n status: 405,\n title: \"Method Not Allowed\",\n detail: `${method} is not allowed for ${requestPath}`,\n },\n ],\n };\n responseHeaders[\"Allow\"] = pathRoute.methods.join(\", \");\n return buildResponse(405, errorResponse, responseHeaders);\n }\n\n // We have a match\n const { route, params } = match!;\n const service = route.service;\n\n try {\n // Create HTTP context\n const httpContext = createHttpContext({\n body,\n headers,\n method,\n path: requestPath,\n queryString,\n params: { ...pathParams, ...params },\n });\n\n // Transform to service input\n const input = await transformHttpToInput(httpContext, service.http);\n\n // Build service context\n const serviceContext: HttpServiceContext = {\n http: httpContext,\n };\n\n // Call the service\n const result = await service(input, serviceContext);\n\n // Build success response\n const successResponse: DataResponse = {\n data: result,\n };\n\n return buildResponse(200, successResponse, responseHeaders);\n } catch (error) {\n // Handle errors\n const jaypieError = isJaypieError(error);\n const status = jaypieError ? (error as JaypieError).status : 500;\n const title = jaypieError\n ? (error as JaypieError).title\n : \"Internal Server Error\";\n const detail = error instanceof Error ? error.message : String(error);\n\n const errorResponse: ErrorResponse = {\n errors: [\n {\n status,\n title,\n detail: status === 500 ? undefined : detail,\n },\n ],\n };\n\n return buildResponse(status, errorResponse, responseHeaders);\n }\n };\n\n // Attach metadata to handler\n const server = handler as FabricHttpServerType;\n server.services = registeredServices;\n server.prefix = prefix;\n server.routes = routes;\n\n return server;\n}\n\n/**\n * Check if a value is a FabricHttpServer\n */\nexport function isFabricHttpServer(\n value: unknown,\n): value is FabricHttpServerType {\n return (\n typeof value === \"function\" &&\n \"services\" in value &&\n Array.isArray((value as FabricHttpServerType).services) &&\n \"routes\" in value &&\n Array.isArray((value as FabricHttpServerType).routes)\n );\n}\n","import type { Message, MessageLevel, ServiceContext } from \"../types.js\";\n\nimport type {\n HttpContext,\n HttpStreamEvent,\n HttpStreamEventComplete,\n HttpStreamEventData,\n HttpStreamEventError,\n HttpStreamEventMessage,\n HttpStreamEventNoop,\n HttpStreamEventText,\n HttpStreamEventToolCall,\n HttpStreamEventToolResult,\n StreamConfig,\n StreamOption,\n} from \"./types.js\";\nimport { HttpStreamEventType } from \"./types.js\";\n\n// #region Constants\n\n/**\n * Default stream configuration\n */\nexport const DEFAULT_STREAM_CONFIG: StreamConfig = {\n format: \"ndjson\",\n heartbeat: 15000,\n includeTools: true,\n};\n\n// #endregion\n\n// #region Stream Config\n\n/**\n * Normalize stream option to StreamConfig\n * - true → default config (NDJSON format, tools included)\n * - false/undefined → disabled (returns undefined)\n */\nexport function normalizeStreamConfig(\n option: StreamOption | undefined,\n): StreamConfig | undefined {\n if (option === true) {\n return { ...DEFAULT_STREAM_CONFIG };\n }\n return undefined;\n}\n\n/**\n * Check if streaming is enabled\n */\nexport function isStreamingEnabled(option: StreamOption | undefined): boolean {\n return option === true;\n}\n\n// #endregion\n\n// #region Event Formatting\n\n/**\n * Format a stream event as SSE (Server-Sent Events)\n *\n * SSE format:\n * event: <type>\n * data: <json>\n *\n */\nexport function formatSseEvent(event: HttpStreamEvent): string {\n const eventType = event.stream;\n const data = JSON.stringify(event);\n return `event: ${eventType}\\ndata: ${data}\\n\\n`;\n}\n\n/**\n * Format a stream event as NDJSON (Newline-Delimited JSON)\n */\nexport function formatNdjsonEvent(event: HttpStreamEvent): string {\n return JSON.stringify(event) + \"\\n\";\n}\n\n/**\n * Format a stream event based on config\n */\nexport function formatStreamEvent(\n event: HttpStreamEvent,\n config: StreamConfig,\n): string {\n if (config.format === \"ndjson\") {\n return formatNdjsonEvent(event);\n }\n return formatSseEvent(event);\n}\n\n/**\n * Get content-type header for stream format\n */\nexport function getStreamContentType(config: StreamConfig): string {\n if (config.format === \"ndjson\") {\n return \"application/x-ndjson\";\n }\n return \"text/event-stream\";\n}\n\n// #endregion\n\n// #region Event Creators\n\n/**\n * Create a message event (progress update)\n */\nexport function createMessageEvent(\n content: string,\n level?: MessageLevel,\n): HttpStreamEventMessage {\n const event: HttpStreamEventMessage = {\n stream: HttpStreamEventType.Message,\n content,\n };\n if (level !== undefined) {\n event.level = level;\n }\n return event;\n}\n\n/**\n * Create a text event (LLM text chunk)\n */\nexport function createTextEvent(content: string): HttpStreamEventText {\n return {\n stream: HttpStreamEventType.Text,\n content,\n };\n}\n\n/**\n * Create a tool call event\n */\nexport function createToolCallEvent(toolCall: {\n id: string;\n name: string;\n arguments: string;\n}): HttpStreamEventToolCall {\n return {\n stream: HttpStreamEventType.ToolCall,\n toolCall,\n };\n}\n\n/**\n * Create a tool result event\n */\nexport function createToolResultEvent(toolResult: {\n id: string;\n name: string;\n result: unknown;\n}): HttpStreamEventToolResult {\n return {\n stream: HttpStreamEventType.ToolResult,\n toolResult,\n };\n}\n\n/**\n * Create a data event (final response)\n */\nexport function createDataEvent<T>(data: T): HttpStreamEventData<T> {\n return {\n stream: HttpStreamEventType.Data,\n data,\n };\n}\n\n/**\n * Create an error event\n */\nexport function createErrorEvent(error: {\n status: number | string;\n title: string;\n detail?: string;\n}): HttpStreamEventError {\n return {\n stream: HttpStreamEventType.Error,\n error,\n };\n}\n\n/**\n * Create a complete event\n */\nexport function createCompleteEvent(): HttpStreamEventComplete {\n return {\n stream: HttpStreamEventType.Complete,\n };\n}\n\n/**\n * Create a noop event (keep-alive signal)\n */\nexport function createNoopEvent(): HttpStreamEventNoop {\n return {\n stream: HttpStreamEventType.Noop,\n };\n}\n\n// #endregion\n\n// #region Stream Context\n\n/**\n * Callback type for writing stream events\n */\nexport type StreamWriter = (event: HttpStreamEvent) => void | Promise<void>;\n\n/**\n * Extended service context with streaming capabilities\n */\nexport interface HttpStreamContext<TAuth = unknown> extends ServiceContext {\n /** Authorization result (returned from authorization function) */\n auth?: TAuth;\n /** HTTP context for advanced use cases */\n http?: HttpContext;\n /** Stream text content to client */\n streamText: (content: string) => void;\n /** Stream a structured event to client */\n streamEvent: (event: HttpStreamEvent) => void;\n}\n\n/**\n * Create a stream context with streaming capabilities\n *\n * @param writer - Function to write stream events\n * @param baseContext - Base service context to extend\n * @returns Extended context with stream methods\n */\nexport function createStreamContext<TAuth = unknown>(\n writer: StreamWriter,\n baseContext?: Partial<HttpStreamContext<TAuth>>,\n): HttpStreamContext<TAuth> {\n const streamEvent = (event: HttpStreamEvent): void => {\n try {\n writer(event);\n } catch {\n // Swallow errors in stream writer (connection may be closed)\n }\n };\n\n const streamText = (content: string): void => {\n streamEvent(createTextEvent(content));\n };\n\n // Create sendMessage that streams as message events\n const sendMessage = (message: Message): void => {\n try {\n const event = createMessageEvent(message.content, message.level);\n writer(event);\n } catch {\n // Swallow errors\n }\n };\n\n return {\n ...baseContext,\n sendMessage,\n streamEvent,\n streamText,\n };\n}\n\n// #endregion\n\n// #region Async Generator Utilities\n\n/**\n * Check if a value is an async iterable\n */\nexport function isAsyncIterable<T>(value: unknown): value is AsyncIterable<T> {\n return (\n value !== null && typeof value === \"object\" && Symbol.asyncIterator in value\n );\n}\n\n/**\n * Collect all events from an async iterable into an array\n * Useful for testing\n */\nexport async function collectStreamEvents(\n stream: AsyncIterable<HttpStreamEvent>,\n): Promise<HttpStreamEvent[]> {\n const events: HttpStreamEvent[] = [];\n for await (const event of stream) {\n events.push(event);\n }\n return events;\n}\n\n/**\n * Create an async generator that yields events and returns final data\n */\nexport async function* wrapServiceForStreaming<TOutput>(\n serviceResult: TOutput | AsyncIterable<HttpStreamEvent>,\n): AsyncIterable<HttpStreamEvent> {\n // If result is already an async iterable, pass through\n if (isAsyncIterable<HttpStreamEvent>(serviceResult)) {\n yield* serviceResult;\n return;\n }\n\n // Otherwise, wrap single result as data event\n yield createDataEvent(serviceResult);\n yield createCompleteEvent();\n}\n\n// #endregion\n\n// #region LLM Stream Integration\n\n/**\n * LLM stream chunk types (matches @jaypie/llm LlmStreamChunkType)\n * Defined locally to avoid hard dependency on @jaypie/llm\n */\nconst LLM_CHUNK_TYPES = {\n Done: \"done\",\n Error: \"error\",\n Text: \"text\",\n ToolCall: \"tool_call\",\n ToolResult: \"tool_result\",\n} as const;\n\n/**\n * LLM stream chunk interface (compatible with @jaypie/llm LlmStreamChunk)\n * Defined locally to avoid hard dependency on @jaypie/llm\n */\nexport interface LlmStreamChunk {\n type: string;\n content?: string;\n error?: {\n detail?: string;\n status: number | string;\n title: string;\n };\n toolCall?: {\n arguments: string;\n id: string;\n name: string;\n };\n toolResult?: {\n id: string;\n name: string;\n result: unknown;\n };\n usage?: unknown;\n}\n\n/**\n * Options for piping LLM streams\n */\nexport interface PipeLlmStreamOptions {\n /** Include tool call and tool result events (default: false) */\n includeTools?: boolean;\n}\n\n/**\n * Convert an LLM stream chunk to HTTP stream event\n * Returns undefined for chunks that should be filtered out\n */\nexport function llmChunkToHttpEvent(\n chunk: LlmStreamChunk,\n options?: PipeLlmStreamOptions,\n): HttpStreamEvent | undefined {\n const { includeTools = false } = options ?? {};\n\n switch (chunk.type) {\n case LLM_CHUNK_TYPES.Text:\n if (chunk.content !== undefined) {\n return createTextEvent(chunk.content);\n }\n return undefined;\n\n case LLM_CHUNK_TYPES.ToolCall:\n if (!includeTools) return undefined;\n if (chunk.toolCall) {\n return createToolCallEvent(chunk.toolCall);\n }\n return undefined;\n\n case LLM_CHUNK_TYPES.ToolResult:\n if (!includeTools) return undefined;\n if (chunk.toolResult) {\n return createToolResultEvent(chunk.toolResult);\n }\n return undefined;\n\n case LLM_CHUNK_TYPES.Error:\n if (chunk.error) {\n return createErrorEvent(chunk.error);\n }\n return undefined;\n\n case LLM_CHUNK_TYPES.Done:\n return createCompleteEvent();\n\n default:\n // Unknown chunk type - skip\n return undefined;\n }\n}\n\n/**\n * Pipe an LLM stream (from @jaypie/llm Llm.stream()) to HTTP stream events\n *\n * @example\n * ```typescript\n * import Llm from \"@jaypie/llm\";\n * import { pipeLlmStream } from \"@jaypie/fabric/http\";\n *\n * const llmStream = Llm.stream(\"Tell me a story\");\n * for await (const event of pipeLlmStream(llmStream)) {\n * yield event; // or writer(event)\n * }\n * ```\n */\nexport async function* pipeLlmStream(\n llmStream: AsyncIterable<LlmStreamChunk>,\n options?: PipeLlmStreamOptions,\n): AsyncIterable<HttpStreamEvent> {\n for await (const chunk of llmStream) {\n const event = llmChunkToHttpEvent(chunk, options);\n if (event !== undefined) {\n yield event;\n }\n }\n}\n\n/**\n * Pipe an LLM stream to a stream writer function\n *\n * @example\n * ```typescript\n * import Llm from \"@jaypie/llm\";\n * import { pipeLlmStreamToWriter } from \"@jaypie/fabric/http\";\n *\n * const llmStream = Llm.stream(\"Tell me a story\");\n * await pipeLlmStreamToWriter(llmStream, (event) => {\n * res.write(formatSseEvent(event));\n * });\n * ```\n */\nexport async function pipeLlmStreamToWriter(\n llmStream: AsyncIterable<LlmStreamChunk>,\n writer: StreamWriter,\n options?: PipeLlmStreamOptions,\n): Promise<void> {\n for await (const event of pipeLlmStream(llmStream, options)) {\n await writer(event);\n }\n}\n\n// #endregion\n"],"names":["BadRequestError","UnauthorizedError","HttpStreamEventType","isJaypieError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../../src/constants.ts","../../../../../src/resolve-date.ts","../../../../../src/resolve.ts","../../../../../src/service.ts","../../../../../src/http/authorization.ts","../../../../../src/http/httpTransform.ts","../../../../../src/http/fabricHttp.ts","../../../../../src/http/cors.ts","../../../../../src/http/types.ts","../../../../../src/http/FabricHttpServer.ts","../../../../../src/http/stream.ts"],"sourcesContent":["/**\n * Meta-modeling Constants\n */\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Root organizational unit */\nexport const APEX = \"@\";\n\n/** Fabric version - used to identify pre-instantiated Services */\nexport const FABRIC_VERSION = \"0.1.0\";\n\n/** Composite key separator */\nexport const SEPARATOR = \"#\";\n\n/** System-level models that describe other models */\nexport const SYSTEM_MODELS = [\"context\", \"field\", \"model\"] as const;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type SystemModel = (typeof SYSTEM_MODELS)[number];\n","/**\n * Date Type Conversion for @jaypie/fabric\n *\n * Adds Date as a supported type in the fabric type system.\n * Follows the same conversion patterns as String, Number, Boolean.\n */\n\nimport { BadRequestError } from \"@jaypie/errors\";\n\n/**\n * Check if a value is a valid Date\n */\nexport function isValidDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime());\n}\n\n/**\n * Convert a value to a Date\n *\n * Supported inputs:\n * - Date: returned as-is (validated)\n * - Number: treated as Unix timestamp (milliseconds)\n * - String: parsed via Date constructor (ISO 8601, etc.)\n * - Object with value property: unwrapped and converted\n *\n * @throws BadRequestError if value cannot be converted to valid Date\n */\nexport function fabricDate(value: unknown): Date {\n // Already a Date\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) {\n throw new BadRequestError(\"Invalid Date value\");\n }\n return value;\n }\n\n // Null/undefined\n if (value === null || value === undefined) {\n throw new BadRequestError(\"Cannot convert null or undefined to Date\");\n }\n\n // Object with value property (fabric pattern)\n if (typeof value === \"object\" && value !== null && \"value\" in value) {\n return fabricDate((value as { value: unknown }).value);\n }\n\n // Number (timestamp in milliseconds)\n if (typeof value === \"number\") {\n if (Number.isNaN(value)) {\n throw new BadRequestError(\"Cannot convert NaN to Date\");\n }\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new BadRequestError(`Cannot convert ${value} to Date`);\n }\n return date;\n }\n\n // String (ISO 8601 or parseable format)\n if (typeof value === \"string\") {\n // Empty string is invalid\n if (value.trim() === \"\") {\n throw new BadRequestError(\"Cannot convert empty string to Date\");\n }\n\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new BadRequestError(`Cannot convert \"${value}\" to Date`);\n }\n return date;\n }\n\n // Boolean cannot be converted to Date\n if (typeof value === \"boolean\") {\n throw new BadRequestError(\"Cannot convert boolean to Date\");\n }\n\n // Arrays - attempt single element extraction\n if (Array.isArray(value)) {\n if (value.length === 1) {\n return fabricDate(value[0]);\n }\n throw new BadRequestError(\n `Cannot convert array with ${value.length} elements to Date`,\n );\n }\n\n throw new BadRequestError(`Cannot convert ${typeof value} to Date`);\n}\n\n/**\n * Resolve a value from a Date to another type\n *\n * @param value - Date to convert\n * @param targetType - Target type (String, Number)\n */\nexport function resolveFromDate(\n value: Date,\n targetType: typeof Number | typeof String,\n): number | string {\n if (!isValidDate(value)) {\n throw new BadRequestError(\"Invalid Date value\");\n }\n\n if (targetType === String) {\n return value.toISOString();\n }\n\n if (targetType === Number) {\n return value.getTime();\n }\n\n throw new BadRequestError(`Cannot convert Date to ${targetType}`);\n}\n\n/**\n * Date type constant for use in fabricService input definitions\n *\n * Usage:\n * ```typescript\n * const handler = fabricService({\n * input: {\n * startDate: { type: Date },\n * endDate: { type: Date, default: undefined }\n * }\n * });\n * ```\n */\nexport const DateType = Date;\n\n/**\n * Type guard for Date type in schema definitions\n */\nexport function isDateType(type: unknown): type is typeof Date {\n return type === Date;\n}\n","// Fabric functions for @jaypie/fabric\n\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport { fabricDate, isDateType } from \"./resolve-date.js\";\nimport type { ConversionType, TypedArrayType } from \"./types.js\";\n\n/**\n * Try to parse a string as JSON if it looks like JSON\n * Returns the parsed value or the original string if not JSON\n */\nfunction tryParseJson(value: string): unknown {\n const trimmed = value.trim();\n if (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n ) {\n try {\n return JSON.parse(trimmed);\n } catch {\n // Not valid JSON, return original\n return value;\n }\n }\n return value;\n}\n\n/**\n * Unwrap arrays and objects to get to the scalar value\n * - Single-element arrays unwrap to their element\n * - Objects with value property unwrap to that value\n * - Recursively unwraps nested structures\n */\nfunction unwrapToScalar(value: unknown): unknown {\n if (value === undefined || value === null) {\n return value;\n }\n\n // Unwrap single-element arrays\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return undefined;\n }\n if (value.length === 1) {\n return unwrapToScalar(value[0]);\n }\n throw new BadRequestError(\"Cannot convert multi-value array to scalar\");\n }\n\n // Unwrap objects with value property\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n return unwrapToScalar(obj.value);\n }\n throw new BadRequestError(\"Object must have a value attribute\");\n }\n\n return value;\n}\n\n/**\n * Prepare a value for scalar conversion by parsing JSON strings and unwrapping\n */\nfunction prepareForScalarConversion(value: unknown): unknown {\n if (value === undefined || value === null) {\n return value;\n }\n\n // Try to parse JSON strings\n if (typeof value === \"string\") {\n const parsed = tryParseJson(value);\n if (parsed !== value) {\n // Successfully parsed, unwrap the result\n return unwrapToScalar(parsed);\n }\n return value;\n }\n\n // Unwrap arrays and objects\n if (Array.isArray(value) || typeof value === \"object\") {\n return unwrapToScalar(value);\n }\n\n return value;\n}\n\n/**\n * Convert a value to a boolean\n * - Arrays, objects, and JSON strings are unwrapped first\n * - String \"true\" becomes true\n * - String \"false\" becomes false\n * - Strings that parse to numbers: positive = true, zero or negative = false\n * - Numbers: positive = true, zero or negative = false\n * - Boolean passes through\n */\nexport function fabricBoolean(value: unknown): boolean | undefined {\n // Prepare value by parsing JSON and unwrapping arrays/objects\n const prepared = prepareForScalarConversion(value);\n\n if (prepared === undefined || prepared === null) {\n return undefined;\n }\n\n if (typeof prepared === \"boolean\") {\n return prepared;\n }\n\n if (typeof prepared === \"string\") {\n if (prepared === \"\") {\n return undefined;\n }\n const lower = prepared.toLowerCase();\n if (lower === \"true\") {\n return true;\n }\n if (lower === \"false\") {\n return false;\n }\n // Try to parse as number\n const num = parseFloat(prepared);\n if (isNaN(num)) {\n throw new BadRequestError(`Cannot convert \"${prepared}\" to Boolean`);\n }\n return num > 0;\n }\n\n if (typeof prepared === \"number\") {\n if (isNaN(prepared)) {\n throw new BadRequestError(\"Cannot convert NaN to Boolean\");\n }\n return prepared > 0;\n }\n\n throw new BadRequestError(`Cannot convert ${typeof prepared} to Boolean`);\n}\n\n/**\n * Convert a value to a number\n * - Arrays, objects, and JSON strings are unwrapped first\n * - String \"\" becomes undefined\n * - String \"true\" becomes 1\n * - String \"false\" becomes 0\n * - Strings that parse to numbers use those values\n * - Strings that parse to NaN throw BadRequestError\n * - Boolean true becomes 1, false becomes 0\n * - Number passes through\n */\nexport function fabricNumber(value: unknown): number | undefined {\n // Prepare value by parsing JSON and unwrapping arrays/objects\n const prepared = prepareForScalarConversion(value);\n\n if (prepared === undefined || prepared === null) {\n return undefined;\n }\n\n if (typeof prepared === \"number\") {\n if (isNaN(prepared)) {\n throw new BadRequestError(\"Cannot convert NaN to Number\");\n }\n return prepared;\n }\n\n if (typeof prepared === \"boolean\") {\n return prepared ? 1 : 0;\n }\n\n if (typeof prepared === \"string\") {\n if (prepared === \"\") {\n return undefined;\n }\n const lower = prepared.toLowerCase();\n if (lower === \"true\") {\n return 1;\n }\n if (lower === \"false\") {\n return 0;\n }\n const num = parseFloat(prepared);\n if (isNaN(num)) {\n throw new BadRequestError(`Cannot convert \"${prepared}\" to Number`);\n }\n return num;\n }\n\n throw new BadRequestError(`Cannot convert ${typeof prepared} to Number`);\n}\n\n/**\n * Convert a value to a string\n * - Arrays, objects, and JSON strings are unwrapped first\n * - String \"\" becomes undefined\n * - Boolean true becomes \"true\", false becomes \"false\"\n * - Number converts to string representation\n * - String passes through\n */\nexport function fabricString(value: unknown): string | undefined {\n // Prepare value by parsing JSON and unwrapping arrays/objects\n const prepared = prepareForScalarConversion(value);\n\n if (prepared === undefined || prepared === null) {\n return undefined;\n }\n\n if (typeof prepared === \"string\") {\n if (prepared === \"\") {\n return undefined;\n }\n return prepared;\n }\n\n if (typeof prepared === \"boolean\") {\n return prepared ? \"true\" : \"false\";\n }\n\n if (typeof prepared === \"number\") {\n if (isNaN(prepared)) {\n throw new BadRequestError(\"Cannot convert NaN to String\");\n }\n return String(prepared);\n }\n\n throw new BadRequestError(`Cannot convert ${typeof prepared} to String`);\n}\n\n/**\n * Convert a value to an array\n * - Non-arrays become arrays containing that value\n * - Arrays of a single value become that value (unwrapped)\n * - Multi-value arrays throw BadRequestError\n * - undefined/null become undefined\n */\nexport function fabricArray(value: unknown): unknown[] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n // Arrays pass through (single-element unwrapping happens when converting FROM array)\n return value;\n }\n\n // Non-arrays become single-element arrays\n return [value];\n}\n\n/**\n * Resolve a value from an array to a scalar\n * - Single-element arrays become that element\n * - Multi-element arrays throw BadRequestError\n * - Non-arrays pass through\n */\nexport function resolveFromArray(value: unknown): unknown {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return undefined;\n }\n if (value.length === 1) {\n return value[0];\n }\n throw new BadRequestError(\"Cannot convert multi-value array to scalar\");\n }\n\n return value;\n}\n\n/**\n * Convert a value to an object with a value property\n * - Scalars become { value: scalar }\n * - Arrays become { value: array }\n * - Objects with a value attribute pass through\n * - Objects without a value attribute throw BadRequestError\n * - undefined/null become undefined\n */\nexport function fabricObject(value: unknown): { value: unknown } | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n // Check if already an object (but not an array)\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n return obj as { value: unknown };\n }\n throw new BadRequestError(\"Object must have a value attribute\");\n }\n\n // Scalars and arrays become { value: ... }\n return { value };\n}\n\n/**\n * Resolve a value from an object to its value property\n * - Objects with a value property return that value\n * - Objects without a value throw BadRequestError\n * - Scalars pass through\n */\nexport function resolveFromObject(value: unknown): unknown {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n return obj.value;\n }\n throw new BadRequestError(\"Object must have a value attribute\");\n }\n\n return value;\n}\n\n/**\n * Check if a type is a typed array (e.g., [String], [Number], [], etc.)\n */\nfunction isTypedArrayType(type: ConversionType): type is TypedArrayType {\n return Array.isArray(type);\n}\n\n/**\n * Split a string on comma or tab delimiters for typed array conversion.\n * Only splits if the string contains commas or tabs.\n * Returns the original value if not a string or no delimiters found.\n */\nfunction splitStringForArray(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n\n // Check for comma or tab delimiters\n if (value.includes(\",\")) {\n return value.split(\",\").map((s) => s.trim());\n }\n if (value.includes(\"\\t\")) {\n return value.split(\"\\t\").map((s) => s.trim());\n }\n\n return value;\n}\n\n/**\n * Try to parse a string as JSON for array context.\n * Returns parsed value if it's an array, otherwise returns original.\n */\nfunction tryParseJsonArray(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n\n const trimmed = value.trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Not valid JSON, fall through\n }\n }\n\n return value;\n}\n\n/**\n * Get the element type from a typed array type\n * Returns undefined for untyped arrays ([])\n */\nfunction getArrayElementType(\n type: TypedArrayType,\n): \"boolean\" | \"number\" | \"object\" | \"string\" | undefined {\n if (type.length === 0) {\n return undefined; // Untyped array\n }\n\n const elementType = type[0];\n\n // Handle constructor types\n if (elementType === Boolean) return \"boolean\";\n if (elementType === Number) return \"number\";\n if (elementType === String) return \"string\";\n if (elementType === Object) return \"object\";\n\n // Handle string types\n if (elementType === \"boolean\") return \"boolean\";\n if (elementType === \"number\") return \"number\";\n if (elementType === \"string\") return \"string\";\n if (elementType === \"object\") return \"object\";\n\n // Handle shorthand types\n if (elementType === \"\") return \"string\"; // \"\" shorthand for String\n if (\n typeof elementType === \"object\" &&\n elementType !== null &&\n Object.keys(elementType).length === 0\n ) {\n return \"object\"; // {} shorthand for Object\n }\n\n throw new BadRequestError(\n `Unknown array element type: ${String(elementType)}`,\n );\n}\n\n/**\n * Convert a value to a typed array\n * - Tries to parse JSON arrays first\n * - Splits strings on comma/tab if present\n * - Wraps non-arrays in an array\n * - Converts each element to the specified element type\n */\nfunction fabricTypedArray(\n value: unknown,\n elementType: \"boolean\" | \"number\" | \"object\" | \"string\" | undefined,\n): unknown[] | undefined {\n // Try to parse JSON array first\n let processed = tryParseJsonArray(value);\n\n // If still a string, try to split on comma/tab\n processed = splitStringForArray(processed);\n\n // Convert to array (wraps non-arrays)\n const array = fabricArray(processed);\n\n if (array === undefined) {\n return undefined;\n }\n\n // If no element type specified, return as-is\n if (elementType === undefined) {\n return array;\n }\n\n // Convert each element to the element type\n return array.map((element, index) => {\n try {\n switch (elementType) {\n case \"boolean\":\n return fabricBoolean(element);\n case \"number\":\n return fabricNumber(element);\n case \"object\":\n return fabricObject(element);\n case \"string\":\n return fabricString(element);\n default:\n throw new BadRequestError(`Unknown element type: ${elementType}`);\n }\n } catch (error) {\n if (error instanceof BadRequestError) {\n throw new BadRequestError(\n `Cannot convert array element at index ${index}: ${error.message}`,\n );\n }\n throw error;\n }\n });\n}\n\n/**\n * Fabric a value to the specified type\n */\nexport function fabric(value: unknown, type: ConversionType): unknown {\n // Check for Date type first\n if (isDateType(type)) {\n return fabricDate(value);\n }\n\n // Check for typed array types\n if (isTypedArrayType(type)) {\n const elementType = getArrayElementType(type);\n return fabricTypedArray(value, elementType);\n }\n\n const normalizedType = normalizeType(type);\n\n switch (normalizedType) {\n case \"array\":\n return fabricArray(value);\n case \"boolean\":\n return fabricBoolean(value);\n case \"number\":\n return fabricNumber(value);\n case \"object\":\n return fabricObject(value);\n case \"string\":\n return fabricString(value);\n default:\n throw new BadRequestError(`Unknown type: ${String(type)}`);\n }\n}\n\n/**\n * Normalize type to string representation\n */\nfunction normalizeType(\n type: ConversionType,\n): \"array\" | \"boolean\" | \"number\" | \"object\" | \"string\" {\n if (type === Array || type === \"array\") {\n return \"array\";\n }\n if (type === Boolean || type === \"boolean\") {\n return \"boolean\";\n }\n if (type === Number || type === \"number\") {\n return \"number\";\n }\n if (type === Object || type === \"object\") {\n return \"object\";\n }\n if (type === String || type === \"string\") {\n return \"string\";\n }\n throw new BadRequestError(`Unknown type: ${String(type)}`);\n}\n","// Service for @jaypie/fabric\n\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport { FABRIC_VERSION } from \"./constants.js\";\nimport { fabric } from \"./resolve.js\";\nimport type {\n ConversionType,\n InputFieldDefinition,\n Service,\n ServiceConfig,\n ServiceContext,\n ValidateFunction,\n} from \"./types.js\";\n\n/**\n * Check if a single-element array is a typed array type constructor.\n */\nfunction isTypedArrayConstructor(element: unknown): boolean {\n return (\n element === Boolean ||\n element === Number ||\n element === String ||\n element === Object ||\n element === \"boolean\" ||\n element === \"number\" ||\n element === \"string\" ||\n element === \"object\" ||\n element === \"\" ||\n (typeof element === \"object\" &&\n element !== null &&\n !(element instanceof RegExp) &&\n Object.keys(element as Record<string, unknown>).length === 0)\n );\n}\n\n/**\n * Check if a type is a validated string type (array of string literals and/or RegExp).\n * Distinguishes from typed arrays like [String], [Number], etc.\n */\nfunction isValidatedStringType(\n type: ConversionType,\n): type is Array<string | RegExp> {\n if (!Array.isArray(type)) {\n return false;\n }\n\n // Empty array is untyped array, not validated string\n if (type.length === 0) {\n return false;\n }\n\n // Single-element arrays with type constructors are typed arrays\n if (type.length === 1 && isTypedArrayConstructor(type[0])) {\n return false;\n }\n\n // Check that all elements are strings or RegExp\n return type.every(\n (item) => typeof item === \"string\" || item instanceof RegExp,\n );\n}\n\n/**\n * Check if a type is a validated number type (array of number literals).\n * Distinguishes from typed arrays like [Number], etc.\n */\nfunction isValidatedNumberType(type: ConversionType): type is Array<number> {\n if (!Array.isArray(type)) {\n return false;\n }\n\n // Empty array is untyped array, not validated number\n if (type.length === 0) {\n return false;\n }\n\n // Single-element arrays with type constructors are typed arrays\n if (type.length === 1 && isTypedArrayConstructor(type[0])) {\n return false;\n }\n\n // Check that all elements are numbers\n return type.every((item) => typeof item === \"number\");\n}\n\n/**\n * Parse input string as JSON if it's a string\n */\nfunction parseInput(input: unknown): Record<string, unknown> {\n if (input === undefined || input === null) {\n return {};\n }\n\n if (typeof input === \"string\") {\n if (input === \"\") {\n return {};\n }\n try {\n const parsed = JSON.parse(input);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n throw new BadRequestError(\"Input must be an object\");\n }\n return parsed as Record<string, unknown>;\n } catch (error) {\n if (error instanceof BadRequestError) {\n throw error;\n }\n throw new BadRequestError(\"Invalid JSON input\");\n }\n }\n\n if (typeof input === \"object\" && !Array.isArray(input)) {\n return input as Record<string, unknown>;\n }\n\n throw new BadRequestError(\"Input must be an object or JSON string\");\n}\n\n/**\n * Run validation on a value (supports async validators)\n */\nasync function runValidation(\n value: unknown,\n validate: ValidateFunction | RegExp | Array<unknown>,\n fieldName: string,\n): Promise<void> {\n if (typeof validate === \"function\") {\n const result = await validate(value);\n if (result === false) {\n throw new BadRequestError(`Validation failed for field \"${fieldName}\"`);\n }\n } else if (validate instanceof RegExp) {\n if (typeof value !== \"string\" || !validate.test(value)) {\n throw new BadRequestError(`Validation failed for field \"${fieldName}\"`);\n }\n } else if (Array.isArray(validate)) {\n // Check if value matches any item in the array\n for (const item of validate) {\n if (item instanceof RegExp) {\n if (typeof value === \"string\" && item.test(value)) {\n return; // Match found\n }\n } else if (typeof item === \"function\") {\n try {\n const result = await (item as ValidateFunction)(value);\n if (result !== false) {\n return; // Match found\n }\n } catch {\n // Continue to next item\n }\n } else if (value === item) {\n return; // Scalar match found\n }\n }\n throw new BadRequestError(`Validation failed for field \"${fieldName}\"`);\n }\n}\n\n/**\n * Check if a field is required\n * A field is required unless it has a default OR required is explicitly false\n */\nfunction isFieldRequired(definition: InputFieldDefinition): boolean {\n if (definition.required === false) {\n return false;\n }\n if (definition.default !== undefined) {\n return false;\n }\n return true;\n}\n\n/**\n * Process a single field through conversion and validation\n */\nasync function processField(\n fieldName: string,\n value: unknown,\n definition: InputFieldDefinition,\n): Promise<unknown> {\n // Apply default if value is undefined\n let processedValue = value;\n if (processedValue === undefined && definition.default !== undefined) {\n processedValue = definition.default;\n }\n\n // Determine actual type and validation\n let actualType: ConversionType = definition.type;\n let validation = definition.validate;\n\n // Handle bare RegExp shorthand: /regex/\n if (definition.type instanceof RegExp) {\n actualType = String;\n validation = definition.type; // The RegExp becomes the validation\n }\n // Handle validated string shorthand: [\"value1\", \"value2\"] or [/regex/]\n else if (isValidatedStringType(definition.type)) {\n actualType = String;\n validation = definition.type; // The array becomes the validation\n }\n // Handle validated number shorthand: [1, 2, 3]\n else if (isValidatedNumberType(definition.type)) {\n actualType = Number;\n validation = definition.type; // The array becomes the validation\n }\n\n // Fabric to target type\n const convertedValue = fabric(processedValue, actualType);\n\n // Check if required field is missing\n if (convertedValue === undefined && isFieldRequired(definition)) {\n throw new BadRequestError(`Missing required field \"${fieldName}\"`);\n }\n\n // Run validation if provided\n if (validation !== undefined && convertedValue !== undefined) {\n await runValidation(convertedValue, validation, fieldName);\n }\n\n return convertedValue;\n}\n\n/**\n * Type guard to check if a value is a pre-instantiated Service\n * A Service is a function with the `$fabric` property set by fabricService\n */\nexport function isService<TInput extends Record<string, unknown>, TOutput>(\n value: unknown,\n): value is Service<TInput, TOutput> {\n return typeof value === \"function\" && \"$fabric\" in value;\n}\n\n/**\n * Fabric a service function\n *\n * Service builds a function that initiates a \"controller\" step that:\n * - Parses the input if it is a string to object\n * - Fabrics each input field to its type\n * - Calls the validation function or regular expression or checks the array\n * - Calls the service function and returns the response\n *\n * The returned function has config properties for introspection.\n */\nexport function fabricService<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n>(config: ServiceConfig<TInput, TOutput>): Service<TInput, TOutput> {\n const { input: inputDefinitions, service } = config;\n\n const handler = async (\n rawInput?: Partial<TInput> | string,\n context?: ServiceContext,\n ): Promise<TOutput> => {\n // Parse input (handles string JSON)\n const parsedInput = parseInput(rawInput);\n\n // If no input definitions, pass through to service or return parsed input\n if (!inputDefinitions) {\n if (service) {\n return service(parsedInput as TInput, context);\n }\n return parsedInput as TOutput;\n }\n\n // Process all fields in parallel\n const entries = Object.entries(inputDefinitions);\n const processedValues = await Promise.all(\n entries.map(([fieldName, definition]) =>\n processField(fieldName, parsedInput[fieldName], definition),\n ),\n );\n\n // Build processed input object\n const processedInput: Record<string, unknown> = {};\n entries.forEach(([fieldName], index) => {\n processedInput[fieldName] = processedValues[index];\n });\n\n // Return processed input if no service, otherwise call service\n if (service) {\n return service(processedInput as TInput, context);\n }\n return processedInput as TOutput;\n };\n\n // Attach config properties directly to handler for flat access\n const typedHandler = handler as Service<TInput, TOutput>;\n typedHandler.$fabric = FABRIC_VERSION;\n if (config.alias !== undefined) typedHandler.alias = config.alias;\n if (config.description !== undefined)\n typedHandler.description = config.description;\n if (config.input !== undefined) typedHandler.input = config.input;\n if (config.service !== undefined) typedHandler.service = config.service;\n\n return typedHandler;\n}\n","import { UnauthorizedError } from \"@jaypie/errors\";\n\nimport type { AuthorizationConfig, AuthorizationFunction } from \"./types.js\";\n\n/**\n * Extract token from Authorization header\n * Removes \"Bearer \" prefix (case insensitive) and strips whitespace\n *\n * Examples:\n * - \"Bearer eyJhbGc...\" → \"eyJhbGc...\"\n * - \"bearer eyJhbGc...\" → \"eyJhbGc...\"\n * - \"BEARER eyJhbGc...\" → \"eyJhbGc...\"\n * - \"eyJhbGc...\" → \"eyJhbGc...\"\n * - \" eyJhbGc... \" → \"eyJhbGc...\"\n */\nexport function extractToken(authHeader: string | null | undefined): string {\n if (!authHeader) {\n return \"\";\n }\n\n let token = authHeader.trim();\n\n // Remove \"Bearer \" prefix (case insensitive)\n const bearerRegex = /^bearer\\s+/i;\n if (bearerRegex.test(token)) {\n token = token.replace(bearerRegex, \"\");\n }\n\n return token.trim();\n}\n\n/**\n * Get authorization header from Headers object\n */\nexport function getAuthHeader(headers: Headers): string | null {\n return headers.get(\"authorization\");\n}\n\n/**\n * Validate authorization and return auth context\n *\n * @param headers - Request headers\n * @param config - Authorization configuration (function or false)\n * @returns Auth context from the authorization function, or undefined if public\n * @throws UnauthorizedError if authorization fails\n */\nexport async function validateAuthorization<TAuth = unknown>(\n headers: Headers,\n config: AuthorizationConfig<TAuth>,\n): Promise<TAuth | undefined> {\n // Public endpoint - no authorization required\n if (config === false) {\n return undefined;\n }\n\n const authHeader = getAuthHeader(headers);\n const token = extractToken(authHeader);\n\n // If authorization is required but no token provided\n if (!token) {\n throw new UnauthorizedError(\"Authorization header required\");\n }\n\n // Call the authorization function\n const authFunction = config as AuthorizationFunction<TAuth>;\n return authFunction(token);\n}\n\n/**\n * Check if authorization is required\n */\nexport function isAuthorizationRequired(\n config: AuthorizationConfig<unknown>,\n): boolean {\n return config !== false;\n}\n","import type { HttpContext, HttpTransformFunction } from \"./types.js\";\n\n/**\n * Default HTTP transformation function\n * Merges query parameters with body (body takes precedence)\n */\nexport const defaultHttpTransform: HttpTransformFunction = ({\n body,\n query,\n}) => {\n const queryObject = Object.fromEntries(query.entries());\n const bodyObject = typeof body === \"object\" && body !== null ? body : {};\n\n return {\n ...queryObject,\n ...bodyObject,\n } as Record<string, unknown>;\n};\n\n/**\n * Parse query string into URLSearchParams\n */\nexport function parseQueryString(queryString: string): URLSearchParams {\n // Remove leading ? if present\n const normalized = queryString.startsWith(\"?\")\n ? queryString.slice(1)\n : queryString;\n return new URLSearchParams(normalized);\n}\n\n/**\n * Parse path parameters from a URL path using a route pattern\n * @param path - The actual URL path (e.g., \"/users/123\")\n * @param pattern - The route pattern (e.g., \"/users/:id\")\n * @returns Object with extracted parameters\n */\nexport function parsePathParams(\n path: string,\n pattern: string,\n): Record<string, string> {\n const params: Record<string, string> = {};\n\n const pathParts = path.split(\"/\").filter(Boolean);\n const patternParts = pattern.split(\"/\").filter(Boolean);\n\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i];\n const pathPart = pathParts[i];\n\n if (patternPart.startsWith(\":\")) {\n // Extract parameter name (remove : prefix and ? suffix for optional params)\n const paramName = patternPart.slice(1).replace(\"?\", \"\");\n if (pathPart !== undefined) {\n params[paramName] = pathPart;\n }\n }\n }\n\n return params;\n}\n\n/**\n * Parse request body from string or return as-is if already parsed\n */\nexport function parseBody(body: unknown): unknown {\n if (typeof body === \"string\") {\n try {\n return JSON.parse(body);\n } catch {\n // Return as-is if not valid JSON\n return body;\n }\n }\n return body;\n}\n\n/**\n * Create HTTP context from raw request data\n */\nexport function createHttpContext(options: {\n body?: unknown;\n headers?: Headers | Record<string, string>;\n method?: string;\n path?: string;\n queryString?: string;\n params?: Record<string, string>;\n}): HttpContext {\n const {\n body = {},\n headers = {},\n method = \"GET\",\n path = \"/\",\n queryString = \"\",\n params = {},\n } = options;\n\n // Normalize headers to Headers object\n const normalizedHeaders =\n headers instanceof Headers\n ? headers\n : new Headers(headers as Record<string, string>);\n\n return {\n body: parseBody(body),\n headers: normalizedHeaders,\n method: method.toUpperCase(),\n path,\n query: parseQueryString(queryString),\n params,\n };\n}\n\n/**\n * Apply HTTP transformation to get service input\n */\nexport async function transformHttpToInput<TInput = Record<string, unknown>>(\n context: HttpContext,\n transform: HttpTransformFunction<TInput> = defaultHttpTransform as HttpTransformFunction<TInput>,\n): Promise<TInput> {\n return transform(context);\n}\n","import { fabricService } from \"../service.js\";\nimport type { Service, ServiceConfig, ServiceContext } from \"../types.js\";\n\nimport { validateAuthorization } from \"./authorization.js\";\nimport { defaultHttpTransform } from \"./httpTransform.js\";\nimport type {\n FabricHttpConfig,\n FabricHttpService,\n HttpContext,\n HttpTransformFunction,\n} from \"./types.js\";\n\n/**\n * Check if a value is a fabricService (has $fabric property)\n */\nfunction isFabricService<TInput extends Record<string, unknown>, TOutput>(\n value: unknown,\n): value is Service<TInput, TOutput> {\n return (\n typeof value === \"function\" &&\n \"$fabric\" in value &&\n typeof (value as Service<TInput, TOutput>).$fabric === \"string\"\n );\n}\n\n/**\n * Extended service context with auth information\n */\nexport interface HttpServiceContext<TAuth = unknown> extends ServiceContext {\n /** Authorization result (returned from authorization function) */\n auth?: TAuth;\n /** HTTP context for advanced use cases */\n http?: HttpContext;\n}\n\n/**\n * Create an HTTP-aware fabric service\n *\n * Extends fabricService with:\n * - HTTP context transformation (body, headers, method, path, query, params)\n * - Authorization handling (token extraction from Authorization header)\n * - CORS configuration (enabled by default)\n *\n * Accepts either:\n * - Inline service definition (with `service` function)\n * - Pre-built `fabricService` instance (via `service` property)\n */\nexport function fabricHttp<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n TAuth = unknown,\n>(\n config: FabricHttpConfig<TInput, TOutput, TAuth>,\n): FabricHttpService<TInput, TOutput, TAuth> {\n const {\n authorization = false,\n cors = true,\n http = defaultHttpTransform as HttpTransformFunction<TInput>,\n service: serviceConfig,\n stream = false,\n ...baseConfig\n } = config;\n\n // Resolve the underlying service\n let underlyingService: Service<TInput, TOutput>;\n\n if (isFabricService<TInput, TOutput>(serviceConfig)) {\n // Pre-built fabricService - merge configs\n underlyingService = serviceConfig;\n\n // Merge base config properties from the pre-built service\n if (\n baseConfig.alias === undefined &&\n underlyingService.alias !== undefined\n ) {\n baseConfig.alias = underlyingService.alias;\n }\n if (\n baseConfig.description === undefined &&\n underlyingService.description !== undefined\n ) {\n baseConfig.description = underlyingService.description;\n }\n if (\n baseConfig.input === undefined &&\n underlyingService.input !== undefined\n ) {\n baseConfig.input = underlyingService.input;\n }\n } else {\n // Inline service definition or plain function\n const serviceFunction = serviceConfig as ServiceConfig<\n TInput,\n TOutput\n >[\"service\"];\n underlyingService = fabricService<TInput, TOutput>({\n ...baseConfig,\n service: serviceFunction,\n } as ServiceConfig<TInput, TOutput>);\n }\n\n // Create the HTTP handler that processes HTTP context\n const httpHandler = async (\n input?: Partial<TInput> | string,\n context?: HttpServiceContext<TAuth>,\n ): Promise<TOutput> => {\n // If context has HTTP info, process authorization\n // (HTTP context is added by the adapter layer like fabricExpress)\n if (context?.http && authorization !== false) {\n const authResult = await validateAuthorization<TAuth>(\n context.http.headers,\n authorization,\n );\n // Add auth result to context\n (context as HttpServiceContext<TAuth>).auth = authResult;\n }\n\n // Call the underlying service\n return underlyingService(input, context);\n };\n\n // Create the HTTP service with all properties\n const httpService = httpHandler as FabricHttpService<TInput, TOutput, TAuth>;\n\n // Copy properties from config (which may have been merged with underlying service)\n httpService.$fabric = underlyingService.$fabric;\n\n // Use baseConfig values (which include overrides) or fall back to underlying service\n const resolvedAlias = baseConfig.alias ?? underlyingService.alias;\n const resolvedDescription =\n baseConfig.description ?? underlyingService.description;\n const resolvedInput = baseConfig.input ?? underlyingService.input;\n\n if (resolvedAlias !== undefined) {\n httpService.alias = resolvedAlias;\n }\n if (resolvedDescription !== undefined) {\n httpService.description = resolvedDescription;\n }\n if (resolvedInput !== undefined) {\n httpService.input = resolvedInput;\n }\n if (underlyingService.service !== undefined) {\n httpService.service = underlyingService.service;\n }\n\n // Add HTTP-specific properties\n httpService.authorization = authorization;\n httpService.cors = cors;\n httpService.http = http;\n httpService.stream = stream;\n\n return httpService;\n}\n\n/**\n * Check if a service is an HTTP service (has http, authorization, cors properties)\n */\nexport function isFabricHttpService<\n TInput extends Record<string, unknown>,\n TOutput,\n TAuth,\n>(value: unknown): value is FabricHttpService<TInput, TOutput, TAuth> {\n return (\n isFabricService<TInput, TOutput>(value) &&\n \"authorization\" in value &&\n \"cors\" in value &&\n \"http\" in value &&\n \"stream\" in value\n );\n}\n","import type {\n CorsConfig,\n CorsHeaders,\n CorsOption,\n HttpMethod,\n} from \"./types.js\";\n\n/**\n * Default CORS configuration\n */\nexport const DEFAULT_CORS_CONFIG: CorsConfig = {\n origin: \"*\",\n credentials: false,\n headers: [\"Content-Type\", \"Authorization\"],\n exposeHeaders: [],\n maxAge: 86400, // 24 hours\n};\n\n/**\n * Default allowed methods for CORS\n */\nexport const DEFAULT_CORS_METHODS: HttpMethod[] = [\n \"GET\",\n \"POST\",\n \"DELETE\",\n \"OPTIONS\",\n];\n\n/**\n * Normalize CORS option to CorsConfig\n * - true → default config\n * - false → disabled (returns undefined)\n * - CorsConfig → merged with defaults\n */\nexport function normalizeCorsConfig(\n option: CorsOption | undefined,\n): CorsConfig | undefined {\n // Undefined or true → use defaults\n if (option === undefined || option === true) {\n return { ...DEFAULT_CORS_CONFIG };\n }\n\n // False → disabled\n if (option === false) {\n return undefined;\n }\n\n // Merge with defaults\n return {\n ...DEFAULT_CORS_CONFIG,\n ...option,\n };\n}\n\n/**\n * Get the allowed origin for a request\n * @param config - CORS configuration\n * @param requestOrigin - Origin header from request\n * @returns The origin to allow, or undefined if not allowed\n */\nexport function getAllowedOrigin(\n config: CorsConfig,\n requestOrigin: string | null,\n): string | undefined {\n const { origin } = config;\n\n // Wildcard allows all\n if (origin === \"*\") {\n return \"*\";\n }\n\n // No origin in request\n if (!requestOrigin) {\n return undefined;\n }\n\n // Array of allowed origins\n if (Array.isArray(origin)) {\n if (origin.includes(requestOrigin)) {\n return requestOrigin;\n }\n return undefined;\n }\n\n // Single origin string\n if (origin === requestOrigin) {\n return requestOrigin;\n }\n\n return undefined;\n}\n\n/**\n * Build CORS headers for a response\n * @param config - CORS configuration\n * @param requestOrigin - Origin header from request\n * @param methods - Allowed HTTP methods\n * @returns Object with CORS headers, or empty object if CORS is disabled\n */\nexport function buildCorsHeaders(\n config: CorsConfig | undefined,\n requestOrigin: string | null,\n methods: HttpMethod[] = DEFAULT_CORS_METHODS,\n): CorsHeaders {\n if (!config) {\n return {};\n }\n\n const headers: CorsHeaders = {};\n\n // Access-Control-Allow-Origin\n const allowedOrigin = getAllowedOrigin(config, requestOrigin);\n if (allowedOrigin) {\n headers[\"Access-Control-Allow-Origin\"] = allowedOrigin;\n }\n\n // Access-Control-Allow-Methods\n headers[\"Access-Control-Allow-Methods\"] = methods.join(\", \");\n\n // Access-Control-Allow-Headers\n if (config.headers && config.headers.length > 0) {\n headers[\"Access-Control-Allow-Headers\"] = config.headers.join(\", \");\n }\n\n // Access-Control-Allow-Credentials\n if (config.credentials) {\n headers[\"Access-Control-Allow-Credentials\"] = \"true\";\n }\n\n // Access-Control-Expose-Headers\n if (config.exposeHeaders && config.exposeHeaders.length > 0) {\n headers[\"Access-Control-Expose-Headers\"] = config.exposeHeaders.join(\", \");\n }\n\n // Access-Control-Max-Age\n if (config.maxAge !== undefined) {\n headers[\"Access-Control-Max-Age\"] = String(config.maxAge);\n }\n\n return headers;\n}\n\n/**\n * Check if request is a CORS preflight request\n */\nexport function isPreflightRequest(method: string, headers: Headers): boolean {\n return (\n method.toUpperCase() === \"OPTIONS\" &&\n headers.has(\"access-control-request-method\")\n );\n}\n\n/**\n * Build preflight response headers\n * Includes all CORS headers needed for preflight response\n */\nexport function buildPreflightHeaders(\n config: CorsConfig | undefined,\n requestOrigin: string | null,\n requestMethod: string | null,\n requestHeaders: string | null,\n methods: HttpMethod[] = DEFAULT_CORS_METHODS,\n): CorsHeaders {\n if (!config) {\n return {};\n }\n\n const headers = buildCorsHeaders(config, requestOrigin, methods);\n\n // Include requested headers in response if not already covered\n if (requestHeaders) {\n const requestedHeaders = requestHeaders.split(\",\").map((h) => h.trim());\n const allowedHeaders = config.headers || [];\n const combinedHeaders = [\n ...new Set([...allowedHeaders, ...requestedHeaders]),\n ];\n headers[\"Access-Control-Allow-Headers\"] = combinedHeaders.join(\", \");\n }\n\n return headers;\n}\n","import type { Service, ServiceConfig } from \"../types.js\";\n\n// #region HTTP Context\n\n/**\n * HTTP request context passed to the `http` transformation function\n */\nexport interface HttpContext {\n /** Parsed request body */\n body: unknown;\n /** Request headers */\n headers: Headers;\n /** HTTP method (GET, POST, PUT, DELETE, PATCH) */\n method: string;\n /** URL path */\n path: string;\n /** Query string parameters */\n query: URLSearchParams;\n /** Path parameters extracted from route pattern (e.g., :id) */\n params: Record<string, string>;\n}\n\n/**\n * Function that transforms HTTP context to fabric service input\n */\nexport type HttpTransformFunction<TInput = Record<string, unknown>> = (\n context: HttpContext,\n) => TInput | Promise<TInput>;\n\n// #endregion\n\n// #region Authorization\n\n/**\n * Authorization function that validates a token and returns auth context\n * Token is extracted from Authorization header with Bearer prefix removed\n */\nexport type AuthorizationFunction<TAuth = unknown> = (\n token: string,\n) => TAuth | Promise<TAuth>;\n\n/**\n * Authorization configuration - either a function or false for public endpoints\n */\nexport type AuthorizationConfig<TAuth = unknown> =\n | AuthorizationFunction<TAuth>\n | false;\n\n// #endregion\n\n// #region CORS\n\n/**\n * CORS configuration options\n */\nexport interface CorsConfig {\n /** Allowed origins - \"*\" for all, or array of specific origins */\n origin?: string | string[];\n /** Allow credentials (Access-Control-Allow-Credentials) */\n credentials?: boolean;\n /** Additional allowed headers (Access-Control-Allow-Headers) */\n headers?: string[];\n /** Headers to expose to the client (Access-Control-Expose-Headers) */\n exposeHeaders?: string[];\n /** Preflight cache duration in seconds (Access-Control-Max-Age) */\n maxAge?: number;\n}\n\n/**\n * CORS configuration - object config, true for defaults, or false to disable\n */\nexport type CorsOption = CorsConfig | boolean;\n\n/**\n * Resolved CORS headers to send in response\n */\nexport interface CorsHeaders {\n \"Access-Control-Allow-Origin\"?: string;\n \"Access-Control-Allow-Methods\"?: string;\n \"Access-Control-Allow-Headers\"?: string;\n \"Access-Control-Allow-Credentials\"?: string;\n \"Access-Control-Expose-Headers\"?: string;\n \"Access-Control-Max-Age\"?: string;\n}\n\n// #endregion\n\n// #region Response Format\n\n/**\n * JSON:API-style success response envelope\n */\nexport interface DataResponse<T = unknown> {\n data: T;\n}\n\n/**\n * JSON:API-style error object\n */\nexport interface ErrorObject {\n status: number;\n title: string;\n detail?: string;\n}\n\n/**\n * JSON:API-style error response envelope\n */\nexport interface ErrorResponse {\n errors: ErrorObject[];\n}\n\n// #endregion\n\n// #region fabricHttp Config\n\n/**\n * HTTP service configuration - extends base ServiceConfig with HTTP-specific options\n */\nexport interface FabricHttpConfig<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n TAuth = unknown,\n> extends Omit<ServiceConfig<TInput, TOutput>, \"service\"> {\n /** Pre-built fabricService or inline service function */\n service?:\n | Service<TInput, TOutput>\n | ServiceConfig<TInput, TOutput>[\"service\"];\n\n /** Transform HTTP context to service input (defaults to body + query merge) */\n http?: HttpTransformFunction<TInput>;\n\n /** Authorization function or false for public endpoints */\n authorization?: AuthorizationConfig<TAuth>;\n\n /** CORS configuration (enabled by default) */\n cors?: CorsOption;\n\n /** Streaming configuration (disabled by default) */\n stream?: StreamOption;\n}\n\n/**\n * HTTP service - fabricService with HTTP-specific metadata\n */\nexport interface FabricHttpService<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n TAuth = unknown,\n> extends Service<TInput, TOutput> {\n /** HTTP transformation function */\n http: HttpTransformFunction<TInput>;\n /** Authorization configuration */\n authorization: AuthorizationConfig<TAuth>;\n /** CORS configuration */\n cors: CorsOption;\n /** Streaming configuration */\n stream: StreamOption;\n}\n\n// #endregion\n\n// #region HTTP Methods\n\n/**\n * Supported HTTP methods\n */\nexport type HttpMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"DELETE\"\n | \"PATCH\"\n | \"OPTIONS\";\n\n/**\n * Default HTTP methods for fabric services\n */\nexport const DEFAULT_HTTP_METHODS: HttpMethod[] = [\"GET\", \"POST\", \"DELETE\"];\n\n// #endregion\n\n// #region Streaming\n\n/**\n * HTTP stream event types for SSE/NDJSON streaming\n */\nexport enum HttpStreamEventType {\n /** Stream complete */\n Complete = \"complete\",\n /** Final response data */\n Data = \"data\",\n /** Error event */\n Error = \"error\",\n /** Fabric progress message (from sendMessage) */\n Message = \"message\",\n /** Keep-alive signal (no content) */\n Noop = \"noop\",\n /** LLM text chunk */\n Text = \"text\",\n /** LLM tool call event */\n ToolCall = \"tool_call\",\n /** LLM tool result event */\n ToolResult = \"tool_result\",\n}\n\n/**\n * Base stream event structure\n */\nexport interface HttpStreamEventBase {\n stream: HttpStreamEventType;\n}\n\n/**\n * Message event - progress updates from sendMessage\n */\nexport interface HttpStreamEventMessage extends HttpStreamEventBase {\n stream: HttpStreamEventType.Message;\n content: string;\n level?: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\";\n}\n\n/**\n * Text event - LLM text chunk\n */\nexport interface HttpStreamEventText extends HttpStreamEventBase {\n stream: HttpStreamEventType.Text;\n content: string;\n}\n\n/**\n * Tool call event - LLM requesting tool execution\n */\nexport interface HttpStreamEventToolCall extends HttpStreamEventBase {\n stream: HttpStreamEventType.ToolCall;\n toolCall: {\n id: string;\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Tool result event - result from tool execution\n */\nexport interface HttpStreamEventToolResult extends HttpStreamEventBase {\n stream: HttpStreamEventType.ToolResult;\n toolResult: {\n id: string;\n name: string;\n result: unknown;\n };\n}\n\n/**\n * Data event - final response data\n */\nexport interface HttpStreamEventData<T = unknown> extends HttpStreamEventBase {\n stream: HttpStreamEventType.Data;\n data: T;\n}\n\n/**\n * Error event\n */\nexport interface HttpStreamEventError extends HttpStreamEventBase {\n stream: HttpStreamEventType.Error;\n error: {\n status: number | string;\n title: string;\n detail?: string;\n };\n}\n\n/**\n * Complete event - stream complete\n */\nexport interface HttpStreamEventComplete extends HttpStreamEventBase {\n stream: HttpStreamEventType.Complete;\n}\n\n/**\n * Noop event - keep-alive signal\n */\nexport interface HttpStreamEventNoop extends HttpStreamEventBase {\n stream: HttpStreamEventType.Noop;\n}\n\n/**\n * Union of all stream event types\n */\nexport type HttpStreamEvent =\n | HttpStreamEventComplete\n | HttpStreamEventData\n | HttpStreamEventError\n | HttpStreamEventMessage\n | HttpStreamEventNoop\n | HttpStreamEventText\n | HttpStreamEventToolCall\n | HttpStreamEventToolResult;\n\n/**\n * Stream configuration options (internal)\n */\nexport interface StreamConfig {\n /** Output format - NDJSON (default) or SSE */\n format?: \"ndjson\" | \"sse\";\n /** Keep-alive heartbeat interval in ms (default: 15000) */\n heartbeat?: number;\n /** Include tool calls/results in stream (default: true) */\n includeTools?: boolean;\n}\n\n/**\n * Stream option - true to enable streaming, false to disable\n */\nexport type StreamOption = boolean;\n\n/**\n * Streaming service function that yields events\n */\nexport type StreamingServiceFunction<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n> = (\n input: TInput,\n context: unknown,\n) => AsyncIterable<HttpStreamEvent> | Promise<AsyncIterable<HttpStreamEvent>>;\n\n// #endregion\n\n// #region FabricHttpServer Config\n\n/**\n * Route entry for FabricHttpServer - service with path and method configuration\n */\nexport interface FabricHttpServerRoute<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n TAuth = unknown,\n> {\n /** The FabricHttpService to handle requests */\n service: FabricHttpService<TInput, TOutput, TAuth>;\n /** Route path pattern (defaults to /${alias}) */\n path?: string;\n /** Allowed HTTP methods (defaults to DEFAULT_HTTP_METHODS) */\n methods?: HttpMethod[];\n}\n\n/**\n * Service entry - either a FabricHttpService or a route config\n */\nexport type FabricHttpServerServiceEntry =\n | FabricHttpService\n | FabricHttpServerRoute;\n\n/**\n * Configuration for FabricHttpServer\n */\nexport interface FabricHttpServerConfig {\n /** Array of services or route configs to register */\n services: FabricHttpServerServiceEntry[];\n /** Server-level authorization (applied to all services unless overridden) */\n authorization?: AuthorizationConfig;\n /** Server-level CORS config (applied to all services unless overridden) */\n cors?: CorsOption;\n /** Path prefix for all routes (e.g., \"/api\") */\n prefix?: string;\n}\n\n/**\n * API Gateway v1 (REST API) event format\n */\nexport interface ApiGatewayV1Event {\n body: string | null;\n headers: Record<string, string>;\n httpMethod: string;\n path: string;\n pathParameters?: Record<string, string> | null;\n queryStringParameters?: Record<string, string> | null;\n requestContext?: {\n requestId?: string;\n };\n}\n\n/**\n * API Gateway v2 (HTTP API) event format\n */\nexport interface ApiGatewayV2Event {\n body?: string;\n headers: Record<string, string>;\n rawPath: string;\n rawQueryString?: string;\n requestContext: {\n http: {\n method: string;\n path: string;\n };\n requestId?: string;\n };\n pathParameters?: Record<string, string>;\n queryStringParameters?: Record<string, string>;\n}\n\n/**\n * Union of API Gateway event types\n */\nexport type ApiGatewayEvent = ApiGatewayV1Event | ApiGatewayV2Event;\n\n/**\n * API Gateway response format (compatible with v1 and v2)\n */\nexport interface ApiGatewayResponse {\n statusCode: number;\n headers: Record<string, string>;\n body: string;\n}\n\n/**\n * Registered route with resolved path and methods\n */\nexport interface RegisteredRoute {\n /** Compiled path pattern */\n path: string;\n /** Path segments for matching */\n segments: string[];\n /** Allowed methods */\n methods: HttpMethod[];\n /** The service to handle requests */\n service: FabricHttpService;\n}\n\n/**\n * Match result from route matching\n */\nexport interface RouteMatch {\n /** The matched route */\n route: RegisteredRoute;\n /** Extracted path parameters */\n params: Record<string, string>;\n}\n\n/**\n * FabricHttpServer handler function\n */\nexport type FabricHttpServerHandler = (\n event: ApiGatewayEvent,\n) => Promise<ApiGatewayResponse>;\n\n/**\n * FabricHttpServer with metadata\n */\nexport interface FabricHttpServer extends FabricHttpServerHandler {\n /** Registered services */\n services: FabricHttpService[];\n /** Route prefix */\n prefix?: string;\n /** Registered routes */\n routes: RegisteredRoute[];\n}\n\n// #endregion\n","// FabricHttpServer - Standalone Lambda/server for multi-service HTTP routing\n\nimport { isJaypieError, JaypieError } from \"@jaypie/errors\";\n\nimport type { HttpServiceContext } from \"./fabricHttp.js\";\nimport { isFabricHttpService } from \"./fabricHttp.js\";\nimport {\n buildCorsHeaders,\n buildPreflightHeaders,\n isPreflightRequest,\n normalizeCorsConfig,\n} from \"./cors.js\";\nimport { createHttpContext, transformHttpToInput } from \"./httpTransform.js\";\nimport type {\n ApiGatewayEvent,\n ApiGatewayResponse,\n ApiGatewayV1Event,\n ApiGatewayV2Event,\n AuthorizationConfig,\n CorsHeaders,\n CorsOption,\n DataResponse,\n ErrorResponse,\n FabricHttpServer as FabricHttpServerType,\n FabricHttpServerConfig,\n FabricHttpServerRoute,\n FabricHttpService,\n HttpMethod,\n RegisteredRoute,\n RouteMatch,\n} from \"./types.js\";\nimport { DEFAULT_HTTP_METHODS } from \"./types.js\";\n\n/**\n * Check if event is API Gateway v2 format\n */\nfunction isApiGatewayV2Event(event: ApiGatewayEvent): event is ApiGatewayV2Event {\n return \"requestContext\" in event && \"http\" in (event as ApiGatewayV2Event).requestContext;\n}\n\n/**\n * Check if entry is a FabricHttpServerRoute (has service property)\n */\nfunction isRouteConfig(\n entry: FabricHttpService | FabricHttpServerRoute,\n): entry is FabricHttpServerRoute {\n return (\n typeof entry === \"object\" &&\n entry !== null &&\n \"service\" in entry &&\n isFabricHttpService(entry.service)\n );\n}\n\n/**\n * Extract request data from API Gateway event (v1 or v2)\n */\nfunction extractRequestData(event: ApiGatewayEvent): {\n body: string | null;\n headers: Record<string, string>;\n method: string;\n path: string;\n queryString: string;\n pathParams: Record<string, string>;\n} {\n if (isApiGatewayV2Event(event)) {\n // API Gateway v2 (HTTP API)\n return {\n body: event.body ?? null,\n headers: event.headers ?? {},\n method: event.requestContext.http.method,\n path: event.rawPath,\n queryString: event.rawQueryString ?? \"\",\n pathParams: event.pathParameters ?? {},\n };\n } else {\n // API Gateway v1 (REST API)\n const v1Event = event as ApiGatewayV1Event;\n // Convert query params to query string\n const queryParams = v1Event.queryStringParameters ?? {};\n const queryString = new URLSearchParams(queryParams).toString();\n\n return {\n body: v1Event.body,\n headers: v1Event.headers ?? {},\n method: v1Event.httpMethod,\n path: v1Event.path,\n queryString,\n pathParams: v1Event.pathParameters ?? {},\n };\n }\n}\n\n/**\n * Match a request path against a route pattern\n * Returns extracted params if matched, undefined if not\n */\nfunction matchRoute(\n requestPath: string,\n route: RegisteredRoute,\n): Record<string, string> | undefined {\n const requestSegments = requestPath.split(\"/\").filter(Boolean);\n const routeSegments = route.segments;\n\n // Check segment count (allow route to have optional params)\n if (requestSegments.length < routeSegments.filter((s) => !s.endsWith(\"?\")).length) {\n return undefined;\n }\n if (requestSegments.length > routeSegments.length) {\n return undefined;\n }\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < routeSegments.length; i++) {\n const routeSegment = routeSegments[i];\n const requestSegment = requestSegments[i];\n\n if (routeSegment.startsWith(\":\")) {\n // Parameter segment\n const paramName = routeSegment.slice(1).replace(\"?\", \"\");\n const isOptional = routeSegment.endsWith(\"?\");\n\n if (requestSegment !== undefined) {\n params[paramName] = requestSegment;\n } else if (!isOptional) {\n return undefined; // Required param missing\n }\n } else {\n // Literal segment - must match exactly\n if (requestSegment !== routeSegment) {\n return undefined;\n }\n }\n }\n\n return params;\n}\n\n/**\n * Find matching route for a request\n */\nfunction findRoute(\n path: string,\n method: string,\n routes: RegisteredRoute[],\n prefix?: string,\n): RouteMatch | undefined {\n // Remove prefix from path if present\n let normalizedPath = path;\n if (prefix && normalizedPath.startsWith(prefix)) {\n normalizedPath = normalizedPath.slice(prefix.length) || \"/\";\n }\n\n // Find first matching route\n for (const route of routes) {\n // Check method first\n if (!route.methods.includes(method.toUpperCase() as HttpMethod)) {\n continue;\n }\n\n // Try to match path\n const params = matchRoute(normalizedPath, route);\n if (params !== undefined) {\n return { route, params };\n }\n }\n\n return undefined;\n}\n\n/**\n * Find route by path only (ignoring method) for 405 responses\n */\nfunction findRouteByPath(\n path: string,\n routes: RegisteredRoute[],\n prefix?: string,\n): RegisteredRoute | undefined {\n let normalizedPath = path;\n if (prefix && normalizedPath.startsWith(prefix)) {\n normalizedPath = normalizedPath.slice(prefix.length) || \"/\";\n }\n\n for (const route of routes) {\n const params = matchRoute(normalizedPath, route);\n if (params !== undefined) {\n return route;\n }\n }\n\n return undefined;\n}\n\n/**\n * Build API Gateway response\n */\nfunction buildResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = {},\n): ApiGatewayResponse {\n return {\n statusCode,\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify(body),\n };\n}\n\n/**\n * Apply CORS headers to response headers object\n */\nfunction applyCorsHeaders(\n responseHeaders: Record<string, string>,\n corsHeaders: CorsHeaders,\n): void {\n for (const [key, value] of Object.entries(corsHeaders)) {\n if (value !== undefined) {\n responseHeaders[key] = value;\n }\n }\n}\n\n/**\n * Create a standalone HTTP server for Lambda\n *\n * Routes multiple FabricHttpService instances without Express:\n * - Parses API Gateway v1 and v2 events\n * - Matches routes by path pattern and HTTP method\n * - Handles CORS preflight and response headers\n * - Returns JSON:API formatted responses\n *\n * @example\n * ```typescript\n * import { FabricHttpServer } from \"@jaypie/fabric/http\";\n * import { lambdaHandler } from \"@jaypie/lambda\";\n *\n * const server = FabricHttpServer({\n * services: [\n * userService,\n * { service: productService, path: \"/products/:id\", methods: [\"GET\", \"PUT\"] },\n * ],\n * prefix: \"/api\",\n * });\n *\n * export const handler = lambdaHandler(server);\n * ```\n */\nexport function FabricHttpServer(\n config: FabricHttpServerConfig,\n): FabricHttpServerType {\n const {\n services,\n authorization: serverAuthorization,\n cors: serverCors = true,\n prefix,\n } = config;\n\n // Build routes from services\n const routes: RegisteredRoute[] = [];\n const registeredServices: FabricHttpService[] = [];\n\n for (const entry of services) {\n let service: FabricHttpService;\n let path: string | undefined;\n let methods: HttpMethod[] | undefined;\n\n if (isRouteConfig(entry)) {\n service = entry.service;\n path = entry.path;\n methods = entry.methods;\n } else if (isFabricHttpService(entry)) {\n service = entry;\n } else {\n throw new Error(\n \"FabricHttpServer: Each service entry must be a FabricHttpService or { service: FabricHttpService }\",\n );\n }\n\n // Determine path from config or service alias\n const routePath = path ?? (service.alias ? `/${service.alias}` : \"/\");\n\n // Parse route segments\n const segments = routePath.split(\"/\").filter(Boolean);\n\n routes.push({\n path: routePath,\n segments,\n methods: methods ?? DEFAULT_HTTP_METHODS,\n service,\n });\n\n registeredServices.push(service);\n }\n\n // Normalize server-level CORS config\n const serverCorsConfig = normalizeCorsConfig(serverCors);\n\n /**\n * Main request handler\n */\n const handler = async (event: ApiGatewayEvent): Promise<ApiGatewayResponse> => {\n // Extract request data from API Gateway event\n const { body, headers, method, path: requestPath, queryString, pathParams } =\n extractRequestData(event);\n\n // Normalize headers to Headers object for consistency\n const headersObj = new Headers(headers);\n const origin = headersObj.get(\"origin\");\n\n // Collect all methods for matched path (for 405 and OPTIONS)\n const pathRoute = findRouteByPath(requestPath, routes, prefix);\n const allowedMethods = pathRoute?.methods ?? [];\n\n // Handle CORS preflight\n if (isPreflightRequest(method, headersObj)) {\n const preflightHeaders = buildPreflightHeaders(\n serverCorsConfig,\n origin,\n headersObj.get(\"access-control-request-method\"),\n headersObj.get(\"access-control-request-headers\"),\n allowedMethods.length > 0 ? allowedMethods : DEFAULT_HTTP_METHODS,\n );\n\n const responseHeaders: Record<string, string> = {};\n applyCorsHeaders(responseHeaders, preflightHeaders);\n\n return {\n statusCode: 204,\n headers: responseHeaders,\n body: \"\",\n };\n }\n\n // Build CORS headers for response\n const corsHeaders = buildCorsHeaders(serverCorsConfig, origin, allowedMethods);\n const responseHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n applyCorsHeaders(responseHeaders, corsHeaders);\n\n // Find matching route\n const match = findRoute(requestPath, method, routes, prefix);\n\n // 404 - No route found\n if (!match && !pathRoute) {\n const errorResponse: ErrorResponse = {\n errors: [\n {\n status: 404,\n title: \"Not Found\",\n detail: `No route matches ${requestPath}`,\n },\n ],\n };\n return buildResponse(404, errorResponse, responseHeaders);\n }\n\n // 405 - Path exists but method not allowed\n if (!match && pathRoute) {\n const errorResponse: ErrorResponse = {\n errors: [\n {\n status: 405,\n title: \"Method Not Allowed\",\n detail: `${method} is not allowed for ${requestPath}`,\n },\n ],\n };\n responseHeaders[\"Allow\"] = pathRoute.methods.join(\", \");\n return buildResponse(405, errorResponse, responseHeaders);\n }\n\n // We have a match\n const { route, params } = match!;\n const service = route.service;\n\n try {\n // Create HTTP context\n const httpContext = createHttpContext({\n body,\n headers,\n method,\n path: requestPath,\n queryString,\n params: { ...pathParams, ...params },\n });\n\n // Transform to service input\n const input = await transformHttpToInput(httpContext, service.http);\n\n // Build service context\n const serviceContext: HttpServiceContext = {\n http: httpContext,\n };\n\n // Call the service\n const result = await service(input, serviceContext);\n\n // Build success response\n const successResponse: DataResponse = {\n data: result,\n };\n\n return buildResponse(200, successResponse, responseHeaders);\n } catch (error) {\n // Handle errors\n const jaypieError = isJaypieError(error);\n const status = jaypieError ? (error as JaypieError).status : 500;\n const title = jaypieError\n ? (error as JaypieError).title\n : \"Internal Server Error\";\n const detail = error instanceof Error ? error.message : String(error);\n\n const errorResponse: ErrorResponse = {\n errors: [\n {\n status,\n title,\n detail: status === 500 ? undefined : detail,\n },\n ],\n };\n\n return buildResponse(status, errorResponse, responseHeaders);\n }\n };\n\n // Attach metadata to handler\n const server = handler as FabricHttpServerType;\n server.services = registeredServices;\n server.prefix = prefix;\n server.routes = routes;\n\n return server;\n}\n\n/**\n * Check if a value is a FabricHttpServer\n */\nexport function isFabricHttpServer(\n value: unknown,\n): value is FabricHttpServerType {\n return (\n typeof value === \"function\" &&\n \"services\" in value &&\n Array.isArray((value as FabricHttpServerType).services) &&\n \"routes\" in value &&\n Array.isArray((value as FabricHttpServerType).routes)\n );\n}\n","import type { Message, MessageLevel, ServiceContext } from \"../types.js\";\n\nimport type {\n HttpContext,\n HttpStreamEvent,\n HttpStreamEventComplete,\n HttpStreamEventData,\n HttpStreamEventError,\n HttpStreamEventMessage,\n HttpStreamEventNoop,\n HttpStreamEventText,\n HttpStreamEventToolCall,\n HttpStreamEventToolResult,\n StreamConfig,\n StreamOption,\n} from \"./types.js\";\nimport { HttpStreamEventType } from \"./types.js\";\n\n// #region Constants\n\n/**\n * Default stream configuration\n */\nexport const DEFAULT_STREAM_CONFIG: StreamConfig = {\n format: \"ndjson\",\n heartbeat: 15000,\n includeTools: true,\n};\n\n// #endregion\n\n// #region Stream Config\n\n/**\n * Normalize stream option to StreamConfig\n * - true → default config (NDJSON format, tools included)\n * - false/undefined → disabled (returns undefined)\n */\nexport function normalizeStreamConfig(\n option: StreamOption | undefined,\n): StreamConfig | undefined {\n if (option === true) {\n return { ...DEFAULT_STREAM_CONFIG };\n }\n return undefined;\n}\n\n/**\n * Check if streaming is enabled\n */\nexport function isStreamingEnabled(option: StreamOption | undefined): boolean {\n return option === true;\n}\n\n// #endregion\n\n// #region Event Formatting\n\n/**\n * Format a stream event as SSE (Server-Sent Events)\n *\n * SSE format:\n * event: <type>\n * data: <json>\n *\n */\nexport function formatSseEvent(event: HttpStreamEvent): string {\n const eventType = event.stream;\n const data = JSON.stringify(event);\n return `event: ${eventType}\\ndata: ${data}\\n\\n`;\n}\n\n/**\n * Format a stream event as NDJSON (Newline-Delimited JSON)\n */\nexport function formatNdjsonEvent(event: HttpStreamEvent): string {\n return JSON.stringify(event) + \"\\n\";\n}\n\n/**\n * Format a stream event based on config\n */\nexport function formatStreamEvent(\n event: HttpStreamEvent,\n config: StreamConfig,\n): string {\n if (config.format === \"ndjson\") {\n return formatNdjsonEvent(event);\n }\n return formatSseEvent(event);\n}\n\n/**\n * Get content-type header for stream format\n */\nexport function getStreamContentType(config: StreamConfig): string {\n if (config.format === \"ndjson\") {\n return \"application/x-ndjson\";\n }\n return \"text/event-stream\";\n}\n\n// #endregion\n\n// #region Event Creators\n\n/**\n * Create a message event (progress update)\n */\nexport function createMessageEvent(\n content: string,\n level?: MessageLevel,\n): HttpStreamEventMessage {\n const event: HttpStreamEventMessage = {\n stream: HttpStreamEventType.Message,\n content,\n };\n if (level !== undefined) {\n event.level = level;\n }\n return event;\n}\n\n/**\n * Create a text event (LLM text chunk)\n */\nexport function createTextEvent(content: string): HttpStreamEventText {\n return {\n stream: HttpStreamEventType.Text,\n content,\n };\n}\n\n/**\n * Create a tool call event\n */\nexport function createToolCallEvent(toolCall: {\n id: string;\n name: string;\n arguments: string;\n}): HttpStreamEventToolCall {\n return {\n stream: HttpStreamEventType.ToolCall,\n toolCall,\n };\n}\n\n/**\n * Create a tool result event\n */\nexport function createToolResultEvent(toolResult: {\n id: string;\n name: string;\n result: unknown;\n}): HttpStreamEventToolResult {\n return {\n stream: HttpStreamEventType.ToolResult,\n toolResult,\n };\n}\n\n/**\n * Create a data event (final response)\n */\nexport function createDataEvent<T>(data: T): HttpStreamEventData<T> {\n return {\n stream: HttpStreamEventType.Data,\n data,\n };\n}\n\n/**\n * Create an error event\n */\nexport function createErrorEvent(error: {\n status: number | string;\n title: string;\n detail?: string;\n}): HttpStreamEventError {\n return {\n stream: HttpStreamEventType.Error,\n error,\n };\n}\n\n/**\n * Create a complete event\n */\nexport function createCompleteEvent(): HttpStreamEventComplete {\n return {\n stream: HttpStreamEventType.Complete,\n };\n}\n\n/**\n * Create a noop event (keep-alive signal)\n */\nexport function createNoopEvent(): HttpStreamEventNoop {\n return {\n stream: HttpStreamEventType.Noop,\n };\n}\n\n// #endregion\n\n// #region Stream Context\n\n/**\n * Callback type for writing stream events\n */\nexport type StreamWriter = (event: HttpStreamEvent) => void | Promise<void>;\n\n/**\n * Extended service context with streaming capabilities\n */\nexport interface HttpStreamContext<TAuth = unknown> extends ServiceContext {\n /** Authorization result (returned from authorization function) */\n auth?: TAuth;\n /** HTTP context for advanced use cases */\n http?: HttpContext;\n /** Stream text content to client */\n streamText: (content: string) => void;\n /** Stream a structured event to client */\n streamEvent: (event: HttpStreamEvent) => void;\n}\n\n/**\n * Create a stream context with streaming capabilities\n *\n * @param writer - Function to write stream events\n * @param baseContext - Base service context to extend\n * @returns Extended context with stream methods\n */\nexport function createStreamContext<TAuth = unknown>(\n writer: StreamWriter,\n baseContext?: Partial<HttpStreamContext<TAuth>>,\n): HttpStreamContext<TAuth> {\n const streamEvent = (event: HttpStreamEvent): void => {\n try {\n writer(event);\n } catch {\n // Swallow errors in stream writer (connection may be closed)\n }\n };\n\n const streamText = (content: string): void => {\n streamEvent(createTextEvent(content));\n };\n\n // Create sendMessage that streams as message events\n const sendMessage = (message: Message): void => {\n try {\n const event = createMessageEvent(message.content, message.level);\n writer(event);\n } catch {\n // Swallow errors\n }\n };\n\n return {\n ...baseContext,\n sendMessage,\n streamEvent,\n streamText,\n };\n}\n\n// #endregion\n\n// #region Async Generator Utilities\n\n/**\n * Check if a value is an async iterable\n */\nexport function isAsyncIterable<T>(value: unknown): value is AsyncIterable<T> {\n return (\n value !== null && typeof value === \"object\" && Symbol.asyncIterator in value\n );\n}\n\n/**\n * Collect all events from an async iterable into an array\n * Useful for testing\n */\nexport async function collectStreamEvents(\n stream: AsyncIterable<HttpStreamEvent>,\n): Promise<HttpStreamEvent[]> {\n const events: HttpStreamEvent[] = [];\n for await (const event of stream) {\n events.push(event);\n }\n return events;\n}\n\n/**\n * Create an async generator that yields events and returns final data\n */\nexport async function* wrapServiceForStreaming<TOutput>(\n serviceResult: TOutput | AsyncIterable<HttpStreamEvent>,\n): AsyncIterable<HttpStreamEvent> {\n // If result is already an async iterable, pass through\n if (isAsyncIterable<HttpStreamEvent>(serviceResult)) {\n yield* serviceResult;\n return;\n }\n\n // Otherwise, wrap single result as data event\n yield createDataEvent(serviceResult);\n yield createCompleteEvent();\n}\n\n// #endregion\n\n// #region LLM Stream Integration\n\n/**\n * LLM stream chunk types (matches @jaypie/llm LlmStreamChunkType)\n * Defined locally to avoid hard dependency on @jaypie/llm\n */\nconst LLM_CHUNK_TYPES = {\n Done: \"done\",\n Error: \"error\",\n Text: \"text\",\n ToolCall: \"tool_call\",\n ToolResult: \"tool_result\",\n} as const;\n\n/**\n * LLM stream chunk interface (compatible with @jaypie/llm LlmStreamChunk)\n * Defined locally to avoid hard dependency on @jaypie/llm\n */\nexport interface LlmStreamChunk {\n type: string;\n content?: string;\n error?: {\n detail?: string;\n status: number | string;\n title: string;\n };\n toolCall?: {\n arguments: string;\n id: string;\n name: string;\n };\n toolResult?: {\n id: string;\n name: string;\n result: unknown;\n };\n usage?: unknown;\n}\n\n/**\n * Options for piping LLM streams\n */\nexport interface PipeLlmStreamOptions {\n /** Include tool call and tool result events (default: false) */\n includeTools?: boolean;\n}\n\n/**\n * Convert an LLM stream chunk to HTTP stream event\n * Returns undefined for chunks that should be filtered out\n */\nexport function llmChunkToHttpEvent(\n chunk: LlmStreamChunk,\n options?: PipeLlmStreamOptions,\n): HttpStreamEvent | undefined {\n const { includeTools = false } = options ?? {};\n\n switch (chunk.type) {\n case LLM_CHUNK_TYPES.Text:\n if (chunk.content !== undefined) {\n return createTextEvent(chunk.content);\n }\n return undefined;\n\n case LLM_CHUNK_TYPES.ToolCall:\n if (!includeTools) return undefined;\n if (chunk.toolCall) {\n return createToolCallEvent(chunk.toolCall);\n }\n return undefined;\n\n case LLM_CHUNK_TYPES.ToolResult:\n if (!includeTools) return undefined;\n if (chunk.toolResult) {\n return createToolResultEvent(chunk.toolResult);\n }\n return undefined;\n\n case LLM_CHUNK_TYPES.Error:\n if (chunk.error) {\n return createErrorEvent(chunk.error);\n }\n return undefined;\n\n case LLM_CHUNK_TYPES.Done:\n return createCompleteEvent();\n\n default:\n // Unknown chunk type - skip\n return undefined;\n }\n}\n\n/**\n * Pipe an LLM stream (from @jaypie/llm Llm.stream()) to HTTP stream events\n *\n * @example\n * ```typescript\n * import Llm from \"@jaypie/llm\";\n * import { pipeLlmStream } from \"@jaypie/fabric/http\";\n *\n * const llmStream = Llm.stream(\"Tell me a story\");\n * for await (const event of pipeLlmStream(llmStream)) {\n * yield event; // or writer(event)\n * }\n * ```\n */\nexport async function* pipeLlmStream(\n llmStream: AsyncIterable<LlmStreamChunk>,\n options?: PipeLlmStreamOptions,\n): AsyncIterable<HttpStreamEvent> {\n for await (const chunk of llmStream) {\n const event = llmChunkToHttpEvent(chunk, options);\n if (event !== undefined) {\n yield event;\n }\n }\n}\n\n/**\n * Pipe an LLM stream to a stream writer function\n *\n * @example\n * ```typescript\n * import Llm from \"@jaypie/llm\";\n * import { pipeLlmStreamToWriter } from \"@jaypie/fabric/http\";\n *\n * const llmStream = Llm.stream(\"Tell me a story\");\n * await pipeLlmStreamToWriter(llmStream, (event) => {\n * res.write(formatSseEvent(event));\n * });\n * ```\n */\nexport async function pipeLlmStreamToWriter(\n llmStream: AsyncIterable<LlmStreamChunk>,\n writer: StreamWriter,\n options?: PipeLlmStreamOptions,\n): Promise<void> {\n for await (const event of pipeLlmStream(llmStream, options)) {\n await writer(event);\n }\n}\n\n// #endregion\n"],"names":["BadRequestError","UnauthorizedError","HttpStreamEventType","isJaypieError"],"mappings":"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"}
|