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
JavaScript
"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