@dxos/util 0.8.4-main.8360d9e660 → 0.8.4-main.8baae0fced
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/LICENSE +102 -5
- package/dist/lib/browser/index.mjs +276 -152
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +276 -152
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/array-to-hex.d.ts.map +1 -1
- package/dist/types/src/array.d.ts.map +1 -1
- package/dist/types/src/binder.d.ts.map +1 -1
- package/dist/types/src/bitfield.d.ts.map +1 -1
- package/dist/types/src/browser-storage.d.ts +9 -0
- package/dist/types/src/browser-storage.d.ts.map +1 -0
- package/dist/types/src/callback-collection.d.ts.map +1 -1
- package/dist/types/src/callback.d.ts.map +1 -1
- package/dist/types/src/case.d.ts.map +1 -1
- package/dist/types/src/chunk-array.d.ts.map +1 -1
- package/dist/types/src/circular-buffer.d.ts.map +1 -1
- package/dist/types/src/clear-undefined.d.ts.map +1 -1
- package/dist/types/src/complex.d.ts +15 -0
- package/dist/types/src/complex.d.ts.map +1 -1
- package/dist/types/src/composite-key.d.ts +10 -0
- package/dist/types/src/composite-key.d.ts.map +1 -0
- package/dist/types/src/composite-key.test.d.ts +2 -0
- package/dist/types/src/composite-key.test.d.ts.map +1 -0
- package/dist/types/src/deep.d.ts.map +1 -1
- package/dist/types/src/defer-function.d.ts.map +1 -1
- package/dist/types/src/defer.d.ts.map +1 -1
- package/dist/types/src/di-container.d.ts.map +1 -1
- package/dist/types/src/di-key.d.ts +7 -5
- package/dist/types/src/di-key.d.ts.map +1 -1
- package/dist/types/src/entry.d.ts.map +1 -1
- package/dist/types/src/error-format.d.ts.map +1 -1
- package/dist/types/src/filename.d.ts.map +1 -1
- package/dist/types/src/for-each-async.d.ts.map +1 -1
- package/dist/types/src/human-hash.d.ts.map +1 -1
- package/dist/types/src/id.d.ts +30 -0
- package/dist/types/src/id.d.ts.map +1 -0
- package/dist/types/src/id.test.d.ts +2 -0
- package/dist/types/src/id.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +5 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/instance-id.d.ts.map +1 -1
- package/dist/types/src/interval.d.ts.map +1 -1
- package/dist/types/src/join-tables.d.ts.map +1 -1
- package/dist/types/src/json.d.ts.map +1 -1
- package/dist/types/src/map-values.d.ts.map +1 -1
- package/dist/types/src/map.d.ts.map +1 -1
- package/dist/types/src/object.d.ts.map +1 -1
- package/dist/types/src/order-keys.d.ts.map +1 -1
- package/dist/types/src/order.d.ts.map +1 -1
- package/dist/types/src/pick.d.ts.map +1 -1
- package/dist/types/src/platform.d.ts +1 -1
- package/dist/types/src/position.d.ts +5 -5
- package/dist/types/src/position.d.ts.map +1 -1
- package/dist/types/src/random.d.ts.map +1 -1
- package/dist/types/src/range.d.ts.map +1 -1
- package/dist/types/src/reducers.d.ts.map +1 -1
- package/dist/types/src/remove-undefined-keys.d.ts.map +1 -1
- package/dist/types/src/retry.d.ts.map +1 -1
- package/dist/types/src/safe-await.d.ts.map +1 -1
- package/dist/types/src/safe-instanceof.d.ts.map +1 -1
- package/dist/types/src/safe-parse.d.ts.map +1 -1
- package/dist/types/src/safe-stringify.d.ts.map +1 -1
- package/dist/types/src/sliding-window-summary.d.ts.map +1 -1
- package/dist/types/src/sort.d.ts.map +1 -1
- package/dist/types/src/string.d.ts.map +1 -1
- package/dist/types/src/sum.d.ts.map +1 -1
- package/dist/types/src/throw-unhandled-error.d.ts.map +1 -1
- package/dist/types/src/to-fallback.d.ts +4 -4
- package/dist/types/src/to-fallback.d.ts.map +1 -1
- package/dist/types/src/tracer.d.ts.map +1 -1
- package/dist/types/src/tree.d.ts.map +1 -1
- package/dist/types/src/types.d.ts.map +1 -1
- package/dist/types/src/uint8array.d.ts +27 -0
- package/dist/types/src/uint8array.d.ts.map +1 -1
- package/dist/types/src/unit.d.ts.map +1 -1
- package/dist/types/src/url.d.ts.map +1 -1
- package/dist/types/src/weak.d.ts +15 -0
- package/dist/types/src/weak.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -10
- package/src/browser-storage.ts +60 -0
- package/src/complex.ts +32 -0
- package/src/composite-key.test.ts +31 -0
- package/src/composite-key.ts +16 -0
- package/src/di-key.ts +10 -8
- package/src/error-format.ts +3 -1
- package/src/id.test.ts +109 -0
- package/src/id.ts +48 -0
- package/src/index.ts +5 -2
- package/src/map-values.ts +6 -0
- package/src/position.test.ts +38 -44
- package/src/position.ts +7 -11
- package/src/string.ts +6 -2
- package/src/uint8array.ts +44 -0
- package/src/unit.ts +6 -2
- package/src/weak.ts +52 -14
|
@@ -119,7 +119,6 @@ var createBinder = (obj) => ({
|
|
|
119
119
|
|
|
120
120
|
// src/bitfield.ts
|
|
121
121
|
import { invariant } from "@dxos/invariant";
|
|
122
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/common/util/src/bitfield.ts";
|
|
123
122
|
var BitField = class _BitField {
|
|
124
123
|
static get(data, idx) {
|
|
125
124
|
const bit = data[idx >> 3] >> 7 - idx % 8 & 1;
|
|
@@ -151,15 +150,7 @@ var BitField = class _BitField {
|
|
|
151
150
|
return result;
|
|
152
151
|
}
|
|
153
152
|
static and(first, second) {
|
|
154
|
-
invariant(first.length === second.length, "Bitfields must be of the same length"
|
|
155
|
-
F: __dxlog_file,
|
|
156
|
-
L: 52,
|
|
157
|
-
S: this,
|
|
158
|
-
A: [
|
|
159
|
-
"first.length === second.length",
|
|
160
|
-
"'Bitfields must be of the same length'"
|
|
161
|
-
]
|
|
162
|
-
});
|
|
153
|
+
invariant(first.length === second.length, "Bitfields must be of the same length");
|
|
163
154
|
const result = new Uint8Array(first.length);
|
|
164
155
|
for (let i = 0; i < first.length; i++) {
|
|
165
156
|
result[i] = first[i] & second[i];
|
|
@@ -187,6 +178,49 @@ var BitField = class _BitField {
|
|
|
187
178
|
}
|
|
188
179
|
};
|
|
189
180
|
|
|
181
|
+
// src/browser-storage.ts
|
|
182
|
+
var clearIndexedDB = async () => {
|
|
183
|
+
const dbs = await indexedDB.databases();
|
|
184
|
+
const results = await Promise.allSettled(dbs.filter((db) => db.name != null).map((db) => new Promise((resolve, reject) => {
|
|
185
|
+
const request = indexedDB.deleteDatabase(db.name);
|
|
186
|
+
request.onsuccess = () => resolve();
|
|
187
|
+
request.onerror = () => reject(request.error);
|
|
188
|
+
request.onblocked = () => reject(new Error(`IndexedDB deletion blocked: ${db.name}`));
|
|
189
|
+
})));
|
|
190
|
+
const failures = results.filter((r) => r.status === "rejected");
|
|
191
|
+
if (failures.length > 0) {
|
|
192
|
+
throw new AggregateError(failures.map((r) => r.reason), "Failed to delete some IndexedDB databases");
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
var clearOPFS = async () => {
|
|
196
|
+
const root = await navigator.storage.getDirectory();
|
|
197
|
+
const errors = [];
|
|
198
|
+
for await (const [name] of root.entries()) {
|
|
199
|
+
try {
|
|
200
|
+
await root.removeEntry(name, {
|
|
201
|
+
recursive: true
|
|
202
|
+
});
|
|
203
|
+
} catch (err) {
|
|
204
|
+
errors.push(err);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (errors.length > 0) {
|
|
208
|
+
throw new AggregateError(errors, "Failed to remove some OPFS entries");
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
var clearServiceWorkers = async () => {
|
|
212
|
+
const regs = await navigator.serviceWorker.getRegistrations();
|
|
213
|
+
for (const reg of regs) {
|
|
214
|
+
await reg.unregister();
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
var clearCaches = async () => {
|
|
218
|
+
const keys2 = await caches.keys();
|
|
219
|
+
for (const key of keys2) {
|
|
220
|
+
await caches.delete(key);
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
|
|
190
224
|
// src/callback-collection.ts
|
|
191
225
|
var CallbackCollection = class {
|
|
192
226
|
#callbacks = [];
|
|
@@ -213,34 +247,17 @@ var CallbackCollection = class {
|
|
|
213
247
|
|
|
214
248
|
// src/callback.ts
|
|
215
249
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
216
|
-
var __dxlog_file2 = "/__w/dxos/dxos/packages/common/util/src/callback.ts";
|
|
217
250
|
var Callback = class {
|
|
218
251
|
_callback;
|
|
219
252
|
call(...args) {
|
|
220
|
-
invariant2(this._callback, "Callback not set"
|
|
221
|
-
F: __dxlog_file2,
|
|
222
|
-
L: 20,
|
|
223
|
-
S: this,
|
|
224
|
-
A: [
|
|
225
|
-
"this._callback",
|
|
226
|
-
"'Callback not set'"
|
|
227
|
-
]
|
|
228
|
-
});
|
|
253
|
+
invariant2(this._callback, "Callback not set");
|
|
229
254
|
return this._callback(...args);
|
|
230
255
|
}
|
|
231
256
|
callIfSet(...args) {
|
|
232
257
|
return this._callback?.(...args);
|
|
233
258
|
}
|
|
234
259
|
set(callback) {
|
|
235
|
-
invariant2(!this._callback, "Callback already set"
|
|
236
|
-
F: __dxlog_file2,
|
|
237
|
-
L: 29,
|
|
238
|
-
S: this,
|
|
239
|
-
A: [
|
|
240
|
-
"!this._callback",
|
|
241
|
-
"'Callback already set'"
|
|
242
|
-
]
|
|
243
|
-
});
|
|
260
|
+
invariant2(!this._callback, "Callback already set");
|
|
244
261
|
this._callback = callback;
|
|
245
262
|
}
|
|
246
263
|
isSet() {
|
|
@@ -308,21 +325,12 @@ var chunkArray = (array, size) => {
|
|
|
308
325
|
|
|
309
326
|
// src/circular-buffer.ts
|
|
310
327
|
import { invariant as invariant3 } from "@dxos/invariant";
|
|
311
|
-
var __dxlog_file3 = "/__w/dxos/dxos/packages/common/util/src/circular-buffer.ts";
|
|
312
328
|
var CircularBuffer = class {
|
|
313
329
|
_buffer;
|
|
314
330
|
_nextIndex = 0;
|
|
315
331
|
_elementCount = 0;
|
|
316
332
|
constructor(size) {
|
|
317
|
-
invariant3(size >= 1
|
|
318
|
-
F: __dxlog_file3,
|
|
319
|
-
L: 13,
|
|
320
|
-
S: this,
|
|
321
|
-
A: [
|
|
322
|
-
"size >= 1",
|
|
323
|
-
""
|
|
324
|
-
]
|
|
325
|
-
});
|
|
333
|
+
invariant3(size >= 1);
|
|
326
334
|
this._buffer = new Array(size);
|
|
327
335
|
}
|
|
328
336
|
push(element) {
|
|
@@ -532,6 +540,36 @@ var ComplexMap = class _ComplexMap {
|
|
|
532
540
|
this._values.set(primitive, value);
|
|
533
541
|
return this;
|
|
534
542
|
}
|
|
543
|
+
/**
|
|
544
|
+
* Returns the value for the given key if present, otherwise inserts and returns the default value.
|
|
545
|
+
* @param key - The key to look up or insert.
|
|
546
|
+
* @param defaultValue - The value to insert if the key is not present.
|
|
547
|
+
* @returns The existing or newly inserted value.
|
|
548
|
+
*/
|
|
549
|
+
getOrInsert(key, defaultValue) {
|
|
550
|
+
const primitive = this._keyProjection(key);
|
|
551
|
+
if (this._values.has(primitive)) {
|
|
552
|
+
return this._values.get(primitive);
|
|
553
|
+
}
|
|
554
|
+
this.set(key, defaultValue);
|
|
555
|
+
return defaultValue;
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Returns the value for the given key if present, otherwise computes, inserts, and returns a new value.
|
|
559
|
+
* The callback is only invoked when the key is missing.
|
|
560
|
+
* @param key - The key to look up or insert.
|
|
561
|
+
* @param callbackfn - Function to compute the value if the key is not present.
|
|
562
|
+
* @returns The existing or newly computed value.
|
|
563
|
+
*/
|
|
564
|
+
getOrInsertComputed(key, callbackfn) {
|
|
565
|
+
const primitive = this._keyProjection(key);
|
|
566
|
+
if (this._values.has(primitive)) {
|
|
567
|
+
return this._values.get(primitive);
|
|
568
|
+
}
|
|
569
|
+
const value = callbackfn(key);
|
|
570
|
+
this.set(key, value);
|
|
571
|
+
return value;
|
|
572
|
+
}
|
|
535
573
|
get size() {
|
|
536
574
|
return this._keys.size;
|
|
537
575
|
}
|
|
@@ -571,19 +609,15 @@ var makeMap = (keyProjection) => class BoundComplexMap extends ComplexMap {
|
|
|
571
609
|
}
|
|
572
610
|
};
|
|
573
611
|
|
|
612
|
+
// src/composite-key.ts
|
|
613
|
+
var SEPARATOR = ":";
|
|
614
|
+
var compositeKey = (...parts) => parts.join(SEPARATOR);
|
|
615
|
+
var splitCompositeKey = (key) => key.split(SEPARATOR);
|
|
616
|
+
|
|
574
617
|
// src/deep.ts
|
|
575
618
|
import { invariant as invariant4 } from "@dxos/invariant";
|
|
576
|
-
var __dxlog_file4 = "/__w/dxos/dxos/packages/common/util/src/deep.ts";
|
|
577
619
|
var setDeep = (obj, path, value) => {
|
|
578
|
-
invariant4(path.length > 0
|
|
579
|
-
F: __dxlog_file4,
|
|
580
|
-
L: 12,
|
|
581
|
-
S: void 0,
|
|
582
|
-
A: [
|
|
583
|
-
"path.length > 0",
|
|
584
|
-
""
|
|
585
|
-
]
|
|
586
|
-
});
|
|
620
|
+
invariant4(path.length > 0);
|
|
587
621
|
let parent = obj;
|
|
588
622
|
for (const key of path.slice(0, -1)) {
|
|
589
623
|
if (parent[key] === void 0) {
|
|
@@ -668,6 +702,23 @@ var MapEntry = class {
|
|
|
668
702
|
}
|
|
669
703
|
};
|
|
670
704
|
|
|
705
|
+
// src/error-format.ts
|
|
706
|
+
var formatErrorWithCauses = (error) => {
|
|
707
|
+
const lines = [];
|
|
708
|
+
let current = error;
|
|
709
|
+
let level = 0;
|
|
710
|
+
while (current) {
|
|
711
|
+
const prefix = level === 0 ? "" : `Caused by: `;
|
|
712
|
+
lines.push(prefix + (current.stack ?? String(current)));
|
|
713
|
+
if (!(current.cause instanceof Error)) {
|
|
714
|
+
break;
|
|
715
|
+
}
|
|
716
|
+
current = current.cause;
|
|
717
|
+
level += 1;
|
|
718
|
+
}
|
|
719
|
+
return lines.join("\n\n");
|
|
720
|
+
};
|
|
721
|
+
|
|
671
722
|
// src/filename.ts
|
|
672
723
|
var createFilename = ({ parts = [], ext, date = /* @__PURE__ */ new Date() }) => [
|
|
673
724
|
date.toISOString().replace(/[:.]/g, "-"),
|
|
@@ -1009,6 +1060,19 @@ var humanize = (value) => {
|
|
|
1009
1060
|
return hasher.humanize(value);
|
|
1010
1061
|
};
|
|
1011
1062
|
|
|
1063
|
+
// src/id.ts
|
|
1064
|
+
var PART = /^[a-zA-Z][a-zA-Z0-9]{0,62}$/;
|
|
1065
|
+
var ID = /^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\.[a-zA-Z]([a-zA-Z0-9]{0,62})?)$/;
|
|
1066
|
+
function id(strings, ...values) {
|
|
1067
|
+
const raw = strings.reduce((out, str, i) => out + str + (i < values.length ? String(values[i]) : ""), "");
|
|
1068
|
+
if (!ID.test(raw)) {
|
|
1069
|
+
throw new Error(`Invalid id (expected AT Protocol NSID): ${JSON.stringify(raw)}`);
|
|
1070
|
+
}
|
|
1071
|
+
return raw;
|
|
1072
|
+
}
|
|
1073
|
+
var isWellFormedId = (value) => ID.test(value);
|
|
1074
|
+
var isWellFormedIdPart = (value) => PART.test(value);
|
|
1075
|
+
|
|
1012
1076
|
// src/map.ts
|
|
1013
1077
|
var defaultMap = (map, key, def) => {
|
|
1014
1078
|
let value = map.get(key);
|
|
@@ -1028,12 +1092,12 @@ var getPrototypeSpecificInstanceId = (instance) => {
|
|
|
1028
1092
|
nextId: 0,
|
|
1029
1093
|
instanceIds: /* @__PURE__ */ new WeakMap()
|
|
1030
1094
|
}));
|
|
1031
|
-
let
|
|
1032
|
-
if (
|
|
1033
|
-
|
|
1034
|
-
instanceCtx.instanceIds.set(instance,
|
|
1095
|
+
let id2 = instanceCtx.instanceIds.get(instance);
|
|
1096
|
+
if (id2 === void 0) {
|
|
1097
|
+
id2 = instanceCtx.nextId++;
|
|
1098
|
+
instanceCtx.instanceIds.set(instance, id2);
|
|
1035
1099
|
}
|
|
1036
|
-
return
|
|
1100
|
+
return id2;
|
|
1037
1101
|
};
|
|
1038
1102
|
var getDebugName = (instance) => {
|
|
1039
1103
|
if (instance == null) {
|
|
@@ -1100,6 +1164,26 @@ var bufferToArray = (buffer) => {
|
|
|
1100
1164
|
};
|
|
1101
1165
|
var stringToArray = (string) => bufferToArray(Buffer.from(string, "hex"));
|
|
1102
1166
|
var arrayToString = (array) => arrayToBuffer(array).toString("hex");
|
|
1167
|
+
var toUnpaddedBase64 = (bytes) => arrayToBuffer(bytes).toString("base64").replace(/=+$/, "");
|
|
1168
|
+
var encodeUint8ArrayToJson = (bytes) => ({
|
|
1169
|
+
"/": {
|
|
1170
|
+
bytes: toUnpaddedBase64(bytes)
|
|
1171
|
+
}
|
|
1172
|
+
});
|
|
1173
|
+
var isEncodedUint8Array = (value) => {
|
|
1174
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
1175
|
+
return false;
|
|
1176
|
+
}
|
|
1177
|
+
if (Object.keys(value).length !== 1) {
|
|
1178
|
+
return false;
|
|
1179
|
+
}
|
|
1180
|
+
const inner = value["/"];
|
|
1181
|
+
if (typeof inner !== "object" || inner === null || Array.isArray(inner)) {
|
|
1182
|
+
return false;
|
|
1183
|
+
}
|
|
1184
|
+
return Object.keys(inner).length === 1 && typeof inner.bytes === "string";
|
|
1185
|
+
};
|
|
1186
|
+
var decodeUint8ArrayFromJson = (encoded) => bufferToArray(Buffer.from(encoded["/"].bytes, "base64"));
|
|
1103
1187
|
|
|
1104
1188
|
// src/json.ts
|
|
1105
1189
|
var MAX_DEPTH = 5;
|
|
@@ -1229,6 +1313,8 @@ var DeepMapper = class {
|
|
|
1229
1313
|
res[i] = this._map(value[i], i);
|
|
1230
1314
|
}
|
|
1231
1315
|
return res;
|
|
1316
|
+
} else if (ArrayBuffer.isView(value)) {
|
|
1317
|
+
return value;
|
|
1232
1318
|
} else if (value !== null && typeof value === "object") {
|
|
1233
1319
|
const res = {};
|
|
1234
1320
|
this._cyclic.set(value, res);
|
|
@@ -1270,6 +1356,8 @@ var DeepMapperAsync = class {
|
|
|
1270
1356
|
res[i] = await this._map(value[i], i);
|
|
1271
1357
|
}
|
|
1272
1358
|
return res;
|
|
1359
|
+
} else if (ArrayBuffer.isView(value)) {
|
|
1360
|
+
return value;
|
|
1273
1361
|
} else if (value !== null && typeof value === "object") {
|
|
1274
1362
|
const res = {};
|
|
1275
1363
|
this._cyclic.set(value, res);
|
|
@@ -1314,27 +1402,27 @@ var orderKeys = (obj, order) => {
|
|
|
1314
1402
|
|
|
1315
1403
|
// src/order.ts
|
|
1316
1404
|
var inferObjectOrder = (objectMap, order = []) => {
|
|
1317
|
-
const orderedObjects = order.reduce((acc,
|
|
1318
|
-
if (
|
|
1319
|
-
acc.objects.push(objectMap[
|
|
1320
|
-
acc.ids.add(
|
|
1405
|
+
const orderedObjects = order.reduce((acc, id2) => {
|
|
1406
|
+
if (id2 in objectMap) {
|
|
1407
|
+
acc.objects.push(objectMap[id2]);
|
|
1408
|
+
acc.ids.add(id2);
|
|
1321
1409
|
}
|
|
1322
1410
|
return acc;
|
|
1323
1411
|
}, {
|
|
1324
1412
|
objects: [],
|
|
1325
1413
|
ids: /* @__PURE__ */ new Set()
|
|
1326
1414
|
});
|
|
1327
|
-
const { objects } = Object.keys(objectMap).reduce((acc,
|
|
1328
|
-
if (!acc.ids.has(
|
|
1329
|
-
acc.objects.push(objectMap[
|
|
1415
|
+
const { objects } = Object.keys(objectMap).reduce((acc, id2) => {
|
|
1416
|
+
if (!acc.ids.has(id2)) {
|
|
1417
|
+
acc.objects.push(objectMap[id2]);
|
|
1330
1418
|
}
|
|
1331
1419
|
return acc;
|
|
1332
1420
|
}, orderedObjects);
|
|
1333
1421
|
return objects;
|
|
1334
1422
|
};
|
|
1335
1423
|
var inferRecordOrder = (objectMap, order = []) => {
|
|
1336
|
-
return Object.assign(order.filter((
|
|
1337
|
-
acc[
|
|
1424
|
+
return Object.assign(order.filter((id2) => id2 in objectMap).reduce((acc, id2) => {
|
|
1425
|
+
acc[id2] = null;
|
|
1338
1426
|
return acc;
|
|
1339
1427
|
}, {}), objectMap);
|
|
1340
1428
|
};
|
|
@@ -1420,12 +1508,12 @@ var getHostPlatform = () => {
|
|
|
1420
1508
|
};
|
|
1421
1509
|
|
|
1422
1510
|
// src/position.ts
|
|
1423
|
-
var byPosition = ({ position: a
|
|
1511
|
+
var byPosition = ({ position: a }, { position: b }) => {
|
|
1424
1512
|
if (a === b) {
|
|
1425
1513
|
return 0;
|
|
1426
|
-
} else if (a === "
|
|
1514
|
+
} else if (a === "first" || b === "last") {
|
|
1427
1515
|
return -1;
|
|
1428
|
-
} else if (b === "
|
|
1516
|
+
} else if (b === "first" || a === "last") {
|
|
1429
1517
|
return 1;
|
|
1430
1518
|
} else {
|
|
1431
1519
|
return 0;
|
|
@@ -1578,6 +1666,43 @@ var removeProperties = (root, condition) => {
|
|
|
1578
1666
|
return result;
|
|
1579
1667
|
};
|
|
1580
1668
|
|
|
1669
|
+
// src/retry.ts
|
|
1670
|
+
var DEFAULT_RETRY_OPTIONS = {
|
|
1671
|
+
count: 3,
|
|
1672
|
+
delayMs: 100,
|
|
1673
|
+
exponent: 2,
|
|
1674
|
+
retryOnError: async () => true,
|
|
1675
|
+
retryOnValue: async () => false
|
|
1676
|
+
};
|
|
1677
|
+
var retry = async (options, cb) => {
|
|
1678
|
+
const fullOptions = {
|
|
1679
|
+
...DEFAULT_RETRY_OPTIONS,
|
|
1680
|
+
...options
|
|
1681
|
+
};
|
|
1682
|
+
let numRetries = 0, currentDelay = fullOptions.delayMs;
|
|
1683
|
+
while (true) {
|
|
1684
|
+
let result;
|
|
1685
|
+
try {
|
|
1686
|
+
result = await cb();
|
|
1687
|
+
} catch (err) {
|
|
1688
|
+
if (numRetries > fullOptions.count || !await fullOptions.retryOnError(err)) {
|
|
1689
|
+
throw err;
|
|
1690
|
+
}
|
|
1691
|
+
await new Promise((resolve) => setTimeout(resolve, currentDelay));
|
|
1692
|
+
currentDelay *= fullOptions.exponent;
|
|
1693
|
+
numRetries++;
|
|
1694
|
+
continue;
|
|
1695
|
+
}
|
|
1696
|
+
if (!await fullOptions.retryOnValue(result)) {
|
|
1697
|
+
return result;
|
|
1698
|
+
}
|
|
1699
|
+
await new Promise((resolve) => setTimeout(resolve, currentDelay));
|
|
1700
|
+
currentDelay *= fullOptions.exponent;
|
|
1701
|
+
numRetries++;
|
|
1702
|
+
continue;
|
|
1703
|
+
}
|
|
1704
|
+
};
|
|
1705
|
+
|
|
1581
1706
|
// src/safe-await.ts
|
|
1582
1707
|
var safeAwaitAll = async (source, taskFactory, onError) => {
|
|
1583
1708
|
const failedItems = [];
|
|
@@ -1734,7 +1859,6 @@ var defaultFilter = createReplacer();
|
|
|
1734
1859
|
|
|
1735
1860
|
// src/sliding-window-summary.ts
|
|
1736
1861
|
import { invariant as invariant5 } from "@dxos/invariant";
|
|
1737
|
-
var __dxlog_file5 = "/__w/dxos/dxos/packages/common/util/src/sliding-window-summary.ts";
|
|
1738
1862
|
var SlidingWindowSummary = class {
|
|
1739
1863
|
_buffer;
|
|
1740
1864
|
_sum = 0;
|
|
@@ -1742,15 +1866,7 @@ var SlidingWindowSummary = class {
|
|
|
1742
1866
|
constructor(options) {
|
|
1743
1867
|
this._buffer = new CircularBuffer(options.dataPoints);
|
|
1744
1868
|
if (options.precision != null) {
|
|
1745
|
-
invariant5(options.precision >= 0
|
|
1746
|
-
F: __dxlog_file5,
|
|
1747
|
-
L: 26,
|
|
1748
|
-
S: this,
|
|
1749
|
-
A: [
|
|
1750
|
-
"options.precision >= 0",
|
|
1751
|
-
""
|
|
1752
|
-
]
|
|
1753
|
-
});
|
|
1869
|
+
invariant5(options.precision >= 0);
|
|
1754
1870
|
this._precision = Math.pow(10, options.precision);
|
|
1755
1871
|
}
|
|
1756
1872
|
}
|
|
@@ -1831,8 +1947,12 @@ function trim(strings, ...values) {
|
|
|
1831
1947
|
return out;
|
|
1832
1948
|
}, "");
|
|
1833
1949
|
const lines = raw.split("\n");
|
|
1834
|
-
while (lines.length && !lines[0].trim())
|
|
1835
|
-
|
|
1950
|
+
while (lines.length && !lines[0].trim()) {
|
|
1951
|
+
lines.shift();
|
|
1952
|
+
}
|
|
1953
|
+
while (lines.length && !lines[lines.length - 1].trim()) {
|
|
1954
|
+
lines.pop();
|
|
1955
|
+
}
|
|
1836
1956
|
const minIndent = Math.min(...lines.filter((l) => l.trim()).map((l) => l.match(/^[ \t]*/)?.[0].length ?? 0));
|
|
1837
1957
|
return lines.map((l) => l.slice(minIndent)).join("\n");
|
|
1838
1958
|
}
|
|
@@ -2035,8 +2155,8 @@ var Tracer = class {
|
|
|
2035
2155
|
keys() {
|
|
2036
2156
|
return Array.from(this._events.keys());
|
|
2037
2157
|
}
|
|
2038
|
-
get(
|
|
2039
|
-
const events = this._events.get(
|
|
2158
|
+
get(id2, filter) {
|
|
2159
|
+
const events = this._events.get(id2);
|
|
2040
2160
|
if (filter) {
|
|
2041
2161
|
return events?.filter((event) => Object.entries(filter).every(([key, value]) => event?.value[key] === value));
|
|
2042
2162
|
}
|
|
@@ -2053,11 +2173,11 @@ var Tracer = class {
|
|
|
2053
2173
|
this._recording = false;
|
|
2054
2174
|
return this;
|
|
2055
2175
|
}
|
|
2056
|
-
emit(
|
|
2057
|
-
this._post(this._createEvent(
|
|
2176
|
+
emit(id2, value) {
|
|
2177
|
+
this._post(this._createEvent(id2, value));
|
|
2058
2178
|
}
|
|
2059
|
-
mark(
|
|
2060
|
-
const event = this._createEvent(
|
|
2179
|
+
mark(id2, value) {
|
|
2180
|
+
const event = this._createEvent(id2, value);
|
|
2061
2181
|
const start = performance.now();
|
|
2062
2182
|
return {
|
|
2063
2183
|
start,
|
|
@@ -2067,9 +2187,9 @@ var Tracer = class {
|
|
|
2067
2187
|
}
|
|
2068
2188
|
};
|
|
2069
2189
|
}
|
|
2070
|
-
_createEvent(
|
|
2190
|
+
_createEvent(id2, value) {
|
|
2071
2191
|
const event = {
|
|
2072
|
-
id,
|
|
2192
|
+
id: id2,
|
|
2073
2193
|
timestamp: Date.now()
|
|
2074
2194
|
};
|
|
2075
2195
|
if (value !== void 0) {
|
|
@@ -2167,11 +2287,15 @@ function arraySwap(array, from, to) {
|
|
|
2167
2287
|
var createFormat = (unit) => {
|
|
2168
2288
|
return (n, precision = unit.precision ?? 0) => {
|
|
2169
2289
|
const value = n / unit.quotient;
|
|
2290
|
+
const formattedValue = value.toLocaleString("en-US", {
|
|
2291
|
+
minimumFractionDigits: precision,
|
|
2292
|
+
maximumFractionDigits: precision
|
|
2293
|
+
});
|
|
2170
2294
|
return {
|
|
2171
2295
|
unit,
|
|
2172
2296
|
value,
|
|
2173
|
-
formattedValue
|
|
2174
|
-
toString: () => `${
|
|
2297
|
+
formattedValue,
|
|
2298
|
+
toString: () => `${formattedValue}${unit.symbol}`
|
|
2175
2299
|
};
|
|
2176
2300
|
};
|
|
2177
2301
|
};
|
|
@@ -2276,15 +2400,19 @@ var createUrl = (url, search) => {
|
|
|
2276
2400
|
// src/weak.ts
|
|
2277
2401
|
var WeakDictionary = class {
|
|
2278
2402
|
_internal = /* @__PURE__ */ new Map();
|
|
2279
|
-
_finalization = new FinalizationRegistry((
|
|
2280
|
-
|
|
2403
|
+
_finalization = new FinalizationRegistry(({ key, ref }) => {
|
|
2404
|
+
if (this._internal.get(key) === ref) {
|
|
2405
|
+
this._internal.delete(key);
|
|
2406
|
+
}
|
|
2281
2407
|
});
|
|
2282
2408
|
constructor(entries2) {
|
|
2283
|
-
|
|
2284
|
-
key,
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2409
|
+
if (entries2) {
|
|
2410
|
+
for (const [key, value] of entries2) {
|
|
2411
|
+
const ref = new WeakRef(value);
|
|
2412
|
+
this._internal.set(key, ref);
|
|
2413
|
+
this._register(key, value, ref);
|
|
2414
|
+
}
|
|
2415
|
+
}
|
|
2288
2416
|
}
|
|
2289
2417
|
*entries() {
|
|
2290
2418
|
for (const [key, value] of this._internal) {
|
|
@@ -2324,10 +2452,45 @@ var WeakDictionary = class {
|
|
|
2324
2452
|
return this._internal.get(key)?.deref();
|
|
2325
2453
|
}
|
|
2326
2454
|
set(key, value) {
|
|
2327
|
-
this._internal.
|
|
2328
|
-
|
|
2455
|
+
const previous = this._internal.get(key)?.deref();
|
|
2456
|
+
if (previous) {
|
|
2457
|
+
this._unregister(previous);
|
|
2458
|
+
}
|
|
2459
|
+
const ref = new WeakRef(value);
|
|
2460
|
+
this._internal.set(key, ref);
|
|
2461
|
+
this._register(key, value, ref);
|
|
2329
2462
|
return this;
|
|
2330
2463
|
}
|
|
2464
|
+
/**
|
|
2465
|
+
* Returns the value for the given key if present, otherwise inserts and returns the default value.
|
|
2466
|
+
* @param key - The key to look up or insert.
|
|
2467
|
+
* @param defaultValue - The value to insert if the key is not present.
|
|
2468
|
+
* @returns The existing or newly inserted value.
|
|
2469
|
+
*/
|
|
2470
|
+
getOrInsert(key, defaultValue) {
|
|
2471
|
+
const existing = this.get(key);
|
|
2472
|
+
if (existing !== void 0) {
|
|
2473
|
+
return existing;
|
|
2474
|
+
}
|
|
2475
|
+
this.set(key, defaultValue);
|
|
2476
|
+
return defaultValue;
|
|
2477
|
+
}
|
|
2478
|
+
/**
|
|
2479
|
+
* Returns the value for the given key if present, otherwise computes, inserts, and returns a new value.
|
|
2480
|
+
* The callback is only invoked when the key is missing.
|
|
2481
|
+
* @param key - The key to look up or insert.
|
|
2482
|
+
* @param callbackfn - Function to compute the value if the key is not present.
|
|
2483
|
+
* @returns The existing or newly computed value.
|
|
2484
|
+
*/
|
|
2485
|
+
getOrInsertComputed(key, callbackfn) {
|
|
2486
|
+
const existing = this.get(key);
|
|
2487
|
+
if (existing !== void 0) {
|
|
2488
|
+
return existing;
|
|
2489
|
+
}
|
|
2490
|
+
const value = callbackfn(key);
|
|
2491
|
+
this.set(key, value);
|
|
2492
|
+
return value;
|
|
2493
|
+
}
|
|
2331
2494
|
has(key) {
|
|
2332
2495
|
return this._internal.has(key) && this._internal.get(key).deref() !== void 0;
|
|
2333
2496
|
}
|
|
@@ -2358,67 +2521,16 @@ var WeakDictionary = class {
|
|
|
2358
2521
|
}
|
|
2359
2522
|
});
|
|
2360
2523
|
}
|
|
2361
|
-
_register(key, value) {
|
|
2362
|
-
this._finalization.register(value,
|
|
2363
|
-
|
|
2524
|
+
_register(key, value, ref) {
|
|
2525
|
+
this._finalization.register(value, {
|
|
2526
|
+
key,
|
|
2527
|
+
ref
|
|
2364
2528
|
}, value);
|
|
2365
2529
|
}
|
|
2366
2530
|
_unregister(value) {
|
|
2367
2531
|
this._finalization.unregister(value);
|
|
2368
2532
|
}
|
|
2369
2533
|
};
|
|
2370
|
-
|
|
2371
|
-
// src/error-format.ts
|
|
2372
|
-
var formatErrorWithCauses = (error) => {
|
|
2373
|
-
const lines = [];
|
|
2374
|
-
let current = error;
|
|
2375
|
-
let level = 0;
|
|
2376
|
-
while (current) {
|
|
2377
|
-
const prefix = level === 0 ? "" : `Caused by: `;
|
|
2378
|
-
lines.push(prefix + (current.stack ?? String(current)));
|
|
2379
|
-
if (!(current.cause instanceof Error)) break;
|
|
2380
|
-
current = current.cause;
|
|
2381
|
-
level += 1;
|
|
2382
|
-
}
|
|
2383
|
-
return lines.join("\n\n");
|
|
2384
|
-
};
|
|
2385
|
-
|
|
2386
|
-
// src/retry.ts
|
|
2387
|
-
var DEFAULT_RETRY_OPTIONS = {
|
|
2388
|
-
count: 3,
|
|
2389
|
-
delayMs: 100,
|
|
2390
|
-
exponent: 2,
|
|
2391
|
-
retryOnError: async () => true,
|
|
2392
|
-
retryOnValue: async () => false
|
|
2393
|
-
};
|
|
2394
|
-
var retry = async (options, cb) => {
|
|
2395
|
-
const fullOptions = {
|
|
2396
|
-
...DEFAULT_RETRY_OPTIONS,
|
|
2397
|
-
...options
|
|
2398
|
-
};
|
|
2399
|
-
let numRetries = 0, currentDelay = fullOptions.delayMs;
|
|
2400
|
-
while (true) {
|
|
2401
|
-
let result;
|
|
2402
|
-
try {
|
|
2403
|
-
result = await cb();
|
|
2404
|
-
} catch (err) {
|
|
2405
|
-
if (numRetries > fullOptions.count || !await fullOptions.retryOnError(err)) {
|
|
2406
|
-
throw err;
|
|
2407
|
-
}
|
|
2408
|
-
await new Promise((resolve) => setTimeout(resolve, currentDelay));
|
|
2409
|
-
currentDelay *= fullOptions.exponent;
|
|
2410
|
-
numRetries++;
|
|
2411
|
-
continue;
|
|
2412
|
-
}
|
|
2413
|
-
if (!await fullOptions.retryOnValue(result)) {
|
|
2414
|
-
return result;
|
|
2415
|
-
}
|
|
2416
|
-
await new Promise((resolve) => setTimeout(resolve, currentDelay));
|
|
2417
|
-
currentDelay *= fullOptions.exponent;
|
|
2418
|
-
numRetries++;
|
|
2419
|
-
continue;
|
|
2420
|
-
}
|
|
2421
|
-
};
|
|
2422
2534
|
export {
|
|
2423
2535
|
BitField,
|
|
2424
2536
|
Callback,
|
|
@@ -2446,12 +2558,17 @@ export {
|
|
|
2446
2558
|
capitalize,
|
|
2447
2559
|
chunkArray,
|
|
2448
2560
|
clamp,
|
|
2561
|
+
clearCaches,
|
|
2562
|
+
clearIndexedDB,
|
|
2563
|
+
clearOPFS,
|
|
2564
|
+
clearServiceWorkers,
|
|
2449
2565
|
clearUndefined,
|
|
2450
2566
|
coerceArray,
|
|
2451
2567
|
compareMulti,
|
|
2452
2568
|
compareObject,
|
|
2453
2569
|
compareScalar,
|
|
2454
2570
|
compareString,
|
|
2571
|
+
compositeKey,
|
|
2455
2572
|
createBinder,
|
|
2456
2573
|
createBucketReducer,
|
|
2457
2574
|
createFilename,
|
|
@@ -2460,6 +2577,7 @@ export {
|
|
|
2460
2577
|
createSetDispatch,
|
|
2461
2578
|
createUrl,
|
|
2462
2579
|
decamelize,
|
|
2580
|
+
decodeUint8ArrayFromJson,
|
|
2463
2581
|
deepMapValues,
|
|
2464
2582
|
deepMapValuesAsync,
|
|
2465
2583
|
defaultFilter,
|
|
@@ -2470,6 +2588,7 @@ export {
|
|
|
2470
2588
|
diff,
|
|
2471
2589
|
distinctBy,
|
|
2472
2590
|
doAsync,
|
|
2591
|
+
encodeUint8ArrayToJson,
|
|
2473
2592
|
entries,
|
|
2474
2593
|
entry,
|
|
2475
2594
|
exponentialBackoffInterval,
|
|
@@ -2487,6 +2606,7 @@ export {
|
|
|
2487
2606
|
hexToHue,
|
|
2488
2607
|
humanize,
|
|
2489
2608
|
hyphenize,
|
|
2609
|
+
id,
|
|
2490
2610
|
idEmoji,
|
|
2491
2611
|
idHue,
|
|
2492
2612
|
inferObjectOrder,
|
|
@@ -2495,12 +2615,15 @@ export {
|
|
|
2495
2615
|
intersection,
|
|
2496
2616
|
iosCheck,
|
|
2497
2617
|
isBun,
|
|
2618
|
+
isEncodedUint8Array,
|
|
2498
2619
|
isMobile,
|
|
2499
2620
|
isMobileOrTablet,
|
|
2500
2621
|
isNode,
|
|
2501
2622
|
isNonNullable,
|
|
2502
2623
|
isTauri,
|
|
2503
2624
|
isTruthy,
|
|
2625
|
+
isWellFormedId,
|
|
2626
|
+
isWellFormedIdPart,
|
|
2504
2627
|
joinTables,
|
|
2505
2628
|
jsonKeyReplacer,
|
|
2506
2629
|
jsonReplacer,
|
|
@@ -2541,6 +2664,7 @@ export {
|
|
|
2541
2664
|
safeUrl,
|
|
2542
2665
|
setDeep,
|
|
2543
2666
|
sortKeys,
|
|
2667
|
+
splitCompositeKey,
|
|
2544
2668
|
stringToArray,
|
|
2545
2669
|
stringifyTree,
|
|
2546
2670
|
stripUndefined,
|