@dxos/keys 0.8.4-main.fdfb99ef29 → 0.8.4-staging.60fe92afc8

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.
Files changed (50) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/index.mjs +292 -341
  3. package/dist/lib/browser/index.mjs.map +4 -4
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/node-esm/index.mjs +287 -339
  6. package/dist/lib/node-esm/index.mjs.map +4 -4
  7. package/dist/lib/node-esm/meta.json +1 -1
  8. package/dist/types/src/DXN.d.ts +50 -0
  9. package/dist/types/src/DXN.d.ts.map +1 -0
  10. package/dist/types/src/DXN.test.d.ts +2 -0
  11. package/dist/types/src/DXN.test.d.ts.map +1 -0
  12. package/dist/types/src/EID.d.ts +74 -0
  13. package/dist/types/src/EID.d.ts.map +1 -0
  14. package/dist/types/src/EID.test.d.ts +2 -0
  15. package/dist/types/src/EID.test.d.ts.map +1 -0
  16. package/dist/types/src/URI.d.ts +23 -0
  17. package/dist/types/src/URI.d.ts.map +1 -0
  18. package/dist/types/src/entity-id.d.ts +104 -0
  19. package/dist/types/src/entity-id.d.ts.map +1 -0
  20. package/dist/types/src/entity-id.test.d.ts +2 -0
  21. package/dist/types/src/entity-id.test.d.ts.map +1 -0
  22. package/dist/types/src/identity-did.d.ts +6 -4
  23. package/dist/types/src/identity-did.d.ts.map +1 -1
  24. package/dist/types/src/index.d.ts +5 -2
  25. package/dist/types/src/index.d.ts.map +1 -1
  26. package/dist/types/src/parse-id.d.ts +10 -0
  27. package/dist/types/src/parse-id.d.ts.map +1 -0
  28. package/dist/types/src/parse-id.test.d.ts +2 -0
  29. package/dist/types/src/parse-id.test.d.ts.map +1 -0
  30. package/dist/types/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +7 -7
  32. package/src/DXN.test.ts +85 -0
  33. package/src/DXN.ts +104 -0
  34. package/src/EID.test.ts +147 -0
  35. package/src/EID.ts +151 -0
  36. package/src/URI.ts +35 -0
  37. package/src/entity-id.test.ts +73 -0
  38. package/src/entity-id.ts +202 -0
  39. package/src/identity-did.test.ts +19 -2
  40. package/src/identity-did.ts +60 -25
  41. package/src/index.ts +6 -2
  42. package/src/parse-id.test.ts +32 -0
  43. package/src/parse-id.ts +32 -0
  44. package/src/public-key.ts +2 -2
  45. package/dist/types/src/dxn.d.ts +0 -129
  46. package/dist/types/src/dxn.d.ts.map +0 -1
  47. package/dist/types/src/object-id.d.ts +0 -65
  48. package/dist/types/src/object-id.d.ts.map +0 -1
  49. package/src/dxn.ts +0 -345
  50. package/src/object-id.ts +0 -131
@@ -14,6 +14,10 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
14
14
  var __commonJS = (cb, mod) => function __require2() {
15
15
  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
16
16
  };
17
+ var __export = (target, all) => {
18
+ for (var name in all)
19
+ __defProp(target, name, { get: all[name], enumerable: true });
20
+ };
17
21
  var __copyProps = (to, from, except, desc) => {
18
22
  if (from && typeof from === "object" || typeof from === "function") {
19
23
  for (let key of __getOwnPropNames(from))
@@ -81,74 +85,144 @@ var require_base32_decode = __commonJS({
81
85
  }
82
86
  });
83
87
 
84
- // src/dxn.ts
85
- import * as Schema3 from "effect/Schema";
86
- import { devtoolsFormatter, inspectCustom } from "@dxos/debug";
87
- import { assertArgument, invariant as invariant2 } from "@dxos/invariant";
88
-
89
- // src/object-id.ts
90
- import * as Schema from "effect/Schema";
91
- import { monotonicFactory } from "ulidx";
92
- var ObjectIdSchema = Schema.String.pipe(Schema.pattern(/^[0-7][0-9A-HJKMNP-TV-Z]{25}$/i)).annotations({
93
- description: "A Universally Unique Lexicographically Sortable Identifier",
94
- pattern: "^[0-7][0-9A-HJKMNP-TV-Z]{25}$"
88
+ // src/DXN.ts
89
+ var DXN_exports = {};
90
+ __export(DXN_exports, {
91
+ Schema: () => Schema_,
92
+ getName: () => getName,
93
+ getVersion: () => getVersion,
94
+ isDXN: () => isDXN,
95
+ make: () => make,
96
+ tryMake: () => tryMake
95
97
  });
96
- var ObjectId = class extends ObjectIdSchema {
97
- static #factory = monotonicFactory();
98
- static #seedTime = void 0;
99
- static isValid(id) {
100
- try {
101
- Schema.decodeSync(ObjectId)(id);
102
- return true;
103
- } catch {
104
- return false;
105
- }
98
+ import * as Schema from "effect/Schema";
99
+ var DXN_SPEC_REGEXP = /^dxn:[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})(:\d+\.\d+\.\d+)?$/;
100
+ var isDXN = (value) => typeof value === "string" && value.startsWith("dxn:");
101
+ var make = (nsid, version) => parse(version != null ? `dxn:${nsid}:${version}` : `dxn:${nsid}`);
102
+ var tryMake = (dxn) => {
103
+ try {
104
+ return parse(dxn);
105
+ } catch {
106
+ return void 0;
106
107
  }
107
- static random() {
108
- return this.#factory(this.#seedTime);
108
+ };
109
+ var parse = (dxn) => {
110
+ if (typeof dxn === "string" && DXN_SPEC_REGEXP.test(dxn)) {
111
+ return dxn;
109
112
  }
110
- static dangerouslyDisableRandomness() {
111
- this.#factory = monotonicFactory(makeTestPRNG());
112
- this.#seedTime = (/* @__PURE__ */ new Date("2025-01-01")).getTime();
113
+ throw new Error(`Invalid DXN: ${dxn}`);
114
+ };
115
+ var getName = (dxn) => {
116
+ const match = /^dxn:([^:]+)/.exec(dxn);
117
+ if (!match) {
118
+ throw new Error(`Invalid DXN: ${dxn}`);
113
119
  }
120
+ return match[1];
114
121
  };
115
- var makeTestPRNG = () => {
116
- const rng = new SimplePRNG();
117
- return () => {
118
- return rng.next();
119
- };
122
+ var getVersion = (dxn) => {
123
+ const match = /^dxn:[^:]+:(\d+\.\d+\.\d+)$/.exec(dxn);
124
+ return match?.[1];
120
125
  };
121
- var SimplePRNG = class _SimplePRNG {
122
- #seed;
123
- // LCG parameters (from Numerical Recipes)
124
- static #a = 1664525;
125
- static #c = 1013904223;
126
- static #m = Math.pow(2, 32);
127
- /**
128
- * Creates a new PRNG instance.
129
- * @param seed - Initial seed value. If not provided, uses 0.
130
- */
131
- constructor(seed = 0) {
132
- this.#seed = seed;
133
- }
134
- /**
135
- * Generates the next pseudo-random number in the range [0, 1).
136
- * @returns A pseudo-random number between 0 (inclusive) and 1 (exclusive).
137
- */
138
- next() {
139
- this.#seed = (_SimplePRNG.#a * this.#seed + _SimplePRNG.#c) % _SimplePRNG.#m;
140
- return this.#seed / _SimplePRNG.#m;
141
- }
142
- /**
143
- * Resets the generator with a new seed.
144
- * @param seed - New seed value.
145
- */
146
- reset(seed) {
147
- this.#seed = seed;
126
+ var Schema_ = Schema.String.pipe(Schema.filter((value) => isDXN(value), {
127
+ message: () => "Invalid DXN"
128
+ }), Schema.annotations({
129
+ title: "DXN",
130
+ description: "DXN URI: dxn:<nsid>[:<version>]"
131
+ }));
132
+
133
+ // src/EID.ts
134
+ var EID_exports = {};
135
+ __export(EID_exports, {
136
+ Schema: () => Schema_2,
137
+ equals: () => equals,
138
+ getEntityId: () => getEntityId,
139
+ getSpaceId: () => getSpaceId,
140
+ isEID: () => isEID,
141
+ isLocal: () => isLocal,
142
+ make: () => make2,
143
+ parse: () => parse2,
144
+ toLocal: () => toLocal,
145
+ tryParse: () => tryParse
146
+ });
147
+ import * as Schema2 from "effect/Schema";
148
+ var ECHO_URI_REGEXP = /^echo:(?:\/\/[^/]+(?:\/[^/]+)?|(?:\/\/\/|\/)[^/]+)$/;
149
+ var QUALIFIED_RE = /^echo:\/\/([^/]+)\/([^/]+)$/;
150
+ var SPACE_ONLY_RE = /^echo:\/\/([^/]+)$/;
151
+ var LOCAL_RE = /^echo:(?:\/\/\/|\/)([^/]+)$/;
152
+ var isEID = (value) => typeof value === "string" && value.startsWith("echo:");
153
+ var parse2 = (uri) => {
154
+ if (!ECHO_URI_REGEXP.test(uri)) {
155
+ throw new Error(`Invalid EID: ${uri}`);
156
+ }
157
+ return uri;
158
+ };
159
+ var tryParse = (uri) => {
160
+ try {
161
+ return parse2(uri);
162
+ } catch {
163
+ return void 0;
148
164
  }
149
165
  };
166
+ var make2 = ({ spaceId, entityId }) => {
167
+ let raw;
168
+ if (spaceId != null && entityId != null) {
169
+ raw = `echo://${spaceId}/${entityId}`;
170
+ } else if (entityId != null) {
171
+ raw = `echo:/${entityId}`;
172
+ } else if (spaceId != null) {
173
+ raw = `echo://${spaceId}`;
174
+ } else {
175
+ throw new Error("EID.make requires at least one of spaceId or entityId");
176
+ }
177
+ return parse2(raw);
178
+ };
179
+ var getSpaceId = (uri) => {
180
+ const normalized = parse2(uri);
181
+ const match = QUALIFIED_RE.exec(normalized) ?? SPACE_ONLY_RE.exec(normalized);
182
+ return match?.[1];
183
+ };
184
+ var getEntityId = (uri) => {
185
+ const normalized = parse2(uri);
186
+ const qualMatch = QUALIFIED_RE.exec(normalized);
187
+ if (qualMatch) {
188
+ return qualMatch[2];
189
+ }
190
+ const localMatch = LOCAL_RE.exec(normalized);
191
+ return localMatch?.[1];
192
+ };
193
+ var isLocal = (uri) => {
194
+ const normalized = parse2(uri);
195
+ return LOCAL_RE.test(normalized);
196
+ };
197
+ var toLocal = (uri) => {
198
+ const entityId = getEntityId(uri);
199
+ return entityId != null ? make2({
200
+ entityId
201
+ }) : parse2(uri);
202
+ };
203
+ var equals = (a, b) => parse2(a) === parse2(b);
204
+ var Schema_2 = Schema2.String.pipe(Schema2.filter((value) => isEID(value), {
205
+ message: () => "Invalid EID: must start with echo:"
206
+ }), Schema2.annotations({
207
+ title: "EID",
208
+ description: "ECHO object/space URI: echo://<spaceId>[/<objectId>] or echo:/<objectId>"
209
+ }));
150
210
 
151
- // src/space-id.ts
211
+ // src/URI.ts
212
+ var URI_exports = {};
213
+ __export(URI_exports, {
214
+ Schema: () => Schema_3,
215
+ isURI: () => isURI,
216
+ make: () => make3
217
+ });
218
+ import * as Schema3 from "effect/Schema";
219
+ var make3 = (uri) => uri;
220
+ var isURI = (value) => typeof value === "string" && /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(value);
221
+ var Schema_3 = Schema3.String.pipe(Schema3.filter((value) => isURI(value), {
222
+ message: () => "Invalid URI"
223
+ }));
224
+
225
+ // src/identity-did.ts
152
226
  var import_base32_decode = __toESM(require_base32_decode(), 1);
153
227
 
154
228
  // ../../../node_modules/.pnpm/to-data-view@2.0.0/node_modules/to-data-view/index.js
@@ -210,8 +284,8 @@ function base32Encode(data, variant, options) {
210
284
  return output;
211
285
  }
212
286
 
213
- // src/space-id.ts
214
- import * as Schema2 from "effect/Schema";
287
+ // src/identity-did.ts
288
+ import * as Schema4 from "effect/Schema";
215
289
  import { invariant } from "@dxos/invariant";
216
290
 
217
291
  // src/random-bytes.ts
@@ -222,313 +296,158 @@ var randomBytes = (length) => {
222
296
  return bytes;
223
297
  };
224
298
 
225
- // src/space-id.ts
299
+ // src/identity-did.ts
226
300
  var MULTIBASE_PREFIX = "B";
227
- var ENCODED_LENGTH = 33;
301
+ var DID_PREFIX = "did:halo:";
302
+ var DECODED_BYTE_LENGTH = 20;
303
+ var ENCODED_LENGTH = 42;
304
+ var RFC4648_BASE32_PATTERN = /^[A-Z2-7]+$/;
228
305
  var isValid = (value) => {
229
- return typeof value === "string" && value.startsWith(MULTIBASE_PREFIX) && value.length === ENCODED_LENGTH;
306
+ if (typeof value !== "string" || !value.startsWith(DID_PREFIX + MULTIBASE_PREFIX) || value.length !== ENCODED_LENGTH) {
307
+ return false;
308
+ }
309
+ const encoded = value.slice(DID_PREFIX.length + MULTIBASE_PREFIX.length);
310
+ if (!RFC4648_BASE32_PATTERN.test(encoded)) {
311
+ return false;
312
+ }
313
+ try {
314
+ return (0, import_base32_decode.default)(encoded, "RFC4648").byteLength === DECODED_BYTE_LENGTH;
315
+ } catch {
316
+ return false;
317
+ }
230
318
  };
231
- var SpaceId = class extends Schema2.String.pipe(Schema2.filter(isValid)) {
232
- static byteLength = 20;
319
+ var IdentityDid = class extends Schema4.String.pipe(Schema4.filter(isValid)) {
320
+ static byteLength = DECODED_BYTE_LENGTH;
233
321
  static encode = (value) => {
234
322
  invariant(value instanceof Uint8Array, "Invalid type");
235
- invariant(value.length === SpaceId.byteLength, "Invalid length");
236
- return MULTIBASE_PREFIX + base32Encode(value, "RFC4648");
323
+ invariant(value.length === IdentityDid.byteLength, "Invalid length");
324
+ return DID_PREFIX + MULTIBASE_PREFIX + base32Encode(value, "RFC4648");
237
325
  };
238
326
  static decode = (value) => {
239
- invariant(value.startsWith(MULTIBASE_PREFIX), "Invalid multibase32 encoding");
240
- return new Uint8Array((0, import_base32_decode.default)(value.slice(1), "RFC4648"));
327
+ invariant(value.startsWith(DID_PREFIX + MULTIBASE_PREFIX), "Invalid multibase32 encoding");
328
+ return new Uint8Array((0, import_base32_decode.default)(value.slice(DID_PREFIX.length + MULTIBASE_PREFIX.length), "RFC4648"));
241
329
  };
242
330
  static isValid = isValid;
243
331
  static random = () => {
244
- return SpaceId.encode(randomBytes(SpaceId.byteLength));
332
+ return IdentityDid.encode(randomBytes(IdentityDid.byteLength));
245
333
  };
246
334
  };
247
335
 
248
- // src/dxn.ts
249
- var LOCAL_SPACE_TAG = "@";
250
- var DXN_ECHO_REGEXP = /@(dxn:[a-zA-Z0-p:@]+)/;
251
- var QueueSubspaceTags = Object.freeze({
252
- DATA: "data",
253
- TRACE: "trace"
336
+ // src/entity-id.ts
337
+ import * as Schema5 from "effect/Schema";
338
+ import { monotonicFactory } from "ulidx";
339
+ var ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
340
+ var EntityIdSchema = Schema5.String.pipe(Schema5.pattern(/^[0-7][0-9A-HJKMNP-TV-Z]{25}$/i)).annotations({
341
+ description: "A Universally Unique Lexicographically Sortable Identifier",
342
+ pattern: "^[0-7][0-9A-HJKMNP-TV-Z]{25}$"
254
343
  });
255
- var DXN = class _DXN {
256
- // TODO(burdon): Rename to DXN (i.e., DXN.DXN).
257
- // TODO(dmaretskyi): Should this be a transformation into the DXN type?
258
- static Schema = Schema3.NonEmptyString.pipe(
259
- Schema3.pattern(/^dxn:([^:]+):(?:[^:]+:?)+[^:]$/),
260
- // TODO(dmaretskyi): To set the format we need to move the annotation IDs out of the echo-schema package.
261
- // FormatAnnotation.set(TypeFormat.DXN),
262
- Schema3.annotations({
263
- title: "DXN",
264
- description: "DXN URI",
265
- examples: [
266
- "dxn:type:com.example.type.my-type",
267
- "dxn:echo:@:01J00J9B45YHYSGZQTQMSKMGJ6"
268
- ]
269
- })
270
- );
271
- static hash(dxn) {
272
- return dxn.toString();
273
- }
274
- /**
275
- * Kind constants.
276
- */
277
- static kind = Object.freeze({
278
- /**
279
- * dxn:type:<type_name>[:<version>]
280
- */
281
- TYPE: "type",
282
- /**
283
- * dxn:echo:<space_id>:<echo_id>
284
- * dxn:echo:@:<echo_id>
285
- */
286
- // TODO(burdon): Rename to OBJECT? (BREAKING CHANGE to update "echo").
287
- // TODO(burdon): Add separate Kind for space?
288
- ECHO: "echo",
289
- /**
290
- * The subspace tag enables us to partition queues by usage within the context of a space.
291
- * dxn:queue:<subspace_tag>:<space_id>:<queue_id>[:object_id]
292
- * dxn:queue:data:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6
293
- * dxn:queue:trace:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6
294
- */
295
- QUEUE: "queue"
296
- });
297
- /**
298
- * Exactly equals.
299
- */
300
- static equals(a, b) {
301
- return a.kind === b.kind && a.parts.length === b.parts.length && a.parts.every((part, i) => part === b.parts[i]);
302
- }
303
- static equalsEchoId(a, b) {
304
- const a1 = a.asEchoDXN();
305
- const b1 = b.asEchoDXN();
306
- return !!a1 && !!b1 && a1.echoId === b1.echoId;
344
+ var EntityId = class extends EntityIdSchema {
345
+ static #factory = monotonicFactory();
346
+ static #seedTime = void 0;
347
+ static isValid(id) {
348
+ try {
349
+ Schema5.decodeSync(EntityId)(id);
350
+ return true;
351
+ } catch {
352
+ return false;
353
+ }
307
354
  }
308
- // TODO(burdon): Rename isValid.
309
- static isDXNString(dxn) {
310
- return dxn.startsWith("dxn:");
355
+ static random() {
356
+ return this.#factory(this.#seedTime);
311
357
  }
312
- static parse(dxn) {
313
- if (typeof dxn !== "string") {
314
- throw new Error(`Invalid DXN: ${dxn}`);
315
- }
316
- const [prefix, kind, ...parts] = dxn.split(":");
317
- if (!(prefix === "dxn")) {
318
- throw new Error(`Invalid DXN: ${dxn}`);
319
- }
320
- if (!(typeof kind === "string" && kind.length > 0)) {
321
- throw new Error(`Invalid DXN: ${dxn}`);
358
+ static deterministic(...seed) {
359
+ const input = seed.map((value) => String(value)).join("\0");
360
+ let h1 = 2166136261 >>> 0;
361
+ let h2 = 461845907 >>> 0;
362
+ for (let i = 0; i < input.length; i++) {
363
+ const code = input.charCodeAt(i);
364
+ h1 = Math.imul(h1 ^ code, 16777619) >>> 0;
365
+ h2 = Math.imul(h2 ^ (code << 13 | code >>> 3), 16777619) >>> 0;
322
366
  }
323
- if (!(parts.length > 0)) {
324
- throw new Error(`Invalid DXN: ${dxn}`);
367
+ const time = ALPHABET[0].repeat(10);
368
+ let bits = BigInt(h1) << 32n | BigInt(h2);
369
+ let rand = "";
370
+ for (let i = 0; i < 16; i++) {
371
+ rand = ALPHABET[Number(bits & 0x1fn)] + rand;
372
+ bits >>= 5n;
325
373
  }
326
- return new _DXN(kind, parts);
374
+ return time + rand;
327
375
  }
328
- static tryParse(dxn) {
329
- try {
330
- return _DXN.parse(dxn);
331
- } catch {
332
- return void 0;
333
- }
334
- }
335
- /**
336
- * @example `dxn:type:com.example.type.person`
337
- */
338
- static fromTypename(typename) {
339
- return new _DXN(_DXN.kind.TYPE, [
340
- typename
341
- ]);
376
+ static dangerouslyDisableRandomness() {
377
+ this.#factory = monotonicFactory(makeTestPRNG());
378
+ this.#seedTime = (/* @__PURE__ */ new Date("2025-01-01")).getTime();
342
379
  }
343
- /**
344
- * @example `dxn:type:com.example.type.person:0.1.0`
345
- */
346
- // TODO(dmaretskyi): Consider using @ as the version separator.
347
- static fromTypenameAndVersion(typename, version) {
348
- return new _DXN(_DXN.kind.TYPE, [
349
- typename,
350
- version
351
- ]);
380
+ static dangerouslySetSeed(time, seed) {
381
+ this.#factory = monotonicFactory(makeTestPRNG(seed));
382
+ this.#seedTime = time;
352
383
  }
384
+ };
385
+ var makeTestPRNG = (seed = 0) => {
386
+ const rng = new SimplePRNG(seed);
387
+ return () => {
388
+ return rng.next();
389
+ };
390
+ };
391
+ var SimplePRNG = class _SimplePRNG {
392
+ #seed;
393
+ // LCG parameters (from Numerical Recipes)
394
+ static #a = 1664525;
395
+ static #c = 1013904223;
396
+ static #m = Math.pow(2, 32);
353
397
  /**
354
- * @example `dxn:echo:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6`
398
+ * Creates a new PRNG instance.
399
+ * @param seed - Initial seed value. If not provided, uses 0.
355
400
  */
356
- static fromSpaceAndObjectId(spaceId, objectId) {
357
- assertArgument(SpaceId.isValid(spaceId), `Invalid space ID: ${spaceId}`);
358
- assertArgument(ObjectId.isValid(objectId), "objectId", `Invalid object ID: ${objectId}`);
359
- return new _DXN(_DXN.kind.ECHO, [
360
- spaceId,
361
- objectId
362
- ]);
401
+ constructor(seed = 0) {
402
+ this.#seed = seed;
363
403
  }
364
404
  /**
365
- * @example `dxn:echo:@:01J00J9B45YHYSGZQTQMSKMGJ6`
405
+ * Generates the next pseudo-random number in the range [0, 1).
406
+ * @returns A pseudo-random number between 0 (inclusive) and 1 (exclusive).
366
407
  */
367
- static fromLocalObjectId(id) {
368
- assertArgument(ObjectId.isValid(id), "id", `Invalid object ID: ${id}`);
369
- return new _DXN(_DXN.kind.ECHO, [
370
- LOCAL_SPACE_TAG,
371
- id
372
- ]);
373
- }
374
- static fromQueue(subspaceTag, spaceId, queueId, objectId) {
375
- assertArgument(SpaceId.isValid(spaceId), `Invalid space ID: ${spaceId}`);
376
- assertArgument(ObjectId.isValid(queueId), "queueId", `Invalid queue ID: ${queueId}`);
377
- assertArgument(!objectId || ObjectId.isValid(objectId), "objectId", `Invalid object ID: ${objectId}`);
378
- return new _DXN(_DXN.kind.QUEUE, [
379
- subspaceTag,
380
- spaceId,
381
- queueId,
382
- ...objectId ? [
383
- objectId
384
- ] : []
385
- ]);
386
- }
387
- #kind;
388
- #parts;
389
- constructor(kind, parts) {
390
- assertArgument(parts.length > 0, "parts", `Invalid DXN: ${parts}`);
391
- assertArgument(parts.every((part) => typeof part === "string" && part.length > 0 && part.indexOf(":") === -1), "parts", `Invalid DXN: ${parts}`);
392
- switch (kind) {
393
- case _DXN.kind.TYPE:
394
- if (parts.length > 2) {
395
- throw new Error("Invalid DXN.kind.TYPE");
396
- }
397
- break;
398
- case _DXN.kind.ECHO:
399
- if (parts.length !== 2) {
400
- throw new Error("Invalid DXN.kind.ECHO");
401
- }
402
- break;
403
- }
404
- this.#kind = kind;
405
- this.#parts = parts;
406
- }
407
- toString() {
408
- return `dxn:${this.#kind}:${this.#parts.join(":")}`;
409
- }
410
- toJSON() {
411
- return this.toString();
408
+ next() {
409
+ this.#seed = (_SimplePRNG.#a * this.#seed + _SimplePRNG.#c) % _SimplePRNG.#m;
410
+ return this.#seed / _SimplePRNG.#m;
412
411
  }
413
412
  /**
414
- * Used by Node.js to get textual representation of this object when it's printed with a `console.log` statement.
413
+ * Resets the generator with a new seed.
414
+ * @param seed - New seed value.
415
415
  */
416
- [inspectCustom](depth, options, inspectFn) {
417
- const printControlCode = (code) => {
418
- return `\x1B[${code}m`;
419
- };
420
- return printControlCode(inspectFn.colors.blueBright[0]) + this.toString() + printControlCode(inspectFn.colors.reset[0]);
421
- }
422
- get [devtoolsFormatter]() {
423
- return {
424
- header: () => {
425
- return [
426
- "span",
427
- {
428
- style: "font-weight: bold;"
429
- },
430
- this.toString()
431
- ];
432
- }
433
- };
434
- }
435
- get kind() {
436
- return this.#kind;
437
- }
438
- get parts() {
439
- return this.#parts;
440
- }
441
- // TODO(burdon): Should getters fail?
442
- get typename() {
443
- invariant2(this.#kind === _DXN.kind.TYPE);
444
- return this.#parts[0];
445
- }
446
- equals(other) {
447
- return _DXN.equals(this, other);
448
- }
449
- hasTypenameOf(typename) {
450
- return this.#kind === _DXN.kind.TYPE && this.#parts.length === 1 && this.#parts[0] === typename;
451
- }
452
- isLocalObjectId() {
453
- return this.#kind === _DXN.kind.ECHO && this.#parts[0] === LOCAL_SPACE_TAG && this.#parts.length === 2;
416
+ reset(seed) {
417
+ this.#seed = seed;
454
418
  }
455
- asTypeDXN() {
456
- if (this.kind !== _DXN.kind.TYPE) {
457
- return void 0;
458
- }
459
- const [type, version] = this.#parts;
419
+ };
420
+
421
+ // src/parse-id.ts
422
+ var SPACE_ID_LENGTH = 33;
423
+ var OBJECT_ID_LENGTH = 26;
424
+ var FQ_ID_LENGTH = SPACE_ID_LENGTH + OBJECT_ID_LENGTH + 1;
425
+ var parseId = (id) => {
426
+ if (!id) {
427
+ return {};
428
+ } else if (id.length === SPACE_ID_LENGTH) {
460
429
  return {
461
- // TODO(wittjosiah): Should be `typename` for consistency.
462
- type,
463
- version
430
+ spaceId: id
464
431
  };
465
- }
466
- asEchoDXN() {
467
- if (this.kind !== _DXN.kind.ECHO) {
468
- return void 0;
469
- }
470
- const [spaceId, echoId] = this.#parts;
432
+ } else if (id.length === OBJECT_ID_LENGTH) {
471
433
  return {
472
- spaceId: spaceId === LOCAL_SPACE_TAG ? void 0 : spaceId,
473
- // TODO(burdon): objectId.
474
- echoId
434
+ objectId: id
475
435
  };
476
- }
477
- asQueueDXN() {
478
- if (this.kind !== _DXN.kind.QUEUE) {
479
- return void 0;
480
- }
481
- const [subspaceTag, spaceId, queueId, objectId] = this.#parts;
482
- if (typeof queueId !== "string") {
483
- return void 0;
484
- }
436
+ } else if (id.length === FQ_ID_LENGTH && id.indexOf(":") === SPACE_ID_LENGTH) {
437
+ const [spaceId, objectId] = id.split(":");
485
438
  return {
486
- subspaceTag,
487
439
  spaceId,
488
- queueId,
489
440
  objectId
490
441
  };
491
- }
492
- /**
493
- * Produces a new DXN with the given parts appended.
494
- */
495
- extend(parts) {
496
- return new _DXN(this.#kind, [
497
- ...this.#parts,
498
- ...parts
499
- ]);
442
+ } else {
443
+ return {};
500
444
  }
501
445
  };
502
446
 
503
- // src/identity-did.ts
504
- var import_base32_decode2 = __toESM(require_base32_decode(), 1);
505
- import { invariant as invariant3 } from "@dxos/invariant";
506
- var IdentityDid = Object.freeze({
507
- byteLength: 20,
508
- encode: (value) => {
509
- invariant3(value instanceof Uint8Array, "Invalid type");
510
- invariant3(value.length === IdentityDid.byteLength, "Invalid length");
511
- return DID_PREFIX + MULTIBASE_PREFIX2 + base32Encode(value, "RFC4648");
512
- },
513
- decode: (value) => {
514
- invariant3(value.startsWith(DID_PREFIX + MULTIBASE_PREFIX2), "Invalid multibase32 encoding");
515
- return new Uint8Array((0, import_base32_decode2.default)(value.slice(10), "RFC4648"));
516
- },
517
- isValid: (value) => {
518
- return typeof value === "string" && value.startsWith(DID_PREFIX + MULTIBASE_PREFIX2) && value.length === ENCODED_LENGTH2;
519
- },
520
- random: () => {
521
- return IdentityDid.encode(randomBytes(IdentityDid.byteLength));
522
- }
523
- });
524
- var MULTIBASE_PREFIX2 = "B";
525
- var DID_PREFIX = "did:halo:";
526
- var ENCODED_LENGTH2 = 42;
527
-
528
447
  // src/public-key.ts
529
- var import_base32_decode3 = __toESM(require_base32_decode(), 1);
530
- import { devtoolsFormatter as devtoolsFormatter2, equalsSymbol, inspectCustom as inspectCustom2, truncateKey } from "@dxos/debug";
531
- import { invariant as invariant4 } from "@dxos/invariant";
448
+ var import_base32_decode2 = __toESM(require_base32_decode(), 1);
449
+ import { devtoolsFormatter, equalsSymbol, inspectCustom, truncateKey } from "@dxos/debug";
450
+ import { assertArgument, invariant as invariant2 } from "@dxos/invariant";
532
451
  var PUBLIC_KEY_LENGTH = 32;
533
452
  var SECRET_KEY_LENGTH = 64;
534
453
  var isLikeArrayBuffer = (value) => typeof value === "object" && value !== null && Object.getPrototypeOf(value).constructor.name === "ArrayBuffer";
@@ -541,7 +460,7 @@ var PublicKey = class _PublicKey {
541
460
  * @returns PublicKey
542
461
  */
543
462
  static from(source) {
544
- invariant4(source);
463
+ invariant2(source);
545
464
  if (source instanceof _PublicKey) {
546
465
  return source;
547
466
  } else if (source instanceof Buffer) {
@@ -625,7 +544,7 @@ var PublicKey = class _PublicKey {
625
544
  * @deprecated All keys should be represented as instances of PublicKey.
626
545
  */
627
546
  static bufferize(str) {
628
- invariant4(typeof str === "string", "Invalid type");
547
+ assertArgument(typeof str === "string", "str", "Invalid type");
629
548
  const buffer = Buffer.from(str, "hex");
630
549
  return buffer;
631
550
  }
@@ -640,7 +559,7 @@ var PublicKey = class _PublicKey {
640
559
  } else if (key instanceof Uint8Array) {
641
560
  key = Buffer.from(key.buffer, key.byteOffset, key.byteLength);
642
561
  }
643
- invariant4(key instanceof Buffer, "Invalid type");
562
+ invariant2(key instanceof Buffer, "Invalid type");
644
563
  return key.toString("hex");
645
564
  }
646
565
  /**
@@ -651,8 +570,8 @@ var PublicKey = class _PublicKey {
651
570
  return key.toHex();
652
571
  }
653
572
  static fromMultibase32(encoded) {
654
- invariant4(encoded.startsWith("B"), "Invalid multibase32 encoding");
655
- return new _PublicKey(new Uint8Array((0, import_base32_decode3.default)(encoded.slice(1), "RFC4648")));
573
+ invariant2(encoded.startsWith("B"), "Invalid multibase32 encoding");
574
+ return new _PublicKey(new Uint8Array((0, import_base32_decode2.default)(encoded.slice(1), "RFC4648")));
656
575
  }
657
576
  constructor(_value) {
658
577
  this._value = _value;
@@ -693,7 +612,7 @@ var PublicKey = class _PublicKey {
693
612
  /**
694
613
  * Used by Node.js to get textual representation of this object when it's printed with a `console.log` statement.
695
614
  */
696
- [inspectCustom2](depth, options, inspectFn) {
615
+ [inspectCustom](depth, options, inspectFn) {
697
616
  if (!options.colors || typeof process.stdout.hasColors !== "function" || !process.stdout.hasColors()) {
698
617
  return `<PublicKey ${this.truncate()}>`;
699
618
  }
@@ -718,7 +637,7 @@ var PublicKey = class _PublicKey {
718
637
  const color = colors[this.getInsecureHash(colors.length)];
719
638
  return `PublicKey(${printControlCode(inspectFn.colors[color][0])}${this.truncate()}${printControlCode(inspectFn.colors.reset[0])})`;
720
639
  }
721
- get [devtoolsFormatter2]() {
640
+ get [devtoolsFormatter]() {
722
641
  return {
723
642
  header: () => {
724
643
  const colors = [
@@ -782,17 +701,46 @@ var PublicKey = class _PublicKey {
782
701
  return this.equals(other);
783
702
  }
784
703
  };
704
+
705
+ // src/space-id.ts
706
+ var import_base32_decode3 = __toESM(require_base32_decode(), 1);
707
+ import * as Schema6 from "effect/Schema";
708
+ import { invariant as invariant3 } from "@dxos/invariant";
709
+ var MULTIBASE_PREFIX2 = "B";
710
+ var ENCODED_LENGTH2 = 33;
711
+ var isValid2 = (value) => {
712
+ return typeof value === "string" && value.startsWith(MULTIBASE_PREFIX2) && value.length === ENCODED_LENGTH2;
713
+ };
714
+ var SpaceId = class extends Schema6.String.pipe(Schema6.filter(isValid2)) {
715
+ static byteLength = 20;
716
+ static encode = (value) => {
717
+ invariant3(value instanceof Uint8Array, "Invalid type");
718
+ invariant3(value.length === SpaceId.byteLength, "Invalid length");
719
+ return MULTIBASE_PREFIX2 + base32Encode(value, "RFC4648");
720
+ };
721
+ static decode = (value) => {
722
+ invariant3(value.startsWith(MULTIBASE_PREFIX2), "Invalid multibase32 encoding");
723
+ return new Uint8Array((0, import_base32_decode3.default)(value.slice(1), "RFC4648"));
724
+ };
725
+ static isValid = isValid2;
726
+ static random = () => {
727
+ return SpaceId.encode(randomBytes(SpaceId.byteLength));
728
+ };
729
+ };
785
730
  export {
786
- DXN,
787
- DXN_ECHO_REGEXP,
731
+ DXN_exports as DXN,
732
+ EID_exports as EID,
733
+ EntityId,
734
+ FQ_ID_LENGTH,
788
735
  IdentityDid,
789
- LOCAL_SPACE_TAG,
790
- ObjectId,
736
+ OBJECT_ID_LENGTH,
791
737
  PUBLIC_KEY_LENGTH,
792
738
  PublicKey,
793
- QueueSubspaceTags,
794
739
  SECRET_KEY_LENGTH,
740
+ SPACE_ID_LENGTH,
795
741
  SimplePRNG,
796
- SpaceId
742
+ SpaceId,
743
+ URI_exports as URI,
744
+ parseId
797
745
  };
798
746
  //# sourceMappingURL=index.mjs.map