conversationalist 0.0.8 → 0.0.10
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/README.md +80 -42
- package/dist/guards.d.ts +13 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/history.d.ts +17 -7
- package/dist/history.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1603 -23
- package/dist/index.js.map +7 -5
- package/dist/markdown/index.d.ts +2 -2
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +1583 -47
- package/dist/markdown/index.js.map +6 -5
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +4 -4
- package/dist/schemas/index.js.map +3 -3
- package/dist/schemas.d.ts +2 -2
- package/dist/schemas.d.ts.map +1 -1
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -91,7 +91,7 @@ var messageInputSchema = z.object({
|
|
|
91
91
|
tokenUsage: tokenUsageSchema.optional(),
|
|
92
92
|
goalCompleted: z.boolean().optional()
|
|
93
93
|
});
|
|
94
|
-
var
|
|
94
|
+
var messageSchema = z.object({
|
|
95
95
|
id: z.string(),
|
|
96
96
|
role: messageRoleSchema,
|
|
97
97
|
content: z.union([z.string(), z.array(multiModalContentSchema)]),
|
|
@@ -116,7 +116,7 @@ var conversationShape = {
|
|
|
116
116
|
status: conversationStatusSchema,
|
|
117
117
|
metadata: z.record(z.string(), jsonValueSchema),
|
|
118
118
|
ids: z.array(z.string()),
|
|
119
|
-
messages: z.record(z.string(),
|
|
119
|
+
messages: z.record(z.string(), messageSchema),
|
|
120
120
|
createdAt: z.string(),
|
|
121
121
|
updatedAt: z.string()
|
|
122
122
|
};
|
|
@@ -775,6 +775,40 @@ function toChatMessages(conversation) {
|
|
|
775
775
|
}
|
|
776
776
|
return result;
|
|
777
777
|
}
|
|
778
|
+
// src/guards.ts
|
|
779
|
+
function isSchema(schema, value) {
|
|
780
|
+
return schema.safeParse(value).success;
|
|
781
|
+
}
|
|
782
|
+
function isConversation(value) {
|
|
783
|
+
return isSchema(conversationSchema, value);
|
|
784
|
+
}
|
|
785
|
+
function isConversationStatus(value) {
|
|
786
|
+
return isSchema(conversationStatusSchema, value);
|
|
787
|
+
}
|
|
788
|
+
function isJSONValue(value) {
|
|
789
|
+
return isSchema(jsonValueSchema, value);
|
|
790
|
+
}
|
|
791
|
+
function isMessage(value) {
|
|
792
|
+
return isSchema(messageSchema, value);
|
|
793
|
+
}
|
|
794
|
+
function isMessageInput(value) {
|
|
795
|
+
return isSchema(messageInputSchema, value);
|
|
796
|
+
}
|
|
797
|
+
function isMessageRole(value) {
|
|
798
|
+
return isSchema(messageRoleSchema, value);
|
|
799
|
+
}
|
|
800
|
+
function isMultiModalContent(value) {
|
|
801
|
+
return isSchema(multiModalContentSchema, value);
|
|
802
|
+
}
|
|
803
|
+
function isTokenUsage(value) {
|
|
804
|
+
return isSchema(tokenUsageSchema, value);
|
|
805
|
+
}
|
|
806
|
+
function isToolCall(value) {
|
|
807
|
+
return isSchema(toolCallSchema, value);
|
|
808
|
+
}
|
|
809
|
+
function isToolResult(value) {
|
|
810
|
+
return isSchema(toolResultSchema, value);
|
|
811
|
+
}
|
|
778
812
|
// src/context.ts
|
|
779
813
|
var cloneMessageWithPosition = (message, position, content) => {
|
|
780
814
|
const baseMessage = {
|
|
@@ -1109,19 +1143,1525 @@ function withConversation(conversation, fn) {
|
|
|
1109
1143
|
function pipeConversation(conversation, ...fns) {
|
|
1110
1144
|
return fns.reduce((current, fn) => fn(current), conversation);
|
|
1111
1145
|
}
|
|
1112
|
-
//
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1146
|
+
// node_modules/event-emission/dist/index.js
|
|
1147
|
+
var SymbolObservable = typeof Symbol === "function" && Symbol.observable || Symbol.for("@@observable");
|
|
1148
|
+
if (typeof Symbol === "function") {
|
|
1149
|
+
Symbol.observable = SymbolObservable;
|
|
1150
|
+
}
|
|
1151
|
+
function getMethod(obj, key) {
|
|
1152
|
+
if (obj === null || obj === undefined)
|
|
1153
|
+
return;
|
|
1154
|
+
const value = obj[key];
|
|
1155
|
+
if (value == null)
|
|
1156
|
+
return;
|
|
1157
|
+
if (typeof value !== "function") {
|
|
1158
|
+
throw new TypeError(value + " is not a function");
|
|
1116
1159
|
}
|
|
1160
|
+
return value;
|
|
1117
1161
|
}
|
|
1162
|
+
function hostReportError(e) {
|
|
1163
|
+
if (typeof queueMicrotask === "function") {
|
|
1164
|
+
queueMicrotask(() => {
|
|
1165
|
+
throw e;
|
|
1166
|
+
});
|
|
1167
|
+
} else {
|
|
1168
|
+
setTimeout(() => {
|
|
1169
|
+
throw e;
|
|
1170
|
+
});
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
function SubscriptionObserverImpl(subscription) {
|
|
1174
|
+
this._subscription = subscription;
|
|
1175
|
+
}
|
|
1176
|
+
SubscriptionObserverImpl.prototype = Object.create(Object.prototype);
|
|
1177
|
+
Object.defineProperties(SubscriptionObserverImpl.prototype, {
|
|
1178
|
+
constructor: { value: Object, configurable: true, writable: true },
|
|
1179
|
+
closed: {
|
|
1180
|
+
get() {
|
|
1181
|
+
return this._subscription._closed;
|
|
1182
|
+
},
|
|
1183
|
+
configurable: true
|
|
1184
|
+
},
|
|
1185
|
+
next: {
|
|
1186
|
+
value: function next(value) {
|
|
1187
|
+
const subscription = this._subscription;
|
|
1188
|
+
if (subscription._closed)
|
|
1189
|
+
return;
|
|
1190
|
+
const observer = subscription._observer;
|
|
1191
|
+
try {
|
|
1192
|
+
const m = getMethod(observer, "next");
|
|
1193
|
+
if (!m)
|
|
1194
|
+
return;
|
|
1195
|
+
return m.call(observer, value);
|
|
1196
|
+
} catch (e) {
|
|
1197
|
+
try {
|
|
1198
|
+
this.error(e);
|
|
1199
|
+
} catch (err) {
|
|
1200
|
+
hostReportError(err);
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
},
|
|
1204
|
+
configurable: true,
|
|
1205
|
+
writable: true
|
|
1206
|
+
},
|
|
1207
|
+
error: {
|
|
1208
|
+
value: function error(errorValue) {
|
|
1209
|
+
const subscription = this._subscription;
|
|
1210
|
+
if (subscription._closed)
|
|
1211
|
+
throw errorValue;
|
|
1212
|
+
subscription._closed = true;
|
|
1213
|
+
const observer = subscription._observer;
|
|
1214
|
+
try {
|
|
1215
|
+
const m = getMethod(observer, "error");
|
|
1216
|
+
if (m) {
|
|
1217
|
+
return m.call(observer, errorValue);
|
|
1218
|
+
}
|
|
1219
|
+
throw errorValue;
|
|
1220
|
+
} finally {
|
|
1221
|
+
subscription._cleanup();
|
|
1222
|
+
}
|
|
1223
|
+
},
|
|
1224
|
+
configurable: true,
|
|
1225
|
+
writable: true
|
|
1226
|
+
},
|
|
1227
|
+
complete: {
|
|
1228
|
+
value: function complete(value) {
|
|
1229
|
+
const subscription = this._subscription;
|
|
1230
|
+
if (subscription._closed)
|
|
1231
|
+
return;
|
|
1232
|
+
subscription._closed = true;
|
|
1233
|
+
const observer = subscription._observer;
|
|
1234
|
+
try {
|
|
1235
|
+
const m = getMethod(observer, "complete");
|
|
1236
|
+
if (m) {
|
|
1237
|
+
return m.call(observer, value);
|
|
1238
|
+
}
|
|
1239
|
+
return;
|
|
1240
|
+
} finally {
|
|
1241
|
+
subscription._cleanup();
|
|
1242
|
+
}
|
|
1243
|
+
},
|
|
1244
|
+
configurable: true,
|
|
1245
|
+
writable: true
|
|
1246
|
+
}
|
|
1247
|
+
});
|
|
1248
|
+
Object.defineProperty(SubscriptionObserverImpl.prototype.next, "length", { value: 1 });
|
|
1249
|
+
Object.defineProperty(SubscriptionObserverImpl.prototype.error, "length", { value: 1 });
|
|
1250
|
+
Object.defineProperty(SubscriptionObserverImpl.prototype.complete, "length", {
|
|
1251
|
+
value: 1
|
|
1252
|
+
});
|
|
1253
|
+
function Subscription(observer, subscriber) {
|
|
1254
|
+
this._observer = observer;
|
|
1255
|
+
this._cleanupFn = undefined;
|
|
1256
|
+
this._closed = false;
|
|
1257
|
+
const subscriptionObserver = new SubscriptionObserverImpl(this);
|
|
1258
|
+
try {
|
|
1259
|
+
const start = getMethod(observer, "start");
|
|
1260
|
+
if (start) {
|
|
1261
|
+
start.call(observer, this);
|
|
1262
|
+
}
|
|
1263
|
+
} catch (e) {
|
|
1264
|
+
hostReportError(e);
|
|
1265
|
+
}
|
|
1266
|
+
if (this._closed)
|
|
1267
|
+
return;
|
|
1268
|
+
try {
|
|
1269
|
+
const cleanup = subscriber(subscriptionObserver);
|
|
1270
|
+
if (cleanup != null) {
|
|
1271
|
+
if (typeof cleanup !== "function" && typeof cleanup.unsubscribe !== "function") {
|
|
1272
|
+
throw new TypeError(cleanup + " is not a function or a subscription");
|
|
1273
|
+
}
|
|
1274
|
+
this._cleanupFn = cleanup;
|
|
1275
|
+
if (this._closed) {
|
|
1276
|
+
this._cleanup();
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
} catch (e) {
|
|
1280
|
+
subscriptionObserver.error(e);
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
Subscription.prototype = Object.create(Object.prototype);
|
|
1284
|
+
Object.defineProperties(Subscription.prototype, {
|
|
1285
|
+
constructor: { value: Object, configurable: true, writable: true },
|
|
1286
|
+
closed: {
|
|
1287
|
+
get() {
|
|
1288
|
+
return this._closed;
|
|
1289
|
+
},
|
|
1290
|
+
configurable: true
|
|
1291
|
+
},
|
|
1292
|
+
unsubscribe: {
|
|
1293
|
+
value: function unsubscribe() {
|
|
1294
|
+
if (this._closed)
|
|
1295
|
+
return;
|
|
1296
|
+
this._closed = true;
|
|
1297
|
+
this._cleanup();
|
|
1298
|
+
},
|
|
1299
|
+
configurable: true,
|
|
1300
|
+
writable: true
|
|
1301
|
+
},
|
|
1302
|
+
_cleanup: {
|
|
1303
|
+
value: function _cleanup() {
|
|
1304
|
+
const cleanup = this._cleanupFn;
|
|
1305
|
+
if (!cleanup)
|
|
1306
|
+
return;
|
|
1307
|
+
this._cleanupFn = undefined;
|
|
1308
|
+
try {
|
|
1309
|
+
if (typeof cleanup === "function") {
|
|
1310
|
+
cleanup();
|
|
1311
|
+
} else if (cleanup && typeof cleanup.unsubscribe === "function") {
|
|
1312
|
+
cleanup.unsubscribe();
|
|
1313
|
+
}
|
|
1314
|
+
} catch (e) {
|
|
1315
|
+
hostReportError(e);
|
|
1316
|
+
}
|
|
1317
|
+
},
|
|
1318
|
+
configurable: true,
|
|
1319
|
+
writable: true
|
|
1320
|
+
}
|
|
1321
|
+
});
|
|
1118
1322
|
|
|
1323
|
+
class Observable {
|
|
1324
|
+
_subscriber;
|
|
1325
|
+
constructor(subscriber) {
|
|
1326
|
+
if (typeof subscriber !== "function") {
|
|
1327
|
+
throw new TypeError("Observable initializer must be a function");
|
|
1328
|
+
}
|
|
1329
|
+
this._subscriber = subscriber;
|
|
1330
|
+
}
|
|
1331
|
+
subscribe(observerOrNext, error2, complete2) {
|
|
1332
|
+
let observer;
|
|
1333
|
+
if (typeof observerOrNext === "function") {
|
|
1334
|
+
observer = {
|
|
1335
|
+
next: observerOrNext,
|
|
1336
|
+
error: error2,
|
|
1337
|
+
complete: complete2
|
|
1338
|
+
};
|
|
1339
|
+
} else if (typeof observerOrNext !== "object" || observerOrNext === null) {
|
|
1340
|
+
throw new TypeError(observerOrNext + " is not an object");
|
|
1341
|
+
} else {
|
|
1342
|
+
observer = observerOrNext;
|
|
1343
|
+
}
|
|
1344
|
+
return new Subscription(observer, this._subscriber);
|
|
1345
|
+
}
|
|
1346
|
+
[SymbolObservable]() {
|
|
1347
|
+
return this;
|
|
1348
|
+
}
|
|
1349
|
+
static of(...items) {
|
|
1350
|
+
const C = typeof this === "function" ? this : Observable;
|
|
1351
|
+
return new C((observer) => {
|
|
1352
|
+
for (let i = 0;i < items.length; ++i) {
|
|
1353
|
+
observer.next(items[i]);
|
|
1354
|
+
if (observer.closed)
|
|
1355
|
+
return;
|
|
1356
|
+
}
|
|
1357
|
+
observer.complete();
|
|
1358
|
+
});
|
|
1359
|
+
}
|
|
1360
|
+
static from(x) {
|
|
1361
|
+
const C = typeof this === "function" ? this : Observable;
|
|
1362
|
+
if (x == null)
|
|
1363
|
+
throw new TypeError(x + " is not an object");
|
|
1364
|
+
const method = x[SymbolObservable];
|
|
1365
|
+
if (method != null) {
|
|
1366
|
+
if (typeof method !== "function") {
|
|
1367
|
+
throw new TypeError(method + " is not a function");
|
|
1368
|
+
}
|
|
1369
|
+
const observable = method.call(x);
|
|
1370
|
+
if (Object(observable) !== observable) {
|
|
1371
|
+
throw new TypeError(observable + " is not an object");
|
|
1372
|
+
}
|
|
1373
|
+
if (observable.constructor === C) {
|
|
1374
|
+
return observable;
|
|
1375
|
+
}
|
|
1376
|
+
return new C((observer) => observable.subscribe(observer));
|
|
1377
|
+
}
|
|
1378
|
+
if (Symbol.iterator in x) {
|
|
1379
|
+
return new C((observer) => {
|
|
1380
|
+
for (const item of x) {
|
|
1381
|
+
observer.next(item);
|
|
1382
|
+
if (observer.closed)
|
|
1383
|
+
return;
|
|
1384
|
+
}
|
|
1385
|
+
observer.complete();
|
|
1386
|
+
});
|
|
1387
|
+
}
|
|
1388
|
+
throw new TypeError(x + " is not observable");
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
var PROXY_MARKER = Symbol.for("@lasercat/event-emission/proxy");
|
|
1392
|
+
var ORIGINAL_TARGET = Symbol.for("@lasercat/event-emission/original");
|
|
1393
|
+
var ARRAY_MUTATORS = new Set([
|
|
1394
|
+
"push",
|
|
1395
|
+
"pop",
|
|
1396
|
+
"shift",
|
|
1397
|
+
"unshift",
|
|
1398
|
+
"splice",
|
|
1399
|
+
"sort",
|
|
1400
|
+
"reverse",
|
|
1401
|
+
"fill",
|
|
1402
|
+
"copyWithin"
|
|
1403
|
+
]);
|
|
1404
|
+
function isProxyable(value) {
|
|
1405
|
+
return value !== null && typeof value === "object" && !isProxied(value) && !(value instanceof Date) && !(value instanceof RegExp) && !(value instanceof Map) && !(value instanceof Set) && !(value instanceof WeakMap) && !(value instanceof WeakSet) && !(value instanceof Promise) && !(value instanceof Error) && !(value instanceof ArrayBuffer) && !ArrayBuffer.isView(value);
|
|
1406
|
+
}
|
|
1407
|
+
function isProxied(value) {
|
|
1408
|
+
return typeof value === "object" && value !== null && value[PROXY_MARKER] === true;
|
|
1409
|
+
}
|
|
1410
|
+
function isArrayMutator(prop) {
|
|
1411
|
+
return typeof prop === "string" && ARRAY_MUTATORS.has(prop);
|
|
1412
|
+
}
|
|
1413
|
+
function cloneAlongPath(obj, path) {
|
|
1414
|
+
const isArray = Array.isArray(obj);
|
|
1415
|
+
const rootClone = isArray ? [...obj] : { ...obj };
|
|
1416
|
+
if (!path || isArray) {
|
|
1417
|
+
return rootClone;
|
|
1418
|
+
}
|
|
1419
|
+
const parts = path.split(".");
|
|
1420
|
+
const result = rootClone;
|
|
1421
|
+
let current = result;
|
|
1422
|
+
for (let i = 0;i < parts.length; i++) {
|
|
1423
|
+
const key = parts[i];
|
|
1424
|
+
const value = current[key];
|
|
1425
|
+
if (value !== null && typeof value === "object") {
|
|
1426
|
+
current[key] = Array.isArray(value) ? [...value] : { ...value };
|
|
1427
|
+
if (i < parts.length - 1) {
|
|
1428
|
+
current = current[key];
|
|
1429
|
+
}
|
|
1430
|
+
} else {
|
|
1431
|
+
break;
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
return result;
|
|
1435
|
+
}
|
|
1436
|
+
function cloneForComparison(obj, strategy, changedPath, deepClone) {
|
|
1437
|
+
if (obj === null || typeof obj !== "object")
|
|
1438
|
+
return obj;
|
|
1439
|
+
switch (strategy) {
|
|
1440
|
+
case "shallow":
|
|
1441
|
+
return Array.isArray(obj) ? [...obj] : { ...obj };
|
|
1442
|
+
case "deep":
|
|
1443
|
+
if (deepClone) {
|
|
1444
|
+
return deepClone(obj);
|
|
1445
|
+
}
|
|
1446
|
+
if (typeof structuredClone !== "function") {
|
|
1447
|
+
throw new Error("structuredClone is not available in this runtime; provide observe.deepClone, or use cloneStrategy 'path' or 'shallow'.");
|
|
1448
|
+
}
|
|
1449
|
+
return structuredClone(obj);
|
|
1450
|
+
case "path":
|
|
1451
|
+
return cloneAlongPath(obj, changedPath);
|
|
1452
|
+
default:
|
|
1453
|
+
return obj;
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
function computeArrayDiff(method, before, _after, args) {
|
|
1457
|
+
switch (method) {
|
|
1458
|
+
case "push":
|
|
1459
|
+
return { added: args };
|
|
1460
|
+
case "pop":
|
|
1461
|
+
return { removed: before.length > 0 ? [before[before.length - 1]] : [] };
|
|
1462
|
+
case "shift":
|
|
1463
|
+
return { removed: before.length > 0 ? [before[0]] : [] };
|
|
1464
|
+
case "unshift":
|
|
1465
|
+
return { added: args };
|
|
1466
|
+
case "splice": {
|
|
1467
|
+
const [start, deleteCount, ...items] = args;
|
|
1468
|
+
const actualStart = start < 0 ? Math.max(before.length + start, 0) : Math.min(start, before.length);
|
|
1469
|
+
const actualDeleteCount = Math.min(deleteCount ?? before.length - actualStart, before.length - actualStart);
|
|
1470
|
+
return {
|
|
1471
|
+
removed: before.slice(actualStart, actualStart + actualDeleteCount),
|
|
1472
|
+
added: items
|
|
1473
|
+
};
|
|
1474
|
+
}
|
|
1475
|
+
case "sort":
|
|
1476
|
+
case "reverse":
|
|
1477
|
+
case "fill":
|
|
1478
|
+
case "copyWithin":
|
|
1479
|
+
return {};
|
|
1480
|
+
default:
|
|
1481
|
+
return {};
|
|
1482
|
+
}
|
|
1483
|
+
}
|
|
1484
|
+
var proxyRegistry = new WeakMap;
|
|
1485
|
+
function getContextRegistry(target) {
|
|
1486
|
+
let contextMap = proxyRegistry.get(target);
|
|
1487
|
+
if (!contextMap) {
|
|
1488
|
+
contextMap = new WeakMap;
|
|
1489
|
+
proxyRegistry.set(target, contextMap);
|
|
1490
|
+
}
|
|
1491
|
+
return contextMap;
|
|
1492
|
+
}
|
|
1493
|
+
function createArrayMethodInterceptor(array, method, path, context) {
|
|
1494
|
+
const original = array[method];
|
|
1495
|
+
return function(...args) {
|
|
1496
|
+
const previousState = cloneForComparison(context.originalRoot, context.options.cloneStrategy, path, context.options.deepClone);
|
|
1497
|
+
const previousItems = [...array];
|
|
1498
|
+
const result = original.apply(this, args);
|
|
1499
|
+
const { added, removed } = computeArrayDiff(method, previousItems, array, args);
|
|
1500
|
+
const methodEventPath = path ? `update:${path}.${method}` : `update:${method}`;
|
|
1501
|
+
const arrayEventPath = path ? `update:${path}` : "update:";
|
|
1502
|
+
context.eventTarget.dispatchEvent({
|
|
1503
|
+
type: methodEventPath,
|
|
1504
|
+
detail: {
|
|
1505
|
+
method,
|
|
1506
|
+
args,
|
|
1507
|
+
result,
|
|
1508
|
+
added,
|
|
1509
|
+
removed,
|
|
1510
|
+
current: context.originalRoot,
|
|
1511
|
+
previous: previousState
|
|
1512
|
+
}
|
|
1513
|
+
});
|
|
1514
|
+
if (path) {
|
|
1515
|
+
context.eventTarget.dispatchEvent({
|
|
1516
|
+
type: arrayEventPath,
|
|
1517
|
+
detail: {
|
|
1518
|
+
value: array,
|
|
1519
|
+
current: context.originalRoot,
|
|
1520
|
+
previous: previousState
|
|
1521
|
+
}
|
|
1522
|
+
});
|
|
1523
|
+
}
|
|
1524
|
+
context.eventTarget.dispatchEvent({
|
|
1525
|
+
type: "update",
|
|
1526
|
+
detail: {
|
|
1527
|
+
current: context.originalRoot,
|
|
1528
|
+
previous: previousState
|
|
1529
|
+
}
|
|
1530
|
+
});
|
|
1531
|
+
return result;
|
|
1532
|
+
};
|
|
1533
|
+
}
|
|
1534
|
+
function createObservableProxyInternal(target, path, context) {
|
|
1535
|
+
const contextRegistry = getContextRegistry(target);
|
|
1536
|
+
const existing = contextRegistry.get(context);
|
|
1537
|
+
if (existing) {
|
|
1538
|
+
return existing.proxy;
|
|
1539
|
+
}
|
|
1540
|
+
const proxy = new Proxy(target, {
|
|
1541
|
+
get(obj, prop, receiver) {
|
|
1542
|
+
if (prop === PROXY_MARKER)
|
|
1543
|
+
return true;
|
|
1544
|
+
if (prop === ORIGINAL_TARGET)
|
|
1545
|
+
return obj;
|
|
1546
|
+
if (typeof prop === "symbol") {
|
|
1547
|
+
return Reflect.get(obj, prop, receiver);
|
|
1548
|
+
}
|
|
1549
|
+
const value = Reflect.get(obj, prop, receiver);
|
|
1550
|
+
if (Array.isArray(obj) && isArrayMutator(prop)) {
|
|
1551
|
+
return createArrayMethodInterceptor(obj, prop, path, context);
|
|
1552
|
+
}
|
|
1553
|
+
if (context.options.deep && isProxyable(value)) {
|
|
1554
|
+
const nestedPath = path ? `${path}.${prop}` : prop;
|
|
1555
|
+
return createObservableProxyInternal(value, nestedPath, context);
|
|
1556
|
+
}
|
|
1557
|
+
return value;
|
|
1558
|
+
},
|
|
1559
|
+
set(obj, prop, value, receiver) {
|
|
1560
|
+
if (typeof prop === "symbol") {
|
|
1561
|
+
return Reflect.set(obj, prop, value, receiver);
|
|
1562
|
+
}
|
|
1563
|
+
const oldValue = Reflect.get(obj, prop, receiver);
|
|
1564
|
+
if (Object.is(oldValue, value)) {
|
|
1565
|
+
return true;
|
|
1566
|
+
}
|
|
1567
|
+
const propPath = path ? `${path}.${prop}` : prop;
|
|
1568
|
+
const previousState = cloneForComparison(context.originalRoot, context.options.cloneStrategy, propPath, context.options.deepClone);
|
|
1569
|
+
const success = Reflect.set(obj, prop, value, receiver);
|
|
1570
|
+
if (success) {
|
|
1571
|
+
context.eventTarget.dispatchEvent({
|
|
1572
|
+
type: `update:${propPath}`,
|
|
1573
|
+
detail: {
|
|
1574
|
+
value,
|
|
1575
|
+
current: context.originalRoot,
|
|
1576
|
+
previous: previousState
|
|
1577
|
+
}
|
|
1578
|
+
});
|
|
1579
|
+
context.eventTarget.dispatchEvent({
|
|
1580
|
+
type: "update",
|
|
1581
|
+
detail: {
|
|
1582
|
+
current: context.originalRoot,
|
|
1583
|
+
previous: previousState
|
|
1584
|
+
}
|
|
1585
|
+
});
|
|
1586
|
+
}
|
|
1587
|
+
return success;
|
|
1588
|
+
},
|
|
1589
|
+
deleteProperty(obj, prop) {
|
|
1590
|
+
if (typeof prop === "symbol") {
|
|
1591
|
+
return Reflect.deleteProperty(obj, prop);
|
|
1592
|
+
}
|
|
1593
|
+
const propPath = path ? `${path}.${String(prop)}` : String(prop);
|
|
1594
|
+
const previousState = cloneForComparison(context.originalRoot, context.options.cloneStrategy, propPath, context.options.deepClone);
|
|
1595
|
+
const success = Reflect.deleteProperty(obj, prop);
|
|
1596
|
+
if (success) {
|
|
1597
|
+
context.eventTarget.dispatchEvent({
|
|
1598
|
+
type: `update:${propPath}`,
|
|
1599
|
+
detail: {
|
|
1600
|
+
value: undefined,
|
|
1601
|
+
current: context.originalRoot,
|
|
1602
|
+
previous: previousState
|
|
1603
|
+
}
|
|
1604
|
+
});
|
|
1605
|
+
context.eventTarget.dispatchEvent({
|
|
1606
|
+
type: "update",
|
|
1607
|
+
detail: {
|
|
1608
|
+
current: context.originalRoot,
|
|
1609
|
+
previous: previousState
|
|
1610
|
+
}
|
|
1611
|
+
});
|
|
1612
|
+
}
|
|
1613
|
+
return success;
|
|
1614
|
+
}
|
|
1615
|
+
});
|
|
1616
|
+
contextRegistry.set(context, {
|
|
1617
|
+
proxy,
|
|
1618
|
+
path
|
|
1619
|
+
});
|
|
1620
|
+
return proxy;
|
|
1621
|
+
}
|
|
1622
|
+
function isEventTarget(obj) {
|
|
1623
|
+
return typeof obj === "object" && obj !== null && typeof obj.addEventListener === "function" && typeof obj.removeEventListener === "function" && typeof obj.dispatchEvent === "function";
|
|
1624
|
+
}
|
|
1625
|
+
function setupEventForwarding(source, target) {
|
|
1626
|
+
const handlers = new Map;
|
|
1627
|
+
const sourceAddEventListener = source.addEventListener.bind(source);
|
|
1628
|
+
const sourceRemoveEventListener = source.removeEventListener.bind(source);
|
|
1629
|
+
const forwardHandler = (type) => (event) => {
|
|
1630
|
+
const detail = event.detail ?? event;
|
|
1631
|
+
target.dispatchEvent({
|
|
1632
|
+
type,
|
|
1633
|
+
detail
|
|
1634
|
+
});
|
|
1635
|
+
};
|
|
1636
|
+
const originalAddEventListener = target.addEventListener.bind(target);
|
|
1637
|
+
const wrappedAddEventListener = (type, listener, options) => {
|
|
1638
|
+
if (!handlers.has(type) && type !== "update" && !type.startsWith("update:")) {
|
|
1639
|
+
const handler = forwardHandler(type);
|
|
1640
|
+
handlers.set(type, handler);
|
|
1641
|
+
sourceAddEventListener(type, handler);
|
|
1642
|
+
}
|
|
1643
|
+
return originalAddEventListener(type, listener, options);
|
|
1644
|
+
};
|
|
1645
|
+
target.addEventListener = wrappedAddEventListener;
|
|
1646
|
+
return () => {
|
|
1647
|
+
target.addEventListener = originalAddEventListener;
|
|
1648
|
+
for (const [type, handler] of handlers) {
|
|
1649
|
+
sourceRemoveEventListener(type, handler);
|
|
1650
|
+
}
|
|
1651
|
+
handlers.clear();
|
|
1652
|
+
};
|
|
1653
|
+
}
|
|
1654
|
+
function createObservableProxy(target, eventTarget, options) {
|
|
1655
|
+
const resolvedOptions = {
|
|
1656
|
+
deep: options?.deep ?? true,
|
|
1657
|
+
cloneStrategy: options?.cloneStrategy ?? "path",
|
|
1658
|
+
deepClone: options?.deepClone
|
|
1659
|
+
};
|
|
1660
|
+
const context = {
|
|
1661
|
+
eventTarget,
|
|
1662
|
+
originalRoot: target,
|
|
1663
|
+
options: resolvedOptions
|
|
1664
|
+
};
|
|
1665
|
+
const proxy = createObservableProxyInternal(target, "", context);
|
|
1666
|
+
if (isEventTarget(target)) {
|
|
1667
|
+
const cleanupForwarding = setupEventForwarding(target, eventTarget);
|
|
1668
|
+
const maybeComplete = eventTarget.complete;
|
|
1669
|
+
if (typeof maybeComplete === "function") {
|
|
1670
|
+
const originalComplete = maybeComplete.bind(eventTarget);
|
|
1671
|
+
let cleaned = false;
|
|
1672
|
+
eventTarget.complete = () => {
|
|
1673
|
+
if (!cleaned) {
|
|
1674
|
+
cleaned = true;
|
|
1675
|
+
cleanupForwarding();
|
|
1676
|
+
}
|
|
1677
|
+
return originalComplete();
|
|
1678
|
+
};
|
|
1679
|
+
}
|
|
1680
|
+
}
|
|
1681
|
+
return proxy;
|
|
1682
|
+
}
|
|
1683
|
+
|
|
1684
|
+
class BufferOverflowError extends Error {
|
|
1685
|
+
constructor(eventType, bufferSize) {
|
|
1686
|
+
super(`Buffer overflow for event type "${eventType}" (max: ${bufferSize})`);
|
|
1687
|
+
this.name = "BufferOverflowError";
|
|
1688
|
+
}
|
|
1689
|
+
}
|
|
1690
|
+
function matchesWildcard(eventType, pattern) {
|
|
1691
|
+
if (pattern === "*")
|
|
1692
|
+
return true;
|
|
1693
|
+
return pattern.endsWith(":*") && eventType.startsWith(pattern.slice(0, -2) + ":");
|
|
1694
|
+
}
|
|
1695
|
+
var EVENT_STATE = Symbol("event-emission:event-state");
|
|
1696
|
+
function createEventTarget(targetOrOpts, opts) {
|
|
1697
|
+
if (opts?.observe === true && targetOrOpts && typeof targetOrOpts === "object") {
|
|
1698
|
+
const target = targetOrOpts;
|
|
1699
|
+
const eventTarget = createEventTargetInternal({
|
|
1700
|
+
onListenerError: opts.onListenerError
|
|
1701
|
+
});
|
|
1702
|
+
const proxy = createObservableProxy(target, eventTarget, {
|
|
1703
|
+
deep: opts.deep,
|
|
1704
|
+
cloneStrategy: opts.cloneStrategy,
|
|
1705
|
+
deepClone: opts.deepClone
|
|
1706
|
+
});
|
|
1707
|
+
const methodNames = [
|
|
1708
|
+
"addEventListener",
|
|
1709
|
+
"removeEventListener",
|
|
1710
|
+
"dispatchEvent",
|
|
1711
|
+
"clear",
|
|
1712
|
+
"on",
|
|
1713
|
+
"once",
|
|
1714
|
+
"removeAllListeners",
|
|
1715
|
+
"pipe",
|
|
1716
|
+
"addWildcardListener",
|
|
1717
|
+
"removeWildcardListener",
|
|
1718
|
+
"complete",
|
|
1719
|
+
"subscribe",
|
|
1720
|
+
"toObservable",
|
|
1721
|
+
"events"
|
|
1722
|
+
];
|
|
1723
|
+
for (const name of methodNames) {
|
|
1724
|
+
Object.defineProperty(proxy, name, {
|
|
1725
|
+
value: eventTarget[name],
|
|
1726
|
+
writable: false,
|
|
1727
|
+
enumerable: false,
|
|
1728
|
+
configurable: true
|
|
1729
|
+
});
|
|
1730
|
+
}
|
|
1731
|
+
Object.defineProperty(proxy, "completed", {
|
|
1732
|
+
get: () => eventTarget.completed,
|
|
1733
|
+
enumerable: false,
|
|
1734
|
+
configurable: true
|
|
1735
|
+
});
|
|
1736
|
+
return proxy;
|
|
1737
|
+
}
|
|
1738
|
+
return createEventTargetInternal(targetOrOpts);
|
|
1739
|
+
}
|
|
1740
|
+
function createEventTargetInternal(opts) {
|
|
1741
|
+
const listeners = new Map;
|
|
1742
|
+
const wildcardListeners = new Set;
|
|
1743
|
+
let isCompleted = false;
|
|
1744
|
+
const completionCallbacks = new Set;
|
|
1745
|
+
const now = () => typeof globalThis.performance?.now === "function" ? globalThis.performance.now() : Date.now();
|
|
1746
|
+
const initializeEventState = (state, type, bubbles, cancelable) => {
|
|
1747
|
+
state.initializedFlag = true;
|
|
1748
|
+
state.stopPropagationFlag = false;
|
|
1749
|
+
state.stopImmediatePropagationFlag = false;
|
|
1750
|
+
state.canceledFlag = false;
|
|
1751
|
+
state.isTrusted = false;
|
|
1752
|
+
state.target = null;
|
|
1753
|
+
state.currentTarget = null;
|
|
1754
|
+
state.eventPhase = 0;
|
|
1755
|
+
state.type = type;
|
|
1756
|
+
state.bubbles = bubbles;
|
|
1757
|
+
state.cancelable = cancelable;
|
|
1758
|
+
};
|
|
1759
|
+
const setCanceledFlag = (state) => {
|
|
1760
|
+
if (state.cancelable && !state.inPassiveListenerFlag) {
|
|
1761
|
+
state.canceledFlag = true;
|
|
1762
|
+
}
|
|
1763
|
+
};
|
|
1764
|
+
const createEvent = (type, detail, init) => {
|
|
1765
|
+
const state = {
|
|
1766
|
+
dispatchFlag: false,
|
|
1767
|
+
initializedFlag: true,
|
|
1768
|
+
stopPropagationFlag: false,
|
|
1769
|
+
stopImmediatePropagationFlag: false,
|
|
1770
|
+
canceledFlag: false,
|
|
1771
|
+
inPassiveListenerFlag: false,
|
|
1772
|
+
composedFlag: Boolean(init?.composed),
|
|
1773
|
+
eventPhase: init?.eventPhase ?? 0,
|
|
1774
|
+
currentTarget: init?.currentTarget ?? init?.target ?? null,
|
|
1775
|
+
target: init?.target ?? null,
|
|
1776
|
+
timeStamp: init?.timeStamp ?? now(),
|
|
1777
|
+
path: [],
|
|
1778
|
+
type,
|
|
1779
|
+
bubbles: Boolean(init?.bubbles),
|
|
1780
|
+
cancelable: Boolean(init?.cancelable),
|
|
1781
|
+
isTrusted: false
|
|
1782
|
+
};
|
|
1783
|
+
const event = { detail };
|
|
1784
|
+
Object.defineProperties(event, {
|
|
1785
|
+
type: {
|
|
1786
|
+
get: () => state.type,
|
|
1787
|
+
enumerable: true,
|
|
1788
|
+
configurable: true
|
|
1789
|
+
},
|
|
1790
|
+
bubbles: {
|
|
1791
|
+
get: () => state.bubbles,
|
|
1792
|
+
enumerable: true,
|
|
1793
|
+
configurable: true
|
|
1794
|
+
},
|
|
1795
|
+
cancelable: {
|
|
1796
|
+
get: () => state.cancelable,
|
|
1797
|
+
enumerable: true,
|
|
1798
|
+
configurable: true
|
|
1799
|
+
},
|
|
1800
|
+
cancelBubble: {
|
|
1801
|
+
get: () => state.stopPropagationFlag,
|
|
1802
|
+
set: (value) => {
|
|
1803
|
+
if (value)
|
|
1804
|
+
state.stopPropagationFlag = true;
|
|
1805
|
+
},
|
|
1806
|
+
enumerable: true,
|
|
1807
|
+
configurable: true
|
|
1808
|
+
},
|
|
1809
|
+
composed: {
|
|
1810
|
+
get: () => state.composedFlag,
|
|
1811
|
+
enumerable: true,
|
|
1812
|
+
configurable: true
|
|
1813
|
+
},
|
|
1814
|
+
currentTarget: {
|
|
1815
|
+
get: () => state.currentTarget,
|
|
1816
|
+
enumerable: true,
|
|
1817
|
+
configurable: true
|
|
1818
|
+
},
|
|
1819
|
+
defaultPrevented: {
|
|
1820
|
+
get: () => state.canceledFlag,
|
|
1821
|
+
enumerable: true,
|
|
1822
|
+
configurable: true
|
|
1823
|
+
},
|
|
1824
|
+
eventPhase: {
|
|
1825
|
+
get: () => state.eventPhase,
|
|
1826
|
+
enumerable: true,
|
|
1827
|
+
configurable: true
|
|
1828
|
+
},
|
|
1829
|
+
isTrusted: {
|
|
1830
|
+
get: () => state.isTrusted,
|
|
1831
|
+
enumerable: true,
|
|
1832
|
+
configurable: true
|
|
1833
|
+
},
|
|
1834
|
+
returnValue: {
|
|
1835
|
+
get: () => !state.canceledFlag,
|
|
1836
|
+
set: (value) => {
|
|
1837
|
+
if (value === false)
|
|
1838
|
+
setCanceledFlag(state);
|
|
1839
|
+
},
|
|
1840
|
+
enumerable: true,
|
|
1841
|
+
configurable: true
|
|
1842
|
+
},
|
|
1843
|
+
srcElement: {
|
|
1844
|
+
get: () => state.target,
|
|
1845
|
+
enumerable: true,
|
|
1846
|
+
configurable: true
|
|
1847
|
+
},
|
|
1848
|
+
target: {
|
|
1849
|
+
get: () => state.target,
|
|
1850
|
+
enumerable: true,
|
|
1851
|
+
configurable: true
|
|
1852
|
+
},
|
|
1853
|
+
timeStamp: {
|
|
1854
|
+
get: () => state.timeStamp,
|
|
1855
|
+
enumerable: true,
|
|
1856
|
+
configurable: true
|
|
1857
|
+
},
|
|
1858
|
+
composedPath: {
|
|
1859
|
+
value: () => state.path.map((entry) => entry.invocationTarget),
|
|
1860
|
+
enumerable: true,
|
|
1861
|
+
configurable: true
|
|
1862
|
+
},
|
|
1863
|
+
initEvent: {
|
|
1864
|
+
value: (newType, bubbles = false, cancelable = false) => {
|
|
1865
|
+
if (state.dispatchFlag)
|
|
1866
|
+
return;
|
|
1867
|
+
initializeEventState(state, newType, Boolean(bubbles), Boolean(cancelable));
|
|
1868
|
+
},
|
|
1869
|
+
enumerable: true,
|
|
1870
|
+
configurable: true
|
|
1871
|
+
},
|
|
1872
|
+
preventDefault: {
|
|
1873
|
+
value: () => setCanceledFlag(state),
|
|
1874
|
+
enumerable: true,
|
|
1875
|
+
configurable: true
|
|
1876
|
+
},
|
|
1877
|
+
stopImmediatePropagation: {
|
|
1878
|
+
value: () => {
|
|
1879
|
+
state.stopPropagationFlag = true;
|
|
1880
|
+
state.stopImmediatePropagationFlag = true;
|
|
1881
|
+
},
|
|
1882
|
+
enumerable: true,
|
|
1883
|
+
configurable: true
|
|
1884
|
+
},
|
|
1885
|
+
stopPropagation: {
|
|
1886
|
+
value: () => {
|
|
1887
|
+
state.stopPropagationFlag = true;
|
|
1888
|
+
},
|
|
1889
|
+
enumerable: true,
|
|
1890
|
+
configurable: true
|
|
1891
|
+
},
|
|
1892
|
+
NONE: { value: 0, enumerable: true, configurable: true },
|
|
1893
|
+
CAPTURING_PHASE: { value: 1, enumerable: true, configurable: true },
|
|
1894
|
+
AT_TARGET: { value: 2, enumerable: true, configurable: true },
|
|
1895
|
+
BUBBLING_PHASE: { value: 3, enumerable: true, configurable: true },
|
|
1896
|
+
[EVENT_STATE]: {
|
|
1897
|
+
value: state,
|
|
1898
|
+
enumerable: false,
|
|
1899
|
+
configurable: false
|
|
1900
|
+
}
|
|
1901
|
+
});
|
|
1902
|
+
return event;
|
|
1903
|
+
};
|
|
1904
|
+
const getEventState = (event) => event[EVENT_STATE];
|
|
1905
|
+
const normalizeAddListenerOptions = (options) => {
|
|
1906
|
+
if (typeof options === "boolean") {
|
|
1907
|
+
return {
|
|
1908
|
+
capture: options,
|
|
1909
|
+
passive: false,
|
|
1910
|
+
once: false,
|
|
1911
|
+
signal: null
|
|
1912
|
+
};
|
|
1913
|
+
}
|
|
1914
|
+
return {
|
|
1915
|
+
capture: Boolean(options?.capture),
|
|
1916
|
+
passive: Boolean(options?.passive),
|
|
1917
|
+
once: Boolean(options?.once),
|
|
1918
|
+
signal: options?.signal ?? null
|
|
1919
|
+
};
|
|
1920
|
+
};
|
|
1921
|
+
const normalizeCaptureOption = (options) => {
|
|
1922
|
+
if (typeof options === "boolean")
|
|
1923
|
+
return options;
|
|
1924
|
+
return Boolean(options?.capture);
|
|
1925
|
+
};
|
|
1926
|
+
const removeListenerRecord = (type, record) => {
|
|
1927
|
+
if (record.removed)
|
|
1928
|
+
return;
|
|
1929
|
+
record.removed = true;
|
|
1930
|
+
const list = listeners.get(type);
|
|
1931
|
+
if (list) {
|
|
1932
|
+
const idx = list.indexOf(record);
|
|
1933
|
+
if (idx >= 0)
|
|
1934
|
+
list.splice(idx, 1);
|
|
1935
|
+
if (list.length === 0)
|
|
1936
|
+
listeners.delete(type);
|
|
1937
|
+
}
|
|
1938
|
+
if (record.signal && record.abortHandler) {
|
|
1939
|
+
record.signal.removeEventListener("abort", record.abortHandler);
|
|
1940
|
+
}
|
|
1941
|
+
};
|
|
1942
|
+
const handleListenerError = (eventType, error2) => {
|
|
1943
|
+
if (eventType === "error")
|
|
1944
|
+
return;
|
|
1945
|
+
if (opts?.onListenerError) {
|
|
1946
|
+
opts.onListenerError(eventType, error2);
|
|
1947
|
+
return;
|
|
1948
|
+
}
|
|
1949
|
+
const errorListeners = listeners.get("error");
|
|
1950
|
+
if (errorListeners && errorListeners.length > 0) {
|
|
1951
|
+
dispatchEvent({ type: "error", detail: error2 });
|
|
1952
|
+
} else {
|
|
1953
|
+
throw error2;
|
|
1954
|
+
}
|
|
1955
|
+
};
|
|
1956
|
+
const notifyWildcardListeners = (eventType, event) => {
|
|
1957
|
+
if (wildcardListeners.size === 0)
|
|
1958
|
+
return;
|
|
1959
|
+
for (const rec of Array.from(wildcardListeners)) {
|
|
1960
|
+
if (!matchesWildcard(eventType, rec.pattern))
|
|
1961
|
+
continue;
|
|
1962
|
+
const baseEvent = createEvent(rec.pattern, event.detail, {
|
|
1963
|
+
target,
|
|
1964
|
+
currentTarget: target,
|
|
1965
|
+
eventPhase: 2,
|
|
1966
|
+
bubbles: event.bubbles,
|
|
1967
|
+
cancelable: event.cancelable,
|
|
1968
|
+
composed: event.composed
|
|
1969
|
+
});
|
|
1970
|
+
const wildcardEvent = Object.defineProperties(baseEvent, {
|
|
1971
|
+
originalType: { value: eventType, enumerable: true, configurable: true }
|
|
1972
|
+
});
|
|
1973
|
+
try {
|
|
1974
|
+
const fn = rec.fn;
|
|
1975
|
+
const res = fn(wildcardEvent);
|
|
1976
|
+
if (res && typeof res.then === "function") {
|
|
1977
|
+
res.catch((error2) => {
|
|
1978
|
+
try {
|
|
1979
|
+
handleListenerError(eventType, error2);
|
|
1980
|
+
} catch (rethrown) {
|
|
1981
|
+
queueMicrotask(() => {
|
|
1982
|
+
throw rethrown;
|
|
1983
|
+
});
|
|
1984
|
+
}
|
|
1985
|
+
});
|
|
1986
|
+
}
|
|
1987
|
+
} catch (error2) {
|
|
1988
|
+
handleListenerError(eventType, error2);
|
|
1989
|
+
} finally {
|
|
1990
|
+
if (rec.once)
|
|
1991
|
+
wildcardListeners.delete(rec);
|
|
1992
|
+
}
|
|
1993
|
+
const state = getEventState(wildcardEvent);
|
|
1994
|
+
if (state?.stopImmediatePropagationFlag || state?.stopPropagationFlag) {
|
|
1995
|
+
break;
|
|
1996
|
+
}
|
|
1997
|
+
}
|
|
1998
|
+
};
|
|
1999
|
+
const addEventListener = (type, listener, options) => {
|
|
2000
|
+
if (isCompleted || !listener) {
|
|
2001
|
+
return () => {};
|
|
2002
|
+
}
|
|
2003
|
+
const { capture, passive, once, signal } = normalizeAddListenerOptions(options);
|
|
2004
|
+
let list = listeners.get(type);
|
|
2005
|
+
if (!list) {
|
|
2006
|
+
list = [];
|
|
2007
|
+
listeners.set(type, list);
|
|
2008
|
+
}
|
|
2009
|
+
for (const existing of list) {
|
|
2010
|
+
if (existing.original === listener && existing.capture === capture) {
|
|
2011
|
+
return () => removeEventListener(type, listener, options);
|
|
2012
|
+
}
|
|
2013
|
+
}
|
|
2014
|
+
const original = listener;
|
|
2015
|
+
const callback = typeof listener === "function" ? listener : (event) => listener.handleEvent(event);
|
|
2016
|
+
const record = {
|
|
2017
|
+
type,
|
|
2018
|
+
original,
|
|
2019
|
+
callback,
|
|
2020
|
+
capture,
|
|
2021
|
+
passive,
|
|
2022
|
+
once,
|
|
2023
|
+
signal,
|
|
2024
|
+
removed: false
|
|
2025
|
+
};
|
|
2026
|
+
list.push(record);
|
|
2027
|
+
const unsubscribe2 = () => removeListenerRecord(type, record);
|
|
2028
|
+
if (signal) {
|
|
2029
|
+
const onAbort = () => removeListenerRecord(type, record);
|
|
2030
|
+
record.abortHandler = onAbort;
|
|
2031
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
2032
|
+
if (signal.aborted)
|
|
2033
|
+
onAbort();
|
|
2034
|
+
}
|
|
2035
|
+
return unsubscribe2;
|
|
2036
|
+
};
|
|
2037
|
+
const addWildcardListener = (pattern, listener, options) => {
|
|
2038
|
+
if (isCompleted)
|
|
2039
|
+
return () => {};
|
|
2040
|
+
const opts2 = options ?? {};
|
|
2041
|
+
for (const existing of wildcardListeners) {
|
|
2042
|
+
if (existing.pattern === pattern && existing.fn === listener) {
|
|
2043
|
+
return () => removeWildcardListener(pattern, listener);
|
|
2044
|
+
}
|
|
2045
|
+
}
|
|
2046
|
+
const record = {
|
|
2047
|
+
fn: listener,
|
|
2048
|
+
pattern,
|
|
2049
|
+
once: opts2.once,
|
|
2050
|
+
signal: opts2.signal
|
|
2051
|
+
};
|
|
2052
|
+
wildcardListeners.add(record);
|
|
2053
|
+
const unsubscribe2 = () => {
|
|
2054
|
+
wildcardListeners.delete(record);
|
|
2055
|
+
if (record.signal && record.abortHandler) {
|
|
2056
|
+
record.signal.removeEventListener("abort", record.abortHandler);
|
|
2057
|
+
}
|
|
2058
|
+
};
|
|
2059
|
+
if (opts2.signal) {
|
|
2060
|
+
const onAbort = () => unsubscribe2();
|
|
2061
|
+
record.abortHandler = onAbort;
|
|
2062
|
+
opts2.signal.addEventListener("abort", onAbort, { once: true });
|
|
2063
|
+
if (opts2.signal.aborted)
|
|
2064
|
+
onAbort();
|
|
2065
|
+
}
|
|
2066
|
+
return unsubscribe2;
|
|
2067
|
+
};
|
|
2068
|
+
const removeWildcardListener = (pattern, listener) => {
|
|
2069
|
+
for (const record of Array.from(wildcardListeners)) {
|
|
2070
|
+
if (record.pattern === pattern && record.fn === listener) {
|
|
2071
|
+
wildcardListeners.delete(record);
|
|
2072
|
+
if (record.signal && record.abortHandler) {
|
|
2073
|
+
record.signal.removeEventListener("abort", record.abortHandler);
|
|
2074
|
+
}
|
|
2075
|
+
}
|
|
2076
|
+
}
|
|
2077
|
+
};
|
|
2078
|
+
const invokeListeners = (eventType, event, phase, listenersSnapshot) => {
|
|
2079
|
+
const state = getEventState(event);
|
|
2080
|
+
if (!state || state.stopPropagationFlag)
|
|
2081
|
+
return;
|
|
2082
|
+
state.currentTarget = target;
|
|
2083
|
+
state.target = target;
|
|
2084
|
+
state.eventPhase = event.AT_TARGET;
|
|
2085
|
+
for (const rec of listenersSnapshot) {
|
|
2086
|
+
if (rec.removed)
|
|
2087
|
+
continue;
|
|
2088
|
+
if (phase === "capturing" && !rec.capture)
|
|
2089
|
+
continue;
|
|
2090
|
+
if (phase === "bubbling" && rec.capture)
|
|
2091
|
+
continue;
|
|
2092
|
+
if (rec.once)
|
|
2093
|
+
removeListenerRecord(rec.type, rec);
|
|
2094
|
+
if (rec.passive)
|
|
2095
|
+
state.inPassiveListenerFlag = true;
|
|
2096
|
+
try {
|
|
2097
|
+
const res = rec.callback.call(state.currentTarget, event);
|
|
2098
|
+
if (res && typeof res.then === "function") {
|
|
2099
|
+
res.catch((error2) => {
|
|
2100
|
+
try {
|
|
2101
|
+
handleListenerError(eventType, error2);
|
|
2102
|
+
} catch (rethrown) {
|
|
2103
|
+
queueMicrotask(() => {
|
|
2104
|
+
throw rethrown;
|
|
2105
|
+
});
|
|
2106
|
+
}
|
|
2107
|
+
});
|
|
2108
|
+
}
|
|
2109
|
+
} catch (error2) {
|
|
2110
|
+
handleListenerError(eventType, error2);
|
|
2111
|
+
} finally {
|
|
2112
|
+
if (rec.passive)
|
|
2113
|
+
state.inPassiveListenerFlag = false;
|
|
2114
|
+
}
|
|
2115
|
+
if (state.stopImmediatePropagationFlag)
|
|
2116
|
+
break;
|
|
2117
|
+
}
|
|
2118
|
+
};
|
|
2119
|
+
const dispatchEvent = (eventInput) => {
|
|
2120
|
+
if (isCompleted)
|
|
2121
|
+
return false;
|
|
2122
|
+
let event;
|
|
2123
|
+
let state;
|
|
2124
|
+
if (eventInput && typeof eventInput === "object") {
|
|
2125
|
+
state = getEventState(eventInput);
|
|
2126
|
+
if (state) {
|
|
2127
|
+
event = eventInput;
|
|
2128
|
+
} else {
|
|
2129
|
+
const input = eventInput;
|
|
2130
|
+
if (typeof input.type !== "string") {
|
|
2131
|
+
throw new TypeError("Event type must be a string");
|
|
2132
|
+
}
|
|
2133
|
+
event = createEvent(input.type, input.detail, {
|
|
2134
|
+
bubbles: input.bubbles,
|
|
2135
|
+
cancelable: input.cancelable,
|
|
2136
|
+
composed: input.composed,
|
|
2137
|
+
timeStamp: input.timeStamp
|
|
2138
|
+
});
|
|
2139
|
+
state = getEventState(event);
|
|
2140
|
+
}
|
|
2141
|
+
} else {
|
|
2142
|
+
throw new TypeError("dispatchEvent expects an event object");
|
|
2143
|
+
}
|
|
2144
|
+
const dispatchState = state ?? getEventState(event);
|
|
2145
|
+
if (dispatchState.dispatchFlag || !dispatchState.initializedFlag) {
|
|
2146
|
+
const message = "Failed to execute dispatchEvent: event is already being dispatched";
|
|
2147
|
+
if (typeof globalThis.DOMException === "function") {
|
|
2148
|
+
throw new globalThis.DOMException(message, "InvalidStateError");
|
|
2149
|
+
}
|
|
2150
|
+
const err = new Error(message);
|
|
2151
|
+
err.name = "InvalidStateError";
|
|
2152
|
+
throw err;
|
|
2153
|
+
}
|
|
2154
|
+
dispatchState.isTrusted = false;
|
|
2155
|
+
dispatchState.dispatchFlag = true;
|
|
2156
|
+
dispatchState.path = [
|
|
2157
|
+
{
|
|
2158
|
+
invocationTarget: target,
|
|
2159
|
+
invocationTargetInShadowTree: false,
|
|
2160
|
+
shadowAdjustedTarget: target,
|
|
2161
|
+
relatedTarget: null,
|
|
2162
|
+
touchTargets: [],
|
|
2163
|
+
rootOfClosedTree: false,
|
|
2164
|
+
slotInClosedTree: false
|
|
2165
|
+
}
|
|
2166
|
+
];
|
|
2167
|
+
notifyWildcardListeners(dispatchState.type, event);
|
|
2168
|
+
const list = listeners.get(dispatchState.type);
|
|
2169
|
+
const snapshot = list ? list.slice() : [];
|
|
2170
|
+
invokeListeners(dispatchState.type, event, "capturing", snapshot);
|
|
2171
|
+
invokeListeners(dispatchState.type, event, "bubbling", snapshot);
|
|
2172
|
+
dispatchState.eventPhase = event.NONE;
|
|
2173
|
+
dispatchState.currentTarget = null;
|
|
2174
|
+
dispatchState.path = [];
|
|
2175
|
+
dispatchState.dispatchFlag = false;
|
|
2176
|
+
dispatchState.stopPropagationFlag = false;
|
|
2177
|
+
dispatchState.stopImmediatePropagationFlag = false;
|
|
2178
|
+
return !dispatchState.canceledFlag;
|
|
2179
|
+
};
|
|
2180
|
+
const removeEventListener = (type, listener, options) => {
|
|
2181
|
+
if (!listener)
|
|
2182
|
+
return;
|
|
2183
|
+
const capture = normalizeCaptureOption(options);
|
|
2184
|
+
const list = listeners.get(type);
|
|
2185
|
+
if (!list)
|
|
2186
|
+
return;
|
|
2187
|
+
for (const record of [...list]) {
|
|
2188
|
+
if (record.original === listener && record.capture === capture) {
|
|
2189
|
+
removeListenerRecord(type, record);
|
|
2190
|
+
}
|
|
2191
|
+
}
|
|
2192
|
+
};
|
|
2193
|
+
const clear = () => {
|
|
2194
|
+
for (const [type, list] of Array.from(listeners.entries())) {
|
|
2195
|
+
for (const record of [...list]) {
|
|
2196
|
+
removeListenerRecord(type, record);
|
|
2197
|
+
}
|
|
2198
|
+
}
|
|
2199
|
+
listeners.clear();
|
|
2200
|
+
for (const record of wildcardListeners) {
|
|
2201
|
+
if (record.signal && record.abortHandler) {
|
|
2202
|
+
record.signal.removeEventListener("abort", record.abortHandler);
|
|
2203
|
+
}
|
|
2204
|
+
}
|
|
2205
|
+
wildcardListeners.clear();
|
|
2206
|
+
};
|
|
2207
|
+
const on = (type, options) => {
|
|
2208
|
+
return new Observable((observer) => {
|
|
2209
|
+
let opts2;
|
|
2210
|
+
if (typeof options === "boolean") {
|
|
2211
|
+
opts2 = { capture: options };
|
|
2212
|
+
} else {
|
|
2213
|
+
opts2 = options ?? {};
|
|
2214
|
+
}
|
|
2215
|
+
const handler = opts2.handler;
|
|
2216
|
+
const once = opts2.once;
|
|
2217
|
+
const eventHandler = (e) => {
|
|
2218
|
+
let success = false;
|
|
2219
|
+
try {
|
|
2220
|
+
if (handler) {
|
|
2221
|
+
handler(e);
|
|
2222
|
+
}
|
|
2223
|
+
observer.next(e);
|
|
2224
|
+
success = true;
|
|
2225
|
+
} finally {
|
|
2226
|
+
if (once && success) {
|
|
2227
|
+
observer.complete();
|
|
2228
|
+
}
|
|
2229
|
+
}
|
|
2230
|
+
};
|
|
2231
|
+
const errorHandler = (e) => {
|
|
2232
|
+
observer.error(e.detail);
|
|
2233
|
+
};
|
|
2234
|
+
const unsubscribeEvent = addEventListener(type, eventHandler, opts2);
|
|
2235
|
+
let unsubscribeError;
|
|
2236
|
+
if (opts2.receiveError) {
|
|
2237
|
+
unsubscribeError = addEventListener("error", errorHandler, opts2);
|
|
2238
|
+
}
|
|
2239
|
+
return () => {
|
|
2240
|
+
unsubscribeEvent();
|
|
2241
|
+
if (unsubscribeError) {
|
|
2242
|
+
unsubscribeError();
|
|
2243
|
+
}
|
|
2244
|
+
};
|
|
2245
|
+
});
|
|
2246
|
+
};
|
|
2247
|
+
const onceMethod = (type, listener, options) => {
|
|
2248
|
+
if (typeof options === "boolean") {
|
|
2249
|
+
return addEventListener(type, listener, { capture: options, once: true });
|
|
2250
|
+
}
|
|
2251
|
+
return addEventListener(type, listener, { ...options ?? {}, once: true });
|
|
2252
|
+
};
|
|
2253
|
+
const removeAllListeners = (type) => {
|
|
2254
|
+
if (type !== undefined) {
|
|
2255
|
+
const list = listeners.get(type);
|
|
2256
|
+
if (list) {
|
|
2257
|
+
for (const record of [...list]) {
|
|
2258
|
+
removeListenerRecord(type, record);
|
|
2259
|
+
}
|
|
2260
|
+
listeners.delete(type);
|
|
2261
|
+
}
|
|
2262
|
+
} else {
|
|
2263
|
+
for (const [eventType, list] of Array.from(listeners.entries())) {
|
|
2264
|
+
for (const record of [...list]) {
|
|
2265
|
+
removeListenerRecord(eventType, record);
|
|
2266
|
+
}
|
|
2267
|
+
}
|
|
2268
|
+
listeners.clear();
|
|
2269
|
+
for (const record of wildcardListeners) {
|
|
2270
|
+
if (record.signal && record.abortHandler) {
|
|
2271
|
+
record.signal.removeEventListener("abort", record.abortHandler);
|
|
2272
|
+
}
|
|
2273
|
+
}
|
|
2274
|
+
wildcardListeners.clear();
|
|
2275
|
+
}
|
|
2276
|
+
};
|
|
2277
|
+
const pipe = (target2, mapFn) => {
|
|
2278
|
+
if (isCompleted) {
|
|
2279
|
+
return () => {};
|
|
2280
|
+
}
|
|
2281
|
+
const unsubscribe2 = addWildcardListener("*", (event) => {
|
|
2282
|
+
if (mapFn) {
|
|
2283
|
+
const mapped = mapFn(createEvent(event.originalType, event.detail, {
|
|
2284
|
+
target: target2,
|
|
2285
|
+
currentTarget: target2,
|
|
2286
|
+
eventPhase: 2,
|
|
2287
|
+
bubbles: event.bubbles,
|
|
2288
|
+
cancelable: event.cancelable,
|
|
2289
|
+
composed: event.composed
|
|
2290
|
+
}));
|
|
2291
|
+
if (mapped !== null) {
|
|
2292
|
+
target2.dispatchEvent(mapped);
|
|
2293
|
+
}
|
|
2294
|
+
} else {
|
|
2295
|
+
target2.dispatchEvent({
|
|
2296
|
+
type: event.originalType,
|
|
2297
|
+
detail: event.detail
|
|
2298
|
+
});
|
|
2299
|
+
}
|
|
2300
|
+
});
|
|
2301
|
+
const completionUnsub = () => {
|
|
2302
|
+
unsubscribe2();
|
|
2303
|
+
};
|
|
2304
|
+
completionCallbacks.add(completionUnsub);
|
|
2305
|
+
return () => {
|
|
2306
|
+
completionCallbacks.delete(completionUnsub);
|
|
2307
|
+
unsubscribe2();
|
|
2308
|
+
};
|
|
2309
|
+
};
|
|
2310
|
+
const complete2 = () => {
|
|
2311
|
+
if (isCompleted)
|
|
2312
|
+
return;
|
|
2313
|
+
isCompleted = true;
|
|
2314
|
+
for (const cb of completionCallbacks) {
|
|
2315
|
+
try {
|
|
2316
|
+
cb();
|
|
2317
|
+
} catch (err) {
|
|
2318
|
+
try {
|
|
2319
|
+
handleListenerError("complete", err);
|
|
2320
|
+
} catch {}
|
|
2321
|
+
}
|
|
2322
|
+
}
|
|
2323
|
+
completionCallbacks.clear();
|
|
2324
|
+
for (const [eventType, list] of Array.from(listeners.entries())) {
|
|
2325
|
+
for (const record of [...list]) {
|
|
2326
|
+
removeListenerRecord(eventType, record);
|
|
2327
|
+
}
|
|
2328
|
+
}
|
|
2329
|
+
listeners.clear();
|
|
2330
|
+
for (const record of wildcardListeners) {
|
|
2331
|
+
if (record.signal && record.abortHandler) {
|
|
2332
|
+
record.signal.removeEventListener("abort", record.abortHandler);
|
|
2333
|
+
}
|
|
2334
|
+
}
|
|
2335
|
+
wildcardListeners.clear();
|
|
2336
|
+
};
|
|
2337
|
+
const subscribe = (type, observerOrNext, error2, completeHandler) => {
|
|
2338
|
+
let observer;
|
|
2339
|
+
if (typeof observerOrNext === "function") {
|
|
2340
|
+
observer = {
|
|
2341
|
+
next: observerOrNext,
|
|
2342
|
+
error: error2,
|
|
2343
|
+
complete: completeHandler
|
|
2344
|
+
};
|
|
2345
|
+
} else {
|
|
2346
|
+
observer = observerOrNext ?? {};
|
|
2347
|
+
}
|
|
2348
|
+
let closed = false;
|
|
2349
|
+
if (isCompleted) {
|
|
2350
|
+
if (observer.complete) {
|
|
2351
|
+
try {
|
|
2352
|
+
observer.complete();
|
|
2353
|
+
} catch {}
|
|
2354
|
+
}
|
|
2355
|
+
return {
|
|
2356
|
+
unsubscribe: () => {
|
|
2357
|
+
closed = true;
|
|
2358
|
+
},
|
|
2359
|
+
get closed() {
|
|
2360
|
+
return closed || isCompleted;
|
|
2361
|
+
}
|
|
2362
|
+
};
|
|
2363
|
+
}
|
|
2364
|
+
const unsub = addEventListener(type, (event) => {
|
|
2365
|
+
if (closed)
|
|
2366
|
+
return;
|
|
2367
|
+
if (observer.next) {
|
|
2368
|
+
try {
|
|
2369
|
+
observer.next(event);
|
|
2370
|
+
} catch (err) {
|
|
2371
|
+
if (observer.error) {
|
|
2372
|
+
try {
|
|
2373
|
+
observer.error(err);
|
|
2374
|
+
} catch {}
|
|
2375
|
+
}
|
|
2376
|
+
}
|
|
2377
|
+
}
|
|
2378
|
+
});
|
|
2379
|
+
const onComplete = () => {
|
|
2380
|
+
if (closed)
|
|
2381
|
+
return;
|
|
2382
|
+
closed = true;
|
|
2383
|
+
if (observer.complete) {
|
|
2384
|
+
try {
|
|
2385
|
+
observer.complete();
|
|
2386
|
+
} catch {}
|
|
2387
|
+
}
|
|
2388
|
+
};
|
|
2389
|
+
completionCallbacks.add(onComplete);
|
|
2390
|
+
return {
|
|
2391
|
+
unsubscribe: () => {
|
|
2392
|
+
if (closed)
|
|
2393
|
+
return;
|
|
2394
|
+
closed = true;
|
|
2395
|
+
completionCallbacks.delete(onComplete);
|
|
2396
|
+
unsub();
|
|
2397
|
+
},
|
|
2398
|
+
get closed() {
|
|
2399
|
+
return closed || isCompleted;
|
|
2400
|
+
}
|
|
2401
|
+
};
|
|
2402
|
+
};
|
|
2403
|
+
const toObservable = () => {
|
|
2404
|
+
return new Observable((observer) => {
|
|
2405
|
+
if (isCompleted) {
|
|
2406
|
+
observer.complete();
|
|
2407
|
+
return;
|
|
2408
|
+
}
|
|
2409
|
+
const wildcardListener = (event) => {
|
|
2410
|
+
observer.next(createEvent(event.originalType, event.detail, {
|
|
2411
|
+
target,
|
|
2412
|
+
currentTarget: target,
|
|
2413
|
+
eventPhase: 2,
|
|
2414
|
+
bubbles: event.bubbles,
|
|
2415
|
+
cancelable: event.cancelable,
|
|
2416
|
+
composed: event.composed
|
|
2417
|
+
}));
|
|
2418
|
+
};
|
|
2419
|
+
const unsubscribe2 = addWildcardListener("*", wildcardListener);
|
|
2420
|
+
const onComplete = () => {
|
|
2421
|
+
observer.complete();
|
|
2422
|
+
};
|
|
2423
|
+
completionCallbacks.add(onComplete);
|
|
2424
|
+
return () => {
|
|
2425
|
+
unsubscribe2();
|
|
2426
|
+
completionCallbacks.delete(onComplete);
|
|
2427
|
+
};
|
|
2428
|
+
});
|
|
2429
|
+
};
|
|
2430
|
+
function events(type, options) {
|
|
2431
|
+
if (isCompleted) {
|
|
2432
|
+
return {
|
|
2433
|
+
[Symbol.asyncIterator]() {
|
|
2434
|
+
return this;
|
|
2435
|
+
},
|
|
2436
|
+
next() {
|
|
2437
|
+
return Promise.resolve({
|
|
2438
|
+
value: undefined,
|
|
2439
|
+
done: true
|
|
2440
|
+
});
|
|
2441
|
+
},
|
|
2442
|
+
return() {
|
|
2443
|
+
return Promise.resolve({
|
|
2444
|
+
value: undefined,
|
|
2445
|
+
done: true
|
|
2446
|
+
});
|
|
2447
|
+
}
|
|
2448
|
+
};
|
|
2449
|
+
}
|
|
2450
|
+
const signal = options?.signal;
|
|
2451
|
+
const bufferSize = options?.bufferSize ?? Infinity;
|
|
2452
|
+
const overflowStrategy = options?.overflowStrategy ?? "drop-oldest";
|
|
2453
|
+
const buffer = [];
|
|
2454
|
+
let resolve = null;
|
|
2455
|
+
let done = false;
|
|
2456
|
+
let hasOverflow = false;
|
|
2457
|
+
let onAbort = null;
|
|
2458
|
+
const cleanupAbortListener = () => {
|
|
2459
|
+
if (signal && onAbort) {
|
|
2460
|
+
signal.removeEventListener("abort", onAbort);
|
|
2461
|
+
}
|
|
2462
|
+
};
|
|
2463
|
+
const unsub = addEventListener(type, (event) => {
|
|
2464
|
+
if (done)
|
|
2465
|
+
return;
|
|
2466
|
+
const typedEvent = event;
|
|
2467
|
+
if (resolve) {
|
|
2468
|
+
const r = resolve;
|
|
2469
|
+
resolve = null;
|
|
2470
|
+
r({ value: typedEvent, done: false });
|
|
2471
|
+
} else {
|
|
2472
|
+
if (buffer.length >= bufferSize && bufferSize !== Infinity) {
|
|
2473
|
+
switch (overflowStrategy) {
|
|
2474
|
+
case "drop-oldest":
|
|
2475
|
+
buffer.shift();
|
|
2476
|
+
buffer.push(typedEvent);
|
|
2477
|
+
break;
|
|
2478
|
+
case "drop-latest":
|
|
2479
|
+
break;
|
|
2480
|
+
case "throw":
|
|
2481
|
+
unsub();
|
|
2482
|
+
completionCallbacks.delete(onComplete);
|
|
2483
|
+
done = true;
|
|
2484
|
+
hasOverflow = true;
|
|
2485
|
+
cleanupAbortListener();
|
|
2486
|
+
return;
|
|
2487
|
+
}
|
|
2488
|
+
} else {
|
|
2489
|
+
buffer.push(typedEvent);
|
|
2490
|
+
}
|
|
2491
|
+
}
|
|
2492
|
+
});
|
|
2493
|
+
const onComplete = () => {
|
|
2494
|
+
done = true;
|
|
2495
|
+
cleanupAbortListener();
|
|
2496
|
+
if (resolve) {
|
|
2497
|
+
const r = resolve;
|
|
2498
|
+
resolve = null;
|
|
2499
|
+
r({ value: undefined, done: true });
|
|
2500
|
+
}
|
|
2501
|
+
};
|
|
2502
|
+
completionCallbacks.add(onComplete);
|
|
2503
|
+
if (signal) {
|
|
2504
|
+
onAbort = () => {
|
|
2505
|
+
done = true;
|
|
2506
|
+
completionCallbacks.delete(onComplete);
|
|
2507
|
+
unsub();
|
|
2508
|
+
if (resolve) {
|
|
2509
|
+
const r = resolve;
|
|
2510
|
+
resolve = null;
|
|
2511
|
+
r({ value: undefined, done: true });
|
|
2512
|
+
}
|
|
2513
|
+
};
|
|
2514
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
2515
|
+
if (signal.aborted)
|
|
2516
|
+
onAbort();
|
|
2517
|
+
}
|
|
2518
|
+
const iterator = {
|
|
2519
|
+
[Symbol.asyncIterator]() {
|
|
2520
|
+
return this;
|
|
2521
|
+
},
|
|
2522
|
+
async next() {
|
|
2523
|
+
if (buffer.length > 0) {
|
|
2524
|
+
return { value: buffer.shift(), done: false };
|
|
2525
|
+
}
|
|
2526
|
+
if (resolve !== null) {
|
|
2527
|
+
return Promise.reject(new Error("Concurrent calls to next() are not supported on this async iterator"));
|
|
2528
|
+
}
|
|
2529
|
+
return new Promise((_resolve, _reject) => {
|
|
2530
|
+
if (hasOverflow) {
|
|
2531
|
+
hasOverflow = false;
|
|
2532
|
+
_reject(new BufferOverflowError(type, bufferSize));
|
|
2533
|
+
return;
|
|
2534
|
+
}
|
|
2535
|
+
if (done) {
|
|
2536
|
+
_resolve({
|
|
2537
|
+
value: undefined,
|
|
2538
|
+
done: true
|
|
2539
|
+
});
|
|
2540
|
+
return;
|
|
2541
|
+
}
|
|
2542
|
+
resolve = _resolve;
|
|
2543
|
+
});
|
|
2544
|
+
},
|
|
2545
|
+
return() {
|
|
2546
|
+
if (resolve) {
|
|
2547
|
+
const r = resolve;
|
|
2548
|
+
resolve = null;
|
|
2549
|
+
r({ value: undefined, done: true });
|
|
2550
|
+
}
|
|
2551
|
+
done = true;
|
|
2552
|
+
completionCallbacks.delete(onComplete);
|
|
2553
|
+
unsub();
|
|
2554
|
+
cleanupAbortListener();
|
|
2555
|
+
return Promise.resolve({
|
|
2556
|
+
value: undefined,
|
|
2557
|
+
done: true
|
|
2558
|
+
});
|
|
2559
|
+
}
|
|
2560
|
+
};
|
|
2561
|
+
return iterator;
|
|
2562
|
+
}
|
|
2563
|
+
const target = {
|
|
2564
|
+
addEventListener,
|
|
2565
|
+
removeEventListener,
|
|
2566
|
+
dispatchEvent,
|
|
2567
|
+
clear,
|
|
2568
|
+
on,
|
|
2569
|
+
once: onceMethod,
|
|
2570
|
+
removeAllListeners,
|
|
2571
|
+
pipe,
|
|
2572
|
+
addWildcardListener,
|
|
2573
|
+
removeWildcardListener,
|
|
2574
|
+
complete: complete2,
|
|
2575
|
+
get completed() {
|
|
2576
|
+
return isCompleted;
|
|
2577
|
+
},
|
|
2578
|
+
subscribe,
|
|
2579
|
+
toObservable,
|
|
2580
|
+
events
|
|
2581
|
+
};
|
|
2582
|
+
target[SymbolObservable] = () => {
|
|
2583
|
+
return toObservable();
|
|
2584
|
+
};
|
|
2585
|
+
return target;
|
|
2586
|
+
}
|
|
2587
|
+
|
|
2588
|
+
class EventEmission {
|
|
2589
|
+
#target;
|
|
2590
|
+
constructor() {
|
|
2591
|
+
this.#target = createEventTarget();
|
|
2592
|
+
}
|
|
2593
|
+
addEventListener(type, listener, options) {
|
|
2594
|
+
return this.#target.addEventListener(type, listener, options);
|
|
2595
|
+
}
|
|
2596
|
+
removeEventListener(type, listener, options) {
|
|
2597
|
+
this.#target.removeEventListener(type, listener, options);
|
|
2598
|
+
}
|
|
2599
|
+
dispatchEvent(event) {
|
|
2600
|
+
return this.#target.dispatchEvent(event);
|
|
2601
|
+
}
|
|
2602
|
+
on(type, options) {
|
|
2603
|
+
return this.#target.on(type, options);
|
|
2604
|
+
}
|
|
2605
|
+
once(type, listener, options) {
|
|
2606
|
+
return this.#target.once(type, listener, options);
|
|
2607
|
+
}
|
|
2608
|
+
removeAllListeners(type) {
|
|
2609
|
+
this.#target.removeAllListeners(type);
|
|
2610
|
+
}
|
|
2611
|
+
clear() {
|
|
2612
|
+
this.#target.clear();
|
|
2613
|
+
}
|
|
2614
|
+
pipe(target, mapFn) {
|
|
2615
|
+
return this.#target.pipe(target, mapFn);
|
|
2616
|
+
}
|
|
2617
|
+
addWildcardListener(pattern, listener, options) {
|
|
2618
|
+
return this.#target.addWildcardListener(pattern, listener, options);
|
|
2619
|
+
}
|
|
2620
|
+
removeWildcardListener(pattern, listener) {
|
|
2621
|
+
this.#target.removeWildcardListener(pattern, listener);
|
|
2622
|
+
}
|
|
2623
|
+
subscribe(typeOrObserver, observerOrNext, error2, completeHandler) {
|
|
2624
|
+
if (typeof typeOrObserver === "string") {
|
|
2625
|
+
return this.#target.subscribe(typeOrObserver, observerOrNext, error2, completeHandler);
|
|
2626
|
+
}
|
|
2627
|
+
if (typeof typeOrObserver === "function") {
|
|
2628
|
+
return this.#target.toObservable().subscribe(typeOrObserver);
|
|
2629
|
+
}
|
|
2630
|
+
if (typeof typeOrObserver === "object" && typeOrObserver !== null) {
|
|
2631
|
+
const maybeObserver = typeOrObserver;
|
|
2632
|
+
if (typeof maybeObserver.next === "function" || typeof maybeObserver.error === "function" || typeof maybeObserver.complete === "function") {
|
|
2633
|
+
return this.#target.toObservable().subscribe(typeOrObserver);
|
|
2634
|
+
}
|
|
2635
|
+
return this.#target.toObservable().subscribe({});
|
|
2636
|
+
}
|
|
2637
|
+
throw new Error("subscribe() requires a string event type, callback function, or observer object");
|
|
2638
|
+
}
|
|
2639
|
+
toObservable() {
|
|
2640
|
+
return this.#target.toObservable();
|
|
2641
|
+
}
|
|
2642
|
+
[SymbolObservable]() {
|
|
2643
|
+
return this.toObservable();
|
|
2644
|
+
}
|
|
2645
|
+
complete() {
|
|
2646
|
+
this.#target.complete();
|
|
2647
|
+
}
|
|
2648
|
+
get completed() {
|
|
2649
|
+
return this.#target.completed;
|
|
2650
|
+
}
|
|
2651
|
+
events(type, options) {
|
|
2652
|
+
return this.#target.events(type, options);
|
|
2653
|
+
}
|
|
2654
|
+
}
|
|
2655
|
+
|
|
2656
|
+
// src/history.ts
|
|
1119
2657
|
class ConversationHistory extends EventTarget {
|
|
1120
2658
|
currentNode;
|
|
1121
2659
|
environment;
|
|
2660
|
+
events;
|
|
1122
2661
|
constructor(initial = createConversation(), environment) {
|
|
1123
2662
|
super();
|
|
1124
2663
|
this.environment = resolveConversationEnvironment(environment);
|
|
2664
|
+
this.events = createEventTarget();
|
|
1125
2665
|
this.currentNode = {
|
|
1126
2666
|
conversation: initial,
|
|
1127
2667
|
parent: null,
|
|
@@ -1133,25 +2673,54 @@ class ConversationHistory extends EventTarget {
|
|
|
1133
2673
|
type,
|
|
1134
2674
|
conversation: this.current
|
|
1135
2675
|
};
|
|
1136
|
-
this.dispatchEvent(
|
|
1137
|
-
this.dispatchEvent(
|
|
2676
|
+
this.events.dispatchEvent({ type: "change", detail });
|
|
2677
|
+
this.events.dispatchEvent({ type, detail });
|
|
2678
|
+
}
|
|
2679
|
+
toAddListenerOptions(options) {
|
|
2680
|
+
if (typeof options === "boolean" || options === undefined)
|
|
2681
|
+
return options;
|
|
2682
|
+
const mapped = {};
|
|
2683
|
+
if (options.capture !== undefined)
|
|
2684
|
+
mapped.capture = options.capture;
|
|
2685
|
+
if (options.once !== undefined)
|
|
2686
|
+
mapped.once = options.once;
|
|
2687
|
+
if (options.passive !== undefined)
|
|
2688
|
+
mapped.passive = options.passive;
|
|
2689
|
+
if (options.signal !== undefined) {
|
|
2690
|
+
mapped.signal = options.signal;
|
|
2691
|
+
}
|
|
2692
|
+
return mapped;
|
|
2693
|
+
}
|
|
2694
|
+
toRemoveListenerOptions(options) {
|
|
2695
|
+
if (typeof options === "boolean" || options === undefined)
|
|
2696
|
+
return options;
|
|
2697
|
+
const mapped = {};
|
|
2698
|
+
if (options.capture !== undefined)
|
|
2699
|
+
mapped.capture = options.capture;
|
|
2700
|
+
return mapped;
|
|
1138
2701
|
}
|
|
1139
2702
|
addEventListener(type, callback, options) {
|
|
1140
2703
|
if (!callback)
|
|
1141
2704
|
return;
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
2705
|
+
return this.events.addEventListener(type, callback, this.toAddListenerOptions(options));
|
|
2706
|
+
}
|
|
2707
|
+
removeEventListener(type, callback, options) {
|
|
2708
|
+
if (!callback)
|
|
2709
|
+
return;
|
|
2710
|
+
this.events.removeEventListener(type, callback, this.toRemoveListenerOptions(options));
|
|
2711
|
+
}
|
|
2712
|
+
dispatchEvent(event) {
|
|
2713
|
+
return this.events.dispatchEvent(event);
|
|
1145
2714
|
}
|
|
1146
2715
|
subscribe(run) {
|
|
1147
2716
|
run(this.current);
|
|
1148
2717
|
const handler = (event) => {
|
|
1149
|
-
if (event
|
|
2718
|
+
if (event?.detail?.conversation) {
|
|
1150
2719
|
run(event.detail.conversation);
|
|
1151
2720
|
}
|
|
1152
2721
|
};
|
|
1153
|
-
const
|
|
1154
|
-
return
|
|
2722
|
+
const unsubscribe2 = this.addEventListener("change", handler);
|
|
2723
|
+
return unsubscribe2 || (() => {});
|
|
1155
2724
|
}
|
|
1156
2725
|
getSnapshot() {
|
|
1157
2726
|
return this.current;
|
|
@@ -1182,9 +2751,9 @@ class ConversationHistory extends EventTarget {
|
|
|
1182
2751
|
get redoCount() {
|
|
1183
2752
|
return this.currentNode.children.length;
|
|
1184
2753
|
}
|
|
1185
|
-
push(
|
|
2754
|
+
push(next2) {
|
|
1186
2755
|
const newNode = {
|
|
1187
|
-
conversation:
|
|
2756
|
+
conversation: next2,
|
|
1188
2757
|
parent: this.currentNode,
|
|
1189
2758
|
children: []
|
|
1190
2759
|
};
|
|
@@ -1201,9 +2770,9 @@ class ConversationHistory extends EventTarget {
|
|
|
1201
2770
|
return;
|
|
1202
2771
|
}
|
|
1203
2772
|
redo(childIndex = 0) {
|
|
1204
|
-
const
|
|
1205
|
-
if (
|
|
1206
|
-
this.currentNode =
|
|
2773
|
+
const next2 = this.currentNode.children[childIndex];
|
|
2774
|
+
if (next2) {
|
|
2775
|
+
this.currentNode = next2;
|
|
1207
2776
|
this.notifyChange("redo");
|
|
1208
2777
|
return this.current;
|
|
1209
2778
|
}
|
|
@@ -1368,7 +2937,7 @@ class ConversationHistory extends EventTarget {
|
|
|
1368
2937
|
return (...args) => {
|
|
1369
2938
|
const boundFn = fn;
|
|
1370
2939
|
const result = boundFn(this.current, ...args, this.env);
|
|
1371
|
-
if (
|
|
2940
|
+
if (isConversation2(result)) {
|
|
1372
2941
|
this.push(result);
|
|
1373
2942
|
}
|
|
1374
2943
|
return result;
|
|
@@ -1390,9 +2959,10 @@ class ConversationHistory extends EventTarget {
|
|
|
1390
2959
|
};
|
|
1391
2960
|
if (root)
|
|
1392
2961
|
clearNode(root);
|
|
2962
|
+
this.events.clear();
|
|
1393
2963
|
}
|
|
1394
2964
|
}
|
|
1395
|
-
function
|
|
2965
|
+
function isConversation2(value) {
|
|
1396
2966
|
return value !== null && typeof value === "object" && typeof value.schemaVersion === "number" && typeof value.id === "string" && typeof value.status === "string" && value.metadata !== null && typeof value.metadata === "object" && Array.isArray(value.ids) && typeof value.messages === "object" && value.messages !== null && !Array.isArray(value.messages) && typeof value.createdAt === "string" && typeof value.updatedAt === "string";
|
|
1397
2967
|
}
|
|
1398
2968
|
export {
|
|
@@ -1417,12 +2987,22 @@ export {
|
|
|
1417
2987
|
pairToolCallsWithResults,
|
|
1418
2988
|
normalizeContent,
|
|
1419
2989
|
multiModalContentSchema,
|
|
2990
|
+
messageSchema,
|
|
1420
2991
|
messageRoleSchema,
|
|
1421
|
-
messageJSONSchema,
|
|
1422
2992
|
messageInputSchema,
|
|
1423
2993
|
jsonValueSchema,
|
|
1424
2994
|
isTransientKey,
|
|
2995
|
+
isToolResult,
|
|
2996
|
+
isToolCall,
|
|
2997
|
+
isTokenUsage,
|
|
1425
2998
|
isStreamingMessage,
|
|
2999
|
+
isMultiModalContent,
|
|
3000
|
+
isMessageRole,
|
|
3001
|
+
isMessageInput,
|
|
3002
|
+
isMessage,
|
|
3003
|
+
isJSONValue,
|
|
3004
|
+
isConversationStatus,
|
|
3005
|
+
isConversation,
|
|
1426
3006
|
isAssistantMessage,
|
|
1427
3007
|
hasSystemMessage,
|
|
1428
3008
|
getSystemMessages,
|
|
@@ -1462,4 +3042,4 @@ export {
|
|
|
1462
3042
|
ConversationHistory
|
|
1463
3043
|
};
|
|
1464
3044
|
|
|
1465
|
-
//# debugId=
|
|
3045
|
+
//# debugId=684D5332D9139AFC64756E2164756E21
|