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.

327 lines (301 loc) 13.2 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _chunk22H3U7VVjs = require('./chunk-22H3U7VV.js'); var _chunk6PEHRAEPjs = require('./chunk-6PEHRAEP.js'); // shared/deep-clone.ts function deepClone(x) { if (typeof x !== "object") return x; var i = 0, k, list, tmp, str = Object.prototype.toString.call(x); if (str === "[object Object]") { tmp = Object.create(x.__proto__ || null); } else if (str === "[object Array]") { tmp = Array(x.length); } else if (str === "[object Set]") { tmp = /* @__PURE__ */ new Set(); x.forEach(function(val) { tmp.add(deepClone(val)); }); } else if (str === "[object Map]") { tmp = /* @__PURE__ */ new Map(); x.forEach(function(val, key) { tmp.set(deepClone(key), deepClone(val)); }); } else if (str === "[object Date]") { tmp = /* @__PURE__ */ new Date(+x); } else if (str === "[object RegExp]") { tmp = new RegExp(x.source, x.flags); } else if (str === "[object DataView]") { tmp = new x.constructor(deepClone(x.buffer)); } else if (str === "[object ArrayBuffer]") { tmp = x.slice(0); } else if (str.slice(-6) === "Array]") { tmp = new x.constructor(x); } if (tmp) { for (list = Object.getOwnPropertySymbols(x); i < list.length; i++) { set(tmp, list[i], Object.getOwnPropertyDescriptor(x, list[i])); } for (i = 0, list = Object.getOwnPropertyNames(x); i < list.length; i++) { if (Object.hasOwnProperty.call(tmp, k = list[i]) && tmp[k] === x[k]) continue; set(tmp, k, Object.getOwnPropertyDescriptor(x, k)); } } return tmp || x; } _chunk6PEHRAEPjs.__name.call(void 0, deepClone, "deepClone"); function set(obj, key, val) { if (typeof val.value === "object") val.value = deepClone(val.value); if (!val.enumerable || val.get || val.set || !val.configurable || !val.writable || key === "__proto__") { Object.defineProperty(obj, key, val); } else obj[key] = val.value; } _chunk6PEHRAEPjs.__name.call(void 0, set, "set"); // telemetry/helpers/zod.ts var _zod = require('zod'); var _zod2 = _interopRequireDefault(_zod); var zodObjectWithTelemetry = /* @__PURE__ */ _chunk6PEHRAEPjs.__name.call(void 0, ({ schema, toTelemetry }) => ({ schema, toTelemetry: /* @__PURE__ */ _chunk6PEHRAEPjs.__name.call(void 0, (data) => toTelemetry ? toTelemetry(data) : data, "toTelemetry") }), "zodObjectWithTelemetry"); var zodUnionWithTelemetry = /* @__PURE__ */ _chunk6PEHRAEPjs.__name.call(void 0, (discriminator, objects) => ({ schema: _zod2.default.discriminatedUnion(discriminator, objects.map((s) => s.schema)), toTelemetry: /* @__PURE__ */ _chunk6PEHRAEPjs.__name.call(void 0, (data) => { const object = objects.find((s) => { const discriminatorSchema = s.schema.shape[discriminator]; if (discriminatorSchema instanceof _zod2.default.ZodLiteral) return discriminatorSchema.def.values[0] === data[discriminator]; return false; }); return _optionalChain([object, 'optionalAccess', _ => _.toTelemetry]) ? object.toTelemetry(data) : data; }, "toTelemetry") }), "zodUnionWithTelemetry"); // agent/client/config.ts // transport/providers/livekit/browser.ts var _livekitclient = require('livekit-client'); // transport/providers/base.ts var TransportProviderClientBase = (_class = class { static { _chunk6PEHRAEPjs.__name.call(void 0, this, "TransportProviderClientBase"); } __init() {this.listeners = {}} constructor(configSchema, config) {;_class.prototype.__init.call(this); this.config = configSchema.parse({ ...config }); } on(type, callback) { try { if (!this.listeners[type]) this.listeners[type] = []; this.listeners[type].push(callback); return _chunk22H3U7VVjs.success.call(void 0, () => { this.listeners[type] = _optionalChain([this, 'access', _2 => _2.listeners, 'access', _3 => _3[type], 'optionalAccess', _4 => _4.filter, 'call', _5 => _5((listener) => listener !== callback)]); }); } catch (error) { return _chunk22H3U7VVjs.failure.call(void 0, { code: "Unknown", cause: error }); } } }, _class); // transport/providers/livekit/browser.ts var livekitBrowserConfig = zodObjectWithTelemetry({ schema: _zod2.default.object({ provider: _zod2.default.literal("livekit"), serverUrl: _zod2.default.url().prefault(_nullishCoalesce(_optionalChain([globalThis, 'access', _6 => _6.process, 'optionalAccess', _7 => _7.env, 'optionalAccess', _8 => _8.LIVEKIT_SERVER_URL]), () => ( "ws://localhost:7880"))) }), toTelemetry: /* @__PURE__ */ _chunk6PEHRAEPjs.__name.call(void 0, (config) => { config.isDevServer = Boolean(_optionalChain([config, 'access', _9 => _9.serverUrl, 'optionalAccess', _10 => _10.includes, 'call', _11 => _11("localhost")])); config.serverUrl = "redacted"; return config; }, "toTelemetry") }); var LiveKitBrowserClient = (_class2 = class extends TransportProviderClientBase { static { _chunk6PEHRAEPjs.__name.call(void 0, this, "LiveKitBrowserClient"); } __init2() {this.isConnected = false} __init3() {this.room = null} constructor(config) { super(livekitBrowserConfig.schema, config);_class2.prototype.__init2.call(this);_class2.prototype.__init3.call(this);; } ensureConnected(name, connector) { if (!(this.isConnected && _optionalChain([this, 'access', _12 => _12.room, 'optionalAccess', _13 => _13.localParticipant]))) return _chunk22H3U7VVjs.failure.call(void 0, { code: "Conflict", message: `Calling this code (${name}) requires a connected room. Call joinRoom() first.` }); return _chunk22H3U7VVjs.success.call(void 0, connector ); } #initializeListeners(room) { room.on(_livekitclient.RoomEvent.TrackSubscribed, (track) => { if (track.kind !== "audio") return; let _isUnsubscribed = false; const unsubscribeHandler = /* @__PURE__ */ _chunk6PEHRAEPjs.__name.call(void 0, (unsubscribedTrack) => { if (unsubscribedTrack.sid === track.sid) _isUnsubscribed = true; room.off(_livekitclient.RoomEvent.TrackUnsubscribed, unsubscribeHandler); }, "unsubscribeHandler"); room.on(_livekitclient.RoomEvent.TrackUnsubscribed, unsubscribeHandler); }); } async joinRoom(roomName, token) { try { if (roomName === _optionalChain([this, 'access', _14 => _14.room, 'optionalAccess', _15 => _15.name])) return _chunk22H3U7VVjs.success.call(void 0, ); if (this.isConnected) { const [errLeave] = await this.leaveRoom(); if (errLeave) return _chunk22H3U7VVjs.failure.call(void 0, errLeave); } this.room = new (0, _livekitclient.Room)({ adaptiveStream: true, dynacast: true, disconnectOnPageLeave: true, publishDefaults: { dtx: true, red: true } }); this.room.on(_livekitclient.RoomEvent.TrackSubscribed, (track) => { const element = track.attach(); document.body.appendChild(element); }); this.#initializeListeners(this.room); await this.room.connect(this.config.serverUrl, token, { autoSubscribe: true }); this.isConnected = true; return _chunk22H3U7VVjs.success.call(void 0, ); } catch (error) { return _chunk22H3U7VVjs.failure.call(void 0, { code: "Unknown", cause: error }); } } async leaveRoom() { try { const [errEnsure, connector] = this.ensureConnected("leaveRoom", this); if (errEnsure) return _chunk22H3U7VVjs.failure.call(void 0, errEnsure); await connector.room.disconnect(); this.isConnected = false; return _chunk22H3U7VVjs.success.call(void 0, ); } catch (error) { return _chunk22H3U7VVjs.failure.call(void 0, { code: "Unknown", cause: error }); } } async streamText(topic) { try { const [errEnsure, connector] = this.ensureConnected("streamText", this); if (errEnsure) return _chunk22H3U7VVjs.failure.call(void 0, errEnsure); return _chunk22H3U7VVjs.success.call(void 0, await connector.room.localParticipant.streamText({ topic })); } catch (error) { return _chunk22H3U7VVjs.failure.call(void 0, { code: "Unknown", cause: error }); } } receiveStreamText(topic, callback, onError) { try { const [errEnsure, connector] = this.ensureConnected("receiveText", this); if (errEnsure) return _chunk22H3U7VVjs.failure.call(void 0, errEnsure); connector.room.registerTextStreamHandler(topic, async (iterator, participantInfo) => { const [err] = await _chunk22H3U7VVjs.attempt.call(void 0, async () => { await callback(iterator, participantInfo.identity); }); if (err) _optionalChain([onError, 'optionalCall', _16 => _16(err)]); }); return _chunk22H3U7VVjs.success.call(void 0, () => { connector.room.unregisterTextStreamHandler(topic); }); } catch (error) { return _chunk22H3U7VVjs.failure.call(void 0, { code: "Unknown", cause: error }); } } async enableMicrophone() { try { const [errEnsure, connector] = this.ensureConnected("enableMicrophone", this); if (errEnsure) return _chunk22H3U7VVjs.failure.call(void 0, errEnsure); await connector.room.localParticipant.setMicrophoneEnabled(true, { echoCancellation: true, noiseSuppression: false, voiceIsolation: false }); return _chunk22H3U7VVjs.success.call(void 0, ); } catch (error) { return _chunk22H3U7VVjs.failure.call(void 0, { code: "Unknown", cause: error }); } } async playAudio() { try { const [errEnsure, connector] = this.ensureConnected("playAudio", this); if (errEnsure) return _chunk22H3U7VVjs.failure.call(void 0, errEnsure); await connector.room.startAudio(); return _chunk22H3U7VVjs.success.call(void 0, ); } catch (error) { return _chunk22H3U7VVjs.failure.call(void 0, { code: "Unknown", cause: error }); } } async streamAudioChunk(chunk) { try { await chunk; throw new Error( "streamAudioChunk() is not available for browser client, use enableMicrophone() instead." ); } catch (error) { return _chunk22H3U7VVjs.failure.call(void 0, { code: "Unknown", cause: error }); } } }, _class2); // transport/config/browser.ts var transportBrowserConfig = zodUnionWithTelemetry("provider", [livekitBrowserConfig]); // agent/client/config.ts var agentClientConfig = zodObjectWithTelemetry({ schema: _zod.z.object({ transport: transportBrowserConfig.schema.prefault({ provider: "livekit" }), experimental: _zod.z.object().prefault({}) }), toTelemetry: /* @__PURE__ */ _chunk6PEHRAEPjs.__name.call(void 0, (config) => { config.transport = transportBrowserConfig.toTelemetry(config.transport); return config; }, "toTelemetry") }); // shared/async-queue.ts var AsyncQueue = class { static { _chunk6PEHRAEPjs.__name.call(void 0, this, "AsyncQueue"); } #buf = []; #wakeUp; #closed = false; #totalLength = 0; push(v) { if (this.#closed) return; this.#buf.push(v); this.#totalLength++; _optionalChain([this, 'access', _17 => _17.#wakeUp, 'optionalCall', _18 => _18()]); } pushFirst(v) { if (this.#closed) return; this.#buf.unshift(v); this.#totalLength++; _optionalChain([this, 'access', _19 => _19.#wakeUp, 'optionalCall', _20 => _20()]); } stop() { if (this.#closed) return; this.#closed = true; _optionalChain([this, 'access', _21 => _21.#wakeUp, 'optionalCall', _22 => _22()]); } some(predicate) { return this.#buf.some(predicate); } length() { return this.#buf.length; } totalLength() { return this.#totalLength; } async next() { while (true) { const value = this.#buf.shift(); if (value !== void 0) return { value, done: false }; if (this.#closed) return { value: void 0, done: true }; await new Promise((res) => this.#wakeUp = res); this.#wakeUp = void 0; } } [Symbol.asyncIterator]() { return this; } }; exports.deepClone = deepClone; exports.AsyncQueue = AsyncQueue; exports.zodObjectWithTelemetry = zodObjectWithTelemetry; exports.zodUnionWithTelemetry = zodUnionWithTelemetry; exports.TransportProviderClientBase = TransportProviderClientBase; exports.LiveKitBrowserClient = LiveKitBrowserClient; exports.agentClientConfig = agentClientConfig; //# sourceMappingURL=chunk-BFC2WP6Q.js.map