@dxos/keys 0.8.3 → 0.8.4-main.05e74ebcff
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 +236 -266
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +233 -264
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/dxn.d.ts +40 -22
- package/dist/types/src/dxn.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/object-id.d.ts +67 -1
- package/dist/types/src/object-id.d.ts.map +1 -1
- package/dist/types/src/parse-id.d.ts +10 -0
- package/dist/types/src/parse-id.d.ts.map +1 -0
- package/dist/types/src/parse-id.test.d.ts +2 -0
- package/dist/types/src/parse-id.test.d.ts.map +1 -0
- package/dist/types/src/prng.d.ts +32 -0
- package/dist/types/src/prng.d.ts.map +1 -0
- package/dist/types/src/public-key.d.ts +3 -3
- package/dist/types/src/public-key.d.ts.map +1 -1
- package/dist/types/src/random-bytes.d.ts.map +1 -1
- package/dist/types/src/space-id.d.ts +2 -2
- package/dist/types/src/space-id.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -15
- package/src/dxn.ts +108 -83
- package/src/index.ts +2 -1
- package/src/object-id.ts +117 -5
- package/src/parse-id.test.ts +32 -0
- package/src/parse-id.ts +32 -0
- package/src/prng.ts +54 -0
- package/src/public-key.ts +4 -4
- package/src/random-bytes.ts +1 -1
- package/src/space-id.ts +3 -3
- package/dist/lib/node/index.cjs +0 -866
- package/dist/lib/node/index.cjs.map +0 -7
- package/dist/lib/node/meta.json +0 -1
|
@@ -44,9 +44,9 @@ var init_inject_globals = __esm({
|
|
|
44
44
|
}
|
|
45
45
|
});
|
|
46
46
|
|
|
47
|
-
// node_modules/.pnpm/base32-decode@1.0.0/node_modules/base32-decode/index.js
|
|
47
|
+
// ../../../node_modules/.pnpm/base32-decode@1.0.0/node_modules/base32-decode/index.js
|
|
48
48
|
var require_base32_decode = __commonJS({
|
|
49
|
-
"node_modules/.pnpm/base32-decode@1.0.0/node_modules/base32-decode/index.js"(exports, module) {
|
|
49
|
+
"../../../node_modules/.pnpm/base32-decode@1.0.0/node_modules/base32-decode/index.js"(exports, module) {
|
|
50
50
|
init_inject_globals();
|
|
51
51
|
var RFC46482 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
|
52
52
|
var RFC4648_HEX2 = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
|
|
@@ -95,45 +95,90 @@ var require_base32_decode = __commonJS({
|
|
|
95
95
|
}
|
|
96
96
|
});
|
|
97
97
|
|
|
98
|
-
//
|
|
98
|
+
// src/index.ts
|
|
99
99
|
init_inject_globals();
|
|
100
100
|
|
|
101
|
-
//
|
|
101
|
+
// src/dxn.ts
|
|
102
102
|
init_inject_globals();
|
|
103
|
-
import
|
|
103
|
+
import * as Schema3 from "effect/Schema";
|
|
104
104
|
import { devtoolsFormatter, inspectCustom } from "@dxos/debug";
|
|
105
|
-
import { invariant as invariant2 } from "@dxos/invariant";
|
|
105
|
+
import { assertArgument, invariant as invariant2 } from "@dxos/invariant";
|
|
106
106
|
|
|
107
|
-
//
|
|
107
|
+
// src/object-id.ts
|
|
108
108
|
init_inject_globals();
|
|
109
|
-
import
|
|
110
|
-
import {
|
|
109
|
+
import * as Schema from "effect/Schema";
|
|
110
|
+
import { monotonicFactory } from "ulidx";
|
|
111
111
|
var ObjectIdSchema = Schema.String.pipe(Schema.pattern(/^[0-7][0-9A-HJKMNP-TV-Z]{25}$/i)).annotations({
|
|
112
|
-
description: "
|
|
112
|
+
description: "A Universally Unique Lexicographically Sortable Identifier",
|
|
113
113
|
pattern: "^[0-7][0-9A-HJKMNP-TV-Z]{25}$"
|
|
114
114
|
});
|
|
115
115
|
var ObjectId = class extends ObjectIdSchema {
|
|
116
|
+
static #factory = monotonicFactory();
|
|
117
|
+
static #seedTime = void 0;
|
|
116
118
|
static isValid(id) {
|
|
117
119
|
try {
|
|
118
120
|
Schema.decodeSync(ObjectId)(id);
|
|
119
121
|
return true;
|
|
120
|
-
} catch
|
|
122
|
+
} catch {
|
|
121
123
|
return false;
|
|
122
124
|
}
|
|
123
125
|
}
|
|
124
126
|
static random() {
|
|
125
|
-
return
|
|
127
|
+
return this.#factory(this.#seedTime);
|
|
128
|
+
}
|
|
129
|
+
static dangerouslyDisableRandomness() {
|
|
130
|
+
this.#factory = monotonicFactory(makeTestPRNG());
|
|
131
|
+
this.#seedTime = (/* @__PURE__ */ new Date("2025-01-01")).getTime();
|
|
132
|
+
}
|
|
133
|
+
static dangerouslySetSeed(time, seed) {
|
|
134
|
+
this.#factory = monotonicFactory(makeTestPRNG(seed));
|
|
135
|
+
this.#seedTime = time;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
var makeTestPRNG = (seed = 0) => {
|
|
139
|
+
const rng = new SimplePRNG(seed);
|
|
140
|
+
return () => {
|
|
141
|
+
return rng.next();
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
var SimplePRNG = class _SimplePRNG {
|
|
145
|
+
#seed;
|
|
146
|
+
// LCG parameters (from Numerical Recipes)
|
|
147
|
+
static #a = 1664525;
|
|
148
|
+
static #c = 1013904223;
|
|
149
|
+
static #m = Math.pow(2, 32);
|
|
150
|
+
/**
|
|
151
|
+
* Creates a new PRNG instance.
|
|
152
|
+
* @param seed - Initial seed value. If not provided, uses 0.
|
|
153
|
+
*/
|
|
154
|
+
constructor(seed = 0) {
|
|
155
|
+
this.#seed = seed;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Generates the next pseudo-random number in the range [0, 1).
|
|
159
|
+
* @returns A pseudo-random number between 0 (inclusive) and 1 (exclusive).
|
|
160
|
+
*/
|
|
161
|
+
next() {
|
|
162
|
+
this.#seed = (_SimplePRNG.#a * this.#seed + _SimplePRNG.#c) % _SimplePRNG.#m;
|
|
163
|
+
return this.#seed / _SimplePRNG.#m;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Resets the generator with a new seed.
|
|
167
|
+
* @param seed - New seed value.
|
|
168
|
+
*/
|
|
169
|
+
reset(seed) {
|
|
170
|
+
this.#seed = seed;
|
|
126
171
|
}
|
|
127
172
|
};
|
|
128
173
|
|
|
129
|
-
//
|
|
174
|
+
// src/space-id.ts
|
|
130
175
|
init_inject_globals();
|
|
131
176
|
var import_base32_decode = __toESM(require_base32_decode(), 1);
|
|
132
177
|
|
|
133
|
-
// node_modules/.pnpm/base32-encode@2.0.0/node_modules/base32-encode/index.js
|
|
178
|
+
// ../../../node_modules/.pnpm/base32-encode@2.0.0/node_modules/base32-encode/index.js
|
|
134
179
|
init_inject_globals();
|
|
135
180
|
|
|
136
|
-
// node_modules/.pnpm/to-data-view@2.0.0/node_modules/to-data-view/index.js
|
|
181
|
+
// ../../../node_modules/.pnpm/to-data-view@2.0.0/node_modules/to-data-view/index.js
|
|
137
182
|
init_inject_globals();
|
|
138
183
|
function toDataView(data) {
|
|
139
184
|
if (data instanceof Int8Array || data instanceof Uint8Array || data instanceof Uint8ClampedArray) {
|
|
@@ -145,7 +190,7 @@ function toDataView(data) {
|
|
|
145
190
|
throw new TypeError("Expected `data` to be an ArrayBuffer, Buffer, Int8Array, Uint8Array or Uint8ClampedArray");
|
|
146
191
|
}
|
|
147
192
|
|
|
148
|
-
// node_modules/.pnpm/base32-encode@2.0.0/node_modules/base32-encode/index.js
|
|
193
|
+
// ../../../node_modules/.pnpm/base32-encode@2.0.0/node_modules/base32-encode/index.js
|
|
149
194
|
var RFC4648 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
|
150
195
|
var RFC4648_HEX = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
|
|
151
196
|
var CROCKFORD = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
@@ -193,11 +238,11 @@ function base32Encode(data, variant, options) {
|
|
|
193
238
|
return output;
|
|
194
239
|
}
|
|
195
240
|
|
|
196
|
-
//
|
|
197
|
-
import
|
|
241
|
+
// src/space-id.ts
|
|
242
|
+
import * as Schema2 from "effect/Schema";
|
|
198
243
|
import { invariant } from "@dxos/invariant";
|
|
199
244
|
|
|
200
|
-
//
|
|
245
|
+
// src/random-bytes.ts
|
|
201
246
|
init_inject_globals();
|
|
202
247
|
var randomBytes = (length) => {
|
|
203
248
|
const webCrypto = globalThis.crypto ?? __require("@dxos/node-std/crypto").webcrypto;
|
|
@@ -206,122 +251,89 @@ var randomBytes = (length) => {
|
|
|
206
251
|
return bytes;
|
|
207
252
|
};
|
|
208
253
|
|
|
209
|
-
//
|
|
210
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/keys/src/space-id.ts";
|
|
254
|
+
// src/space-id.ts
|
|
211
255
|
var MULTIBASE_PREFIX = "B";
|
|
212
256
|
var ENCODED_LENGTH = 33;
|
|
213
257
|
var isValid = (value) => {
|
|
214
258
|
return typeof value === "string" && value.startsWith(MULTIBASE_PREFIX) && value.length === ENCODED_LENGTH;
|
|
215
259
|
};
|
|
216
260
|
var SpaceId = class extends Schema2.String.pipe(Schema2.filter(isValid)) {
|
|
217
|
-
static
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
invariant(value.length === SpaceId.byteLength, "Invalid length", {
|
|
232
|
-
F: __dxlog_file,
|
|
233
|
-
L: 44,
|
|
234
|
-
S: this,
|
|
235
|
-
A: [
|
|
236
|
-
"value.length === SpaceId.byteLength",
|
|
237
|
-
"'Invalid length'"
|
|
238
|
-
]
|
|
239
|
-
});
|
|
240
|
-
return MULTIBASE_PREFIX + base32Encode(value, "RFC4648");
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
static {
|
|
244
|
-
this.decode = (value) => {
|
|
245
|
-
invariant(value.startsWith(MULTIBASE_PREFIX), "Invalid multibase32 encoding", {
|
|
246
|
-
F: __dxlog_file,
|
|
247
|
-
L: 49,
|
|
248
|
-
S: this,
|
|
249
|
-
A: [
|
|
250
|
-
"value.startsWith(MULTIBASE_PREFIX)",
|
|
251
|
-
"'Invalid multibase32 encoding'"
|
|
252
|
-
]
|
|
253
|
-
});
|
|
254
|
-
return new Uint8Array((0, import_base32_decode.default)(value.slice(1), "RFC4648"));
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
static {
|
|
258
|
-
this.isValid = isValid;
|
|
259
|
-
}
|
|
260
|
-
static {
|
|
261
|
-
this.random = () => {
|
|
262
|
-
return SpaceId.encode(randomBytes(SpaceId.byteLength));
|
|
263
|
-
};
|
|
264
|
-
}
|
|
261
|
+
static byteLength = 20;
|
|
262
|
+
static encode = (value) => {
|
|
263
|
+
invariant(value instanceof Uint8Array, "Invalid type");
|
|
264
|
+
invariant(value.length === SpaceId.byteLength, "Invalid length");
|
|
265
|
+
return MULTIBASE_PREFIX + base32Encode(value, "RFC4648");
|
|
266
|
+
};
|
|
267
|
+
static decode = (value) => {
|
|
268
|
+
invariant(value.startsWith(MULTIBASE_PREFIX), "Invalid multibase32 encoding");
|
|
269
|
+
return new Uint8Array((0, import_base32_decode.default)(value.slice(1), "RFC4648"));
|
|
270
|
+
};
|
|
271
|
+
static isValid = isValid;
|
|
272
|
+
static random = () => {
|
|
273
|
+
return SpaceId.encode(randomBytes(SpaceId.byteLength));
|
|
274
|
+
};
|
|
265
275
|
};
|
|
266
276
|
|
|
267
|
-
//
|
|
268
|
-
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/common/keys/src/dxn.ts";
|
|
277
|
+
// src/dxn.ts
|
|
269
278
|
var LOCAL_SPACE_TAG = "@";
|
|
279
|
+
var DXN_ECHO_REGEXP = /@(dxn:[a-zA-Z0-p:@]+)/;
|
|
270
280
|
var QueueSubspaceTags = Object.freeze({
|
|
271
281
|
DATA: "data",
|
|
272
282
|
TRACE: "trace"
|
|
273
283
|
});
|
|
274
284
|
var DXN = class _DXN {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
}
|
|
285
|
+
// TODO(burdon): Rename to DXN (i.e., DXN.DXN).
|
|
286
|
+
// TODO(dmaretskyi): Should this be a transformation into the DXN type?
|
|
287
|
+
static Schema = Schema3.NonEmptyString.pipe(
|
|
288
|
+
Schema3.pattern(/^dxn:([^:]+):(?:[^:]+:?)+[^:]$/),
|
|
289
|
+
// TODO(dmaretskyi): To set the format we need to move the annotation IDs out of the echo-schema package.
|
|
290
|
+
// FormatAnnotation.set(TypeFormat.DXN),
|
|
291
|
+
Schema3.annotations({
|
|
292
|
+
title: "DXN",
|
|
293
|
+
description: "DXN URI",
|
|
294
|
+
examples: [
|
|
295
|
+
"dxn:type:com.example.type.my-type",
|
|
296
|
+
"dxn:echo:@:01J00J9B45YHYSGZQTQMSKMGJ6"
|
|
297
|
+
]
|
|
298
|
+
})
|
|
299
|
+
);
|
|
291
300
|
static hash(dxn) {
|
|
292
301
|
return dxn.toString();
|
|
293
302
|
}
|
|
294
|
-
|
|
303
|
+
/**
|
|
304
|
+
* Kind constants.
|
|
305
|
+
*/
|
|
306
|
+
static kind = Object.freeze({
|
|
295
307
|
/**
|
|
296
|
-
*
|
|
308
|
+
* dxn:type:<type_name>[:<version>]
|
|
297
309
|
*/
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
get kind() {
|
|
320
|
-
return this.#kind;
|
|
321
|
-
}
|
|
310
|
+
TYPE: "type",
|
|
311
|
+
/**
|
|
312
|
+
* dxn:echo:<space_id>:<echo_id>
|
|
313
|
+
* dxn:echo:@:<echo_id>
|
|
314
|
+
*/
|
|
315
|
+
// TODO(burdon): Rename to OBJECT? (BREAKING CHANGE to update "echo").
|
|
316
|
+
// TODO(burdon): Add separate Kind for space?
|
|
317
|
+
ECHO: "echo",
|
|
318
|
+
/**
|
|
319
|
+
* The subspace tag enables us to partition queues by usage within the context of a space.
|
|
320
|
+
* dxn:queue:<subspace_tag>:<space_id>:<queue_id>[:object_id]
|
|
321
|
+
* dxn:queue:data:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6
|
|
322
|
+
* dxn:queue:trace:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6
|
|
323
|
+
*/
|
|
324
|
+
QUEUE: "queue"
|
|
325
|
+
});
|
|
326
|
+
/**
|
|
327
|
+
* Exactly equals.
|
|
328
|
+
*/
|
|
322
329
|
static equals(a, b) {
|
|
323
330
|
return a.kind === b.kind && a.parts.length === b.parts.length && a.parts.every((part, i) => part === b.parts[i]);
|
|
324
331
|
}
|
|
332
|
+
static equalsEchoId(a, b) {
|
|
333
|
+
const a1 = a.asEchoDXN();
|
|
334
|
+
const b1 = b.asEchoDXN();
|
|
335
|
+
return !!a1 && !!b1 && a1.echoId === b1.echoId;
|
|
336
|
+
}
|
|
325
337
|
// TODO(burdon): Rename isValid.
|
|
326
338
|
static isDXNString(dxn) {
|
|
327
339
|
return dxn.startsWith("dxn:");
|
|
@@ -345,12 +357,12 @@ var DXN = class _DXN {
|
|
|
345
357
|
static tryParse(dxn) {
|
|
346
358
|
try {
|
|
347
359
|
return _DXN.parse(dxn);
|
|
348
|
-
} catch
|
|
360
|
+
} catch {
|
|
349
361
|
return void 0;
|
|
350
362
|
}
|
|
351
363
|
}
|
|
352
364
|
/**
|
|
353
|
-
* @example `dxn:type:example.
|
|
365
|
+
* @example `dxn:type:com.example.type.person`
|
|
354
366
|
*/
|
|
355
367
|
static fromTypename(typename) {
|
|
356
368
|
return new _DXN(_DXN.kind.TYPE, [
|
|
@@ -358,7 +370,7 @@ var DXN = class _DXN {
|
|
|
358
370
|
]);
|
|
359
371
|
}
|
|
360
372
|
/**
|
|
361
|
-
* @example `dxn:type:example.
|
|
373
|
+
* @example `dxn:type:com.example.type.person:0.1.0`
|
|
362
374
|
*/
|
|
363
375
|
// TODO(dmaretskyi): Consider using @ as the version separator.
|
|
364
376
|
static fromTypenameAndVersion(typename, version) {
|
|
@@ -368,42 +380,30 @@ var DXN = class _DXN {
|
|
|
368
380
|
]);
|
|
369
381
|
}
|
|
370
382
|
/**
|
|
383
|
+
* @example `dxn:echo:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6`
|
|
384
|
+
*/
|
|
385
|
+
static fromSpaceAndObjectId(spaceId, objectId) {
|
|
386
|
+
assertArgument(SpaceId.isValid(spaceId), `Invalid space ID: ${spaceId}`);
|
|
387
|
+
assertArgument(ObjectId.isValid(objectId), "objectId", `Invalid object ID: ${objectId}`);
|
|
388
|
+
return new _DXN(_DXN.kind.ECHO, [
|
|
389
|
+
spaceId,
|
|
390
|
+
objectId
|
|
391
|
+
]);
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
371
394
|
* @example `dxn:echo:@:01J00J9B45YHYSGZQTQMSKMGJ6`
|
|
372
395
|
*/
|
|
373
396
|
static fromLocalObjectId(id) {
|
|
397
|
+
assertArgument(ObjectId.isValid(id), "id", `Invalid object ID: ${id}`);
|
|
374
398
|
return new _DXN(_DXN.kind.ECHO, [
|
|
375
399
|
LOCAL_SPACE_TAG,
|
|
376
400
|
id
|
|
377
401
|
]);
|
|
378
402
|
}
|
|
379
403
|
static fromQueue(subspaceTag, spaceId, queueId, objectId) {
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
S: this,
|
|
384
|
-
A: [
|
|
385
|
-
"SpaceId.isValid(spaceId)",
|
|
386
|
-
""
|
|
387
|
-
]
|
|
388
|
-
});
|
|
389
|
-
invariant2(ObjectId.isValid(queueId), void 0, {
|
|
390
|
-
F: __dxlog_file2,
|
|
391
|
-
L: 151,
|
|
392
|
-
S: this,
|
|
393
|
-
A: [
|
|
394
|
-
"ObjectId.isValid(queueId)",
|
|
395
|
-
""
|
|
396
|
-
]
|
|
397
|
-
});
|
|
398
|
-
invariant2(!objectId || ObjectId.isValid(objectId), void 0, {
|
|
399
|
-
F: __dxlog_file2,
|
|
400
|
-
L: 152,
|
|
401
|
-
S: this,
|
|
402
|
-
A: [
|
|
403
|
-
"!objectId || ObjectId.isValid(objectId)",
|
|
404
|
-
""
|
|
405
|
-
]
|
|
406
|
-
});
|
|
404
|
+
assertArgument(SpaceId.isValid(spaceId), `Invalid space ID: ${spaceId}`);
|
|
405
|
+
assertArgument(ObjectId.isValid(queueId), "queueId", `Invalid queue ID: ${queueId}`);
|
|
406
|
+
assertArgument(!objectId || ObjectId.isValid(objectId), "objectId", `Invalid object ID: ${objectId}`);
|
|
407
407
|
return new _DXN(_DXN.kind.QUEUE, [
|
|
408
408
|
subspaceTag,
|
|
409
409
|
spaceId,
|
|
@@ -416,55 +416,65 @@ var DXN = class _DXN {
|
|
|
416
416
|
#kind;
|
|
417
417
|
#parts;
|
|
418
418
|
constructor(kind, parts) {
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
L: 161,
|
|
422
|
-
S: this,
|
|
423
|
-
A: [
|
|
424
|
-
"parts.length > 0",
|
|
425
|
-
""
|
|
426
|
-
]
|
|
427
|
-
});
|
|
428
|
-
invariant2(parts.every((part) => typeof part === "string" && part.length > 0 && part.indexOf(":") === -1), void 0, {
|
|
429
|
-
F: __dxlog_file2,
|
|
430
|
-
L: 162,
|
|
431
|
-
S: this,
|
|
432
|
-
A: [
|
|
433
|
-
"parts.every((part) => typeof part === 'string' && part.length > 0 && part.indexOf(':') === -1)",
|
|
434
|
-
""
|
|
435
|
-
]
|
|
436
|
-
});
|
|
419
|
+
assertArgument(parts.length > 0, "parts", `Invalid DXN: ${parts}`);
|
|
420
|
+
assertArgument(parts.every((part) => typeof part === "string" && part.length > 0 && part.indexOf(":") === -1), "parts", `Invalid DXN: ${parts}`);
|
|
437
421
|
switch (kind) {
|
|
438
422
|
case _DXN.kind.TYPE:
|
|
439
423
|
if (parts.length > 2) {
|
|
440
|
-
throw new Error(
|
|
424
|
+
throw new Error("Invalid DXN.kind.TYPE");
|
|
441
425
|
}
|
|
442
426
|
break;
|
|
443
427
|
case _DXN.kind.ECHO:
|
|
444
428
|
if (parts.length !== 2) {
|
|
445
|
-
throw new Error(
|
|
429
|
+
throw new Error("Invalid DXN.kind.ECHO");
|
|
446
430
|
}
|
|
447
431
|
break;
|
|
448
432
|
}
|
|
449
433
|
this.#kind = kind;
|
|
450
434
|
this.#parts = parts;
|
|
451
435
|
}
|
|
436
|
+
toString() {
|
|
437
|
+
return `dxn:${this.#kind}:${this.#parts.join(":")}`;
|
|
438
|
+
}
|
|
439
|
+
toJSON() {
|
|
440
|
+
return this.toString();
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Used by Node.js to get textual representation of this object when it's printed with a `console.log` statement.
|
|
444
|
+
*/
|
|
445
|
+
[inspectCustom](depth, options, inspectFn) {
|
|
446
|
+
const printControlCode = (code) => {
|
|
447
|
+
return `\x1B[${code}m`;
|
|
448
|
+
};
|
|
449
|
+
return printControlCode(inspectFn.colors.blueBright[0]) + this.toString() + printControlCode(inspectFn.colors.reset[0]);
|
|
450
|
+
}
|
|
451
|
+
get [devtoolsFormatter]() {
|
|
452
|
+
return {
|
|
453
|
+
header: () => {
|
|
454
|
+
return [
|
|
455
|
+
"span",
|
|
456
|
+
{
|
|
457
|
+
style: "font-weight: bold;"
|
|
458
|
+
},
|
|
459
|
+
this.toString()
|
|
460
|
+
];
|
|
461
|
+
}
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
get kind() {
|
|
465
|
+
return this.#kind;
|
|
466
|
+
}
|
|
452
467
|
get parts() {
|
|
453
468
|
return this.#parts;
|
|
454
469
|
}
|
|
455
470
|
// TODO(burdon): Should getters fail?
|
|
456
471
|
get typename() {
|
|
457
|
-
invariant2(this.#kind === _DXN.kind.TYPE
|
|
458
|
-
F: __dxlog_file2,
|
|
459
|
-
L: 188,
|
|
460
|
-
S: this,
|
|
461
|
-
A: [
|
|
462
|
-
"this.#kind === DXN.kind.TYPE",
|
|
463
|
-
""
|
|
464
|
-
]
|
|
465
|
-
});
|
|
472
|
+
invariant2(this.#kind === _DXN.kind.TYPE);
|
|
466
473
|
return this.#parts[0];
|
|
467
474
|
}
|
|
475
|
+
equals(other) {
|
|
476
|
+
return _DXN.equals(this, other);
|
|
477
|
+
}
|
|
468
478
|
hasTypenameOf(typename) {
|
|
469
479
|
return this.#kind === _DXN.kind.TYPE && this.#parts.length === 1 && this.#parts[0] === typename;
|
|
470
480
|
}
|
|
@@ -477,6 +487,7 @@ var DXN = class _DXN {
|
|
|
477
487
|
}
|
|
478
488
|
const [type, version] = this.#parts;
|
|
479
489
|
return {
|
|
490
|
+
// TODO(wittjosiah): Should be `typename` for consistency.
|
|
480
491
|
type,
|
|
481
492
|
version
|
|
482
493
|
};
|
|
@@ -488,6 +499,7 @@ var DXN = class _DXN {
|
|
|
488
499
|
const [spaceId, echoId] = this.#parts;
|
|
489
500
|
return {
|
|
490
501
|
spaceId: spaceId === LOCAL_SPACE_TAG ? void 0 : spaceId,
|
|
502
|
+
// TODO(burdon): objectId.
|
|
491
503
|
echoId
|
|
492
504
|
};
|
|
493
505
|
}
|
|
@@ -506,71 +518,30 @@ var DXN = class _DXN {
|
|
|
506
518
|
objectId
|
|
507
519
|
};
|
|
508
520
|
}
|
|
509
|
-
toString() {
|
|
510
|
-
return `dxn:${this.#kind}:${this.#parts.join(":")}`;
|
|
511
|
-
}
|
|
512
521
|
/**
|
|
513
|
-
*
|
|
522
|
+
* Produces a new DXN with the given parts appended.
|
|
514
523
|
*/
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
}
|
|
521
|
-
get [devtoolsFormatter]() {
|
|
522
|
-
return {
|
|
523
|
-
header: () => {
|
|
524
|
-
return [
|
|
525
|
-
"span",
|
|
526
|
-
{
|
|
527
|
-
style: "font-weight: bold;"
|
|
528
|
-
},
|
|
529
|
-
this.toString()
|
|
530
|
-
];
|
|
531
|
-
}
|
|
532
|
-
};
|
|
524
|
+
extend(parts) {
|
|
525
|
+
return new _DXN(this.#kind, [
|
|
526
|
+
...this.#parts,
|
|
527
|
+
...parts
|
|
528
|
+
]);
|
|
533
529
|
}
|
|
534
530
|
};
|
|
535
531
|
|
|
536
|
-
//
|
|
532
|
+
// src/identity-did.ts
|
|
537
533
|
init_inject_globals();
|
|
538
534
|
var import_base32_decode2 = __toESM(require_base32_decode(), 1);
|
|
539
535
|
import { invariant as invariant3 } from "@dxos/invariant";
|
|
540
|
-
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/common/keys/src/identity-did.ts";
|
|
541
536
|
var IdentityDid = Object.freeze({
|
|
542
537
|
byteLength: 20,
|
|
543
538
|
encode: (value) => {
|
|
544
|
-
invariant3(value instanceof Uint8Array, "Invalid type"
|
|
545
|
-
|
|
546
|
-
L: 22,
|
|
547
|
-
S: void 0,
|
|
548
|
-
A: [
|
|
549
|
-
"value instanceof Uint8Array",
|
|
550
|
-
"'Invalid type'"
|
|
551
|
-
]
|
|
552
|
-
});
|
|
553
|
-
invariant3(value.length === IdentityDid.byteLength, "Invalid length", {
|
|
554
|
-
F: __dxlog_file3,
|
|
555
|
-
L: 23,
|
|
556
|
-
S: void 0,
|
|
557
|
-
A: [
|
|
558
|
-
"value.length === IdentityDid.byteLength",
|
|
559
|
-
"'Invalid length'"
|
|
560
|
-
]
|
|
561
|
-
});
|
|
539
|
+
invariant3(value instanceof Uint8Array, "Invalid type");
|
|
540
|
+
invariant3(value.length === IdentityDid.byteLength, "Invalid length");
|
|
562
541
|
return DID_PREFIX + MULTIBASE_PREFIX2 + base32Encode(value, "RFC4648");
|
|
563
542
|
},
|
|
564
543
|
decode: (value) => {
|
|
565
|
-
invariant3(value.startsWith(DID_PREFIX + MULTIBASE_PREFIX2), "Invalid multibase32 encoding"
|
|
566
|
-
F: __dxlog_file3,
|
|
567
|
-
L: 28,
|
|
568
|
-
S: void 0,
|
|
569
|
-
A: [
|
|
570
|
-
"value.startsWith(DID_PREFIX + MULTIBASE_PREFIX)",
|
|
571
|
-
"'Invalid multibase32 encoding'"
|
|
572
|
-
]
|
|
573
|
-
});
|
|
544
|
+
invariant3(value.startsWith(DID_PREFIX + MULTIBASE_PREFIX2), "Invalid multibase32 encoding");
|
|
574
545
|
return new Uint8Array((0, import_base32_decode2.default)(value.slice(10), "RFC4648"));
|
|
575
546
|
},
|
|
576
547
|
isValid: (value) => {
|
|
@@ -584,34 +555,51 @@ var MULTIBASE_PREFIX2 = "B";
|
|
|
584
555
|
var DID_PREFIX = "did:halo:";
|
|
585
556
|
var ENCODED_LENGTH2 = 42;
|
|
586
557
|
|
|
587
|
-
//
|
|
558
|
+
// src/parse-id.ts
|
|
559
|
+
init_inject_globals();
|
|
560
|
+
var SPACE_ID_LENGTH = 33;
|
|
561
|
+
var OBJECT_ID_LENGTH = 26;
|
|
562
|
+
var FQ_ID_LENGTH = SPACE_ID_LENGTH + OBJECT_ID_LENGTH + 1;
|
|
563
|
+
var parseId = (id) => {
|
|
564
|
+
if (!id) {
|
|
565
|
+
return {};
|
|
566
|
+
} else if (id.length === SPACE_ID_LENGTH) {
|
|
567
|
+
return {
|
|
568
|
+
spaceId: id
|
|
569
|
+
};
|
|
570
|
+
} else if (id.length === OBJECT_ID_LENGTH) {
|
|
571
|
+
return {
|
|
572
|
+
objectId: id
|
|
573
|
+
};
|
|
574
|
+
} else if (id.length === FQ_ID_LENGTH && id.indexOf(":") === SPACE_ID_LENGTH) {
|
|
575
|
+
const [spaceId, objectId] = id.split(":");
|
|
576
|
+
return {
|
|
577
|
+
spaceId,
|
|
578
|
+
objectId
|
|
579
|
+
};
|
|
580
|
+
} else {
|
|
581
|
+
return {};
|
|
582
|
+
}
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
// src/public-key.ts
|
|
588
586
|
init_inject_globals();
|
|
589
587
|
var import_base32_decode3 = __toESM(require_base32_decode(), 1);
|
|
590
588
|
import { devtoolsFormatter as devtoolsFormatter2, equalsSymbol, inspectCustom as inspectCustom2, truncateKey } from "@dxos/debug";
|
|
591
589
|
import { invariant as invariant4 } from "@dxos/invariant";
|
|
592
|
-
var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/common/keys/src/public-key.ts";
|
|
593
590
|
var PUBLIC_KEY_LENGTH = 32;
|
|
594
591
|
var SECRET_KEY_LENGTH = 64;
|
|
595
592
|
var isLikeArrayBuffer = (value) => typeof value === "object" && value !== null && Object.getPrototypeOf(value).constructor.name === "ArrayBuffer";
|
|
596
593
|
var PublicKey = class _PublicKey {
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
}
|
|
594
|
+
_value;
|
|
595
|
+
static ZERO = _PublicKey.from("00".repeat(PUBLIC_KEY_LENGTH));
|
|
600
596
|
/**
|
|
601
597
|
* Creates new instance of PublicKey automatically determining the input format.
|
|
602
598
|
* @param source A Buffer, or Uint8Array, or hex encoded string, or something with an `asUint8Array` method on it
|
|
603
599
|
* @returns PublicKey
|
|
604
600
|
*/
|
|
605
601
|
static from(source) {
|
|
606
|
-
invariant4(source
|
|
607
|
-
F: __dxlog_file4,
|
|
608
|
-
L: 49,
|
|
609
|
-
S: this,
|
|
610
|
-
A: [
|
|
611
|
-
"source",
|
|
612
|
-
""
|
|
613
|
-
]
|
|
614
|
-
});
|
|
602
|
+
invariant4(source);
|
|
615
603
|
if (source instanceof _PublicKey) {
|
|
616
604
|
return source;
|
|
617
605
|
} else if (source instanceof Buffer2) {
|
|
@@ -695,15 +683,7 @@ var PublicKey = class _PublicKey {
|
|
|
695
683
|
* @deprecated All keys should be represented as instances of PublicKey.
|
|
696
684
|
*/
|
|
697
685
|
static bufferize(str) {
|
|
698
|
-
invariant4(typeof str === "string", "Invalid type"
|
|
699
|
-
F: __dxlog_file4,
|
|
700
|
-
L: 152,
|
|
701
|
-
S: this,
|
|
702
|
-
A: [
|
|
703
|
-
"typeof str === 'string'",
|
|
704
|
-
"'Invalid type'"
|
|
705
|
-
]
|
|
706
|
-
});
|
|
686
|
+
invariant4(typeof str === "string", "Invalid type");
|
|
707
687
|
const buffer = Buffer2.from(str, "hex");
|
|
708
688
|
return buffer;
|
|
709
689
|
}
|
|
@@ -718,15 +698,7 @@ var PublicKey = class _PublicKey {
|
|
|
718
698
|
} else if (key instanceof Uint8Array) {
|
|
719
699
|
key = Buffer2.from(key.buffer, key.byteOffset, key.byteLength);
|
|
720
700
|
}
|
|
721
|
-
invariant4(key instanceof Buffer2, "Invalid type"
|
|
722
|
-
F: __dxlog_file4,
|
|
723
|
-
L: 171,
|
|
724
|
-
S: this,
|
|
725
|
-
A: [
|
|
726
|
-
"key instanceof Buffer",
|
|
727
|
-
"'Invalid type'"
|
|
728
|
-
]
|
|
729
|
-
});
|
|
701
|
+
invariant4(key instanceof Buffer2, "Invalid type");
|
|
730
702
|
return key.toString("hex");
|
|
731
703
|
}
|
|
732
704
|
/**
|
|
@@ -737,15 +709,7 @@ var PublicKey = class _PublicKey {
|
|
|
737
709
|
return key.toHex();
|
|
738
710
|
}
|
|
739
711
|
static fromMultibase32(encoded) {
|
|
740
|
-
invariant4(encoded.startsWith("B"), "Invalid multibase32 encoding"
|
|
741
|
-
F: __dxlog_file4,
|
|
742
|
-
L: 184,
|
|
743
|
-
S: this,
|
|
744
|
-
A: [
|
|
745
|
-
"encoded.startsWith('B')",
|
|
746
|
-
"'Invalid multibase32 encoding'"
|
|
747
|
-
]
|
|
748
|
-
});
|
|
712
|
+
invariant4(encoded.startsWith("B"), "Invalid multibase32 encoding");
|
|
749
713
|
return new _PublicKey(new Uint8Array((0, import_base32_decode3.default)(encoded.slice(1), "RFC4648")));
|
|
750
714
|
}
|
|
751
715
|
constructor(_value) {
|
|
@@ -772,7 +736,7 @@ var PublicKey = class _PublicKey {
|
|
|
772
736
|
toMultibase32() {
|
|
773
737
|
return "B" + base32Encode(this._value, "RFC4648");
|
|
774
738
|
}
|
|
775
|
-
truncate(length
|
|
739
|
+
truncate(length) {
|
|
776
740
|
return truncateKey(this, length);
|
|
777
741
|
}
|
|
778
742
|
asBuffer() {
|
|
@@ -878,13 +842,19 @@ var PublicKey = class _PublicKey {
|
|
|
878
842
|
};
|
|
879
843
|
export {
|
|
880
844
|
DXN,
|
|
845
|
+
DXN_ECHO_REGEXP,
|
|
846
|
+
FQ_ID_LENGTH,
|
|
881
847
|
IdentityDid,
|
|
882
848
|
LOCAL_SPACE_TAG,
|
|
849
|
+
OBJECT_ID_LENGTH,
|
|
883
850
|
ObjectId,
|
|
884
851
|
PUBLIC_KEY_LENGTH,
|
|
885
852
|
PublicKey,
|
|
886
853
|
QueueSubspaceTags,
|
|
887
854
|
SECRET_KEY_LENGTH,
|
|
888
|
-
|
|
855
|
+
SPACE_ID_LENGTH,
|
|
856
|
+
SimplePRNG,
|
|
857
|
+
SpaceId,
|
|
858
|
+
parseId
|
|
889
859
|
};
|
|
890
860
|
//# sourceMappingURL=index.mjs.map
|