UNPKG

life

Version:

Life.js is the first fullstack framework to build agentic web applications. It is minimal, extensible, and typesafe. Well, everything you love.

1 lines 20.9 kB
{"version":3,"sources":["../transport/types.ts","../transport/base.ts"],"sourcesContent":["import z from \"zod\";\nimport type { SerializableValue } from \"@/shared/canon\";\nimport * as op from \"@/shared/operation\";\nimport type { MaybePromise } from \"@/shared/types\";\n\n// RPC messages\nexport const rpcRequestSchema = z.object({\n type: z.literal(\"request\"),\n id: z.string(),\n name: z.string(),\n input: z.unknown().optional(),\n});\n\nexport const rpcResponseSchema = z.object({\n type: z.literal(\"response\"),\n id: z.string(),\n result: op.resultSchema.transform((result) => result as op.OperationResult<SerializableValue>),\n});\n\nexport const rpcMessageSchema = z.discriminatedUnion(\"type\", [rpcRequestSchema, rpcResponseSchema]);\n\nexport type RPCRequest<Input = SerializableValue> = Omit<\n z.infer<typeof rpcRequestSchema>,\n \"input\"\n> & {\n input?: Input;\n};\n\nexport type RPCResponse<Result = op.OperationResult<SerializableValue>> = Omit<\n z.infer<typeof rpcResponseSchema>,\n \"result\"\n> & {\n result: Result;\n};\n\nexport type RPCMessage = RPCRequest | RPCResponse;\n\n// RPC procedure\nexport type RPCProcedureSchema = { input?: z.ZodObject; output?: z.ZodObject };\nexport type RPCProcedure<Schema extends RPCProcedureSchema = RPCProcedureSchema> = {\n name: string;\n schema?: Schema;\n execute: (\n input: Schema[\"input\"] extends z.ZodObject ? z.infer<Schema[\"input\"]> : undefined,\n ) => MaybePromise<\n op.OperationResult<Schema[\"output\"] extends z.ZodObject ? z.infer<Schema[\"output\"]> : void>\n >;\n};\n","import type z from \"zod\";\nimport { canon, type SerializableValue } from \"@/shared/canon\";\nimport { type LifeError, obfuscateLifeError } from \"@/shared/error\";\nimport * as op from \"@/shared/operation\";\nimport { newId } from \"@/shared/prefixed-id\";\nimport type { MaybePromise, Todo } from \"@/shared/types\";\nimport type { TelemetryClient } from \"@/telemetry/clients/base\";\nimport type { TransportProviderClientBase } from \"./providers/base\";\nimport {\n type RPCProcedure,\n type RPCProcedureSchema,\n type RPCRequest,\n rpcMessageSchema,\n} from \"./types\";\n\n// Runtime-agnostic logic between transport classes\nexport abstract class TransportClientBase {\n readonly #provider: TransportProviderClientBase<z.ZodObject>;\n readonly #obfuscateErrors: boolean;\n readonly #procedures = new Map<string, RPCProcedure>();\n readonly #resolveResults = new Map<\n string,\n (value?: op.OperationResult<SerializableValue>) => MaybePromise<void>\n >();\n readonly #telemetry: TelemetryClient | null = null;\n #rpcUnsubscribe?: () => void;\n\n constructor({\n provider,\n telemetry,\n obfuscateErrors = false,\n }: {\n provider: TransportProviderClientBase<z.ZodObject>;\n obfuscateErrors?: boolean;\n telemetry?: TelemetryClient | null;\n }) {\n this.#provider = provider;\n this.#obfuscateErrors = obfuscateErrors;\n this.#telemetry = telemetry ?? null;\n }\n\n async sendText(topic: string, text: string) {\n try {\n const [errWriter, writer] = await this.streamText(topic);\n if (errWriter) return op.failure(errWriter);\n await writer.write(text);\n await writer.close();\n return op.success();\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n receiveText(\n topic: string,\n callback: (text: string, participantId: string) => MaybePromise<void>,\n onError?: (error: LifeError) => void,\n ) {\n try {\n const [errReceive, unsubscribe] = this.receiveStreamText(\n topic,\n async (iterator: AsyncIterable<string>, participantId: string) => {\n const [err] = await op.attempt(async () => {\n let result = \"\";\n for await (const chunk of iterator) result += chunk;\n await callback(result, participantId);\n });\n if (err) onError?.(err);\n },\n onError,\n );\n if (errReceive) return op.failure(errReceive);\n return op.success(unsubscribe);\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n async sendObject(topic: string, obj: SerializableValue) {\n try {\n const [errCanon, serialized] = canon.stringify(obj);\n if (errCanon) return op.failure(errCanon);\n const [errSend] = await this.sendText(topic, serialized);\n if (errSend) return op.failure(errSend);\n return op.success();\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n receiveObject(\n topic: string,\n callback: (obj: unknown, participantId: string) => MaybePromise<void>,\n onError?: (error: LifeError) => void,\n ) {\n try {\n const [err, unsubscribe] = this.receiveText(\n topic,\n async (text, participantId) => {\n try {\n // Parse the text into an object\n const [errParse, deserialized] = canon.parse(text);\n if (errParse) return onError?.(errParse);\n\n // Call the callback\n const [errCallback] = await op.attempt(\n async () => await callback(deserialized, participantId),\n );\n if (errCallback) return onError?.(errCallback);\n } catch (error) {\n onError?.(error as LifeError);\n }\n },\n onError,\n );\n\n // Return the unsubscribe function\n if (err) return op.failure(err);\n return op.success(unsubscribe);\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n /**\n * Register a remote procedure.\n * @param procedure - The procedure to register\n */\n register<Schema extends RPCProcedureSchema>(procedure: RPCProcedure<Schema>) {\n this.#procedures.set(procedure.name, procedure);\n }\n\n /**\n * Call a remote procedure.\n * @param name - The name of the procedure to call\n * @param inputs - The parameters to pass to the procedure\n * @returns A promise that resolves to the response from the procedure\n */\n async call<Schema extends RPCProcedureSchema>({\n name,\n schema,\n input,\n timeoutMs = 10_000,\n }: {\n name: string;\n schema?: Schema;\n timeoutMs?: number;\n } & (Schema[\"input\"] extends z.ZodObject\n ? { input: z.infer<Schema[\"input\"]> }\n : { input?: never })): Promise<\n op.OperationResult<Schema[\"output\"] extends z.ZodObject ? z.infer<Schema[\"output\"]> : void>\n > {\n const id = newId(\"rpc\");\n\n try {\n // Validate input data\n let parsedInput: SerializableValue | undefined;\n if (schema?.input) {\n const { error: errInput, data: parsedInput_ } = schema.input.safeParse(input);\n if (errInput) return op.failure({ code: \"Validation\", cause: errInput });\n parsedInput = parsedInput_ as SerializableValue;\n }\n\n // Prepare a resolver and timeout promises\n const resultPromise = new Promise<\n op.OperationResult<Schema[\"output\"] extends z.ZodObject ? z.infer<Schema[\"output\"]> : never>\n >((resolve) => {\n this.#resolveResults.set(id, (res) => {\n resolve(\n res as unknown as op.OperationResult<\n Schema[\"output\"] extends z.ZodObject ? z.infer<Schema[\"output\"]> : never\n >,\n );\n });\n });\n\n const timeoutPromise = new Promise<op.OperationResult<SerializableValue>>((resolve) => {\n setTimeout(() => {\n resolve(\n op.failure({\n code: \"Timeout\",\n message: `RPC call to procedure '${name}' timed out after ${timeoutMs}ms.`,\n }),\n );\n }, timeoutMs);\n });\n\n // Call the procedure\n const [errCall] = await this.sendObject(\"rpc\", {\n type: \"request\",\n id,\n name,\n ...(parsedInput ? { input: parsedInput } : {}),\n } satisfies RPCRequest);\n if (errCall) return op.failure(errCall);\n\n // Capture whichever resolves first between the timeout and result\n const [err, data] = await Promise.race([resultPromise, timeoutPromise]);\n\n // Return the error if any\n if (err) return op.failure(err);\n\n // Validate the output data\n if (schema?.output) {\n const { error: errOutput, data: parsedOutput } = schema.output.safeParse(data);\n if (errOutput) return op.failure({ code: \"Validation\", cause: errOutput });\n return op.success(parsedOutput) as Todo;\n }\n return op.success() as Todo;\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n } finally {\n this.#resolveResults.delete(id);\n }\n }\n\n // Initialize RPC\n async #onRPCMessage(rawMessage: unknown) {\n try {\n // Validate the incoming RPC message shape\n const { data: parsedMessage, error: messageError } = rpcMessageSchema.safeParse(rawMessage);\n if (messageError)\n return this.#telemetry?.log.error({\n message: \"Invalid RPC message.\",\n error: messageError,\n });\n\n // Handle responses\n if (parsedMessage.type === \"response\") {\n const resolveResult = this.#resolveResults.get(parsedMessage.id);\n if (resolveResult) await resolveResult(parsedMessage.result);\n return;\n }\n\n // Handle requests\n // - Helper to send a response\n // biome-ignore lint/style/useConst: biome bug\n let procedure: RPCProcedure | undefined;\n const requestMessage = parsedMessage as RPCRequest;\n const sendResult = async (result: op.OperationResult<SerializableValue>) => {\n let [error, data] = result;\n\n // Log error\n if (error)\n this.#telemetry?.log.error({\n message: `Failed to respond to RPC request for handler '${requestMessage.name}'.`,\n error,\n });\n\n // Obfuscate the error if required\n if (this.#obfuscateErrors && error) error = obfuscateLifeError(error);\n\n // Send the response\n const [errSend] = await this.sendObject(\"rpc\", {\n type: \"response\",\n id: requestMessage.id,\n result: error ? op.failure(error) : op.success(data),\n });\n if (errSend)\n return this.#telemetry?.log.error({\n message: \"Failed to send RPC response.\",\n error: errSend,\n });\n };\n\n // - Get the local procedure function, error if not found\n procedure = this.#procedures.get(parsedMessage.name);\n if (!procedure)\n return await sendResult(\n op.failure({\n code: \"NotFound\",\n message: `Procedure not found: '${parsedMessage.name}'.`,\n }),\n );\n\n // - Parse the procedure's input, error if invalid\n const { data: input, error: inputError } = procedure.schema?.input\n ? procedure.schema.input.safeParse(parsedMessage.input)\n : { data: undefined, error: null };\n if (inputError)\n return await sendResult(\n op.failure({\n code: \"Validation\",\n message: `Invalid input parameters for procedure '${parsedMessage.name}'.`,\n cause: inputError,\n }),\n );\n\n // - Execute the procedure\n const [err, rawOutput] = await procedure.execute(input as never);\n if (err) return await sendResult(op.failure(err));\n\n // - Validate the output\n const { data: output, error: outputError } = procedure.schema?.output\n ? await procedure.schema.output.safeParseAsync(rawOutput)\n : { data: rawOutput, error: null };\n if (outputError) {\n return await sendResult(\n op.failure({\n code: \"Validation\",\n message: `Invalid output from procedure '${parsedMessage.name}'.`,\n cause: outputError,\n }),\n );\n }\n\n // - Send the output result\n return await sendResult(op.success(output as SerializableValue));\n } catch (error) {\n this.#telemetry?.log.error({ message: \"Unknown error while handling RPC message.\", error });\n }\n }\n\n #startRPC() {\n try {\n const [errReceive, unsubscribe] = this.receiveObject(\"rpc\", this.#onRPCMessage.bind(this));\n if (errReceive) return op.failure(errReceive);\n this.#rpcUnsubscribe = unsubscribe;\n return op.success();\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n #stopRPC() {\n try {\n this.#rpcUnsubscribe?.();\n this.#resolveResults.clear();\n this.#procedures.clear();\n return op.success();\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n on: TransportProviderClientBase<z.ZodObject>[\"on\"] = (...args) => this.#provider.on(...args);\n\n joinRoom: TransportProviderClientBase<z.ZodObject>[\"joinRoom\"] = async (...args) => {\n const [errJoin] = await this.#provider.joinRoom(...args);\n if (errJoin) return op.failure(errJoin);\n const [errStart] = this.#startRPC();\n if (errStart) return op.failure(errStart);\n return op.success();\n };\n\n leaveRoom: TransportProviderClientBase<z.ZodObject>[\"leaveRoom\"] = async (...args) => {\n const [errLeave] = await this.#provider.leaveRoom(...args);\n if (errLeave) return op.failure(errLeave);\n const [errStop] = this.#stopRPC();\n if (errStop) return op.failure(errStop);\n return op.success();\n };\n\n streamText: TransportProviderClientBase<z.ZodObject>[\"streamText\"] = (...args) =>\n this.#provider.streamText(...args);\n\n receiveStreamText: TransportProviderClientBase<z.ZodObject>[\"receiveStreamText\"] = (...args) =>\n this.#provider.receiveStreamText(...args);\n\n enableMicrophone: TransportProviderClientBase<z.ZodObject>[\"enableMicrophone\"] = (...args) =>\n this.#provider.enableMicrophone(...args);\n\n playAudio: TransportProviderClientBase<z.ZodObject>[\"playAudio\"] = (...args) =>\n this.#provider.playAudio(...args);\n\n streamAudioChunk: TransportProviderClientBase<z.ZodObject>[\"streamAudioChunk\"] = (...args) =>\n this.#provider.streamAudioChunk(...args);\n}\n"],"mappings":"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","names":[]}