@verdant-web/common 2.3.3 → 2.4.0-next.0

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 (60) hide show
  1. package/LICENSE +650 -21
  2. package/dist/esm/authz.d.ts +25 -0
  3. package/dist/esm/authz.js +54 -0
  4. package/dist/esm/authz.js.map +1 -0
  5. package/dist/esm/baseline.d.ts +1 -0
  6. package/dist/esm/baseline.js +3 -0
  7. package/dist/esm/baseline.js.map +1 -1
  8. package/dist/esm/files.d.ts +4 -0
  9. package/dist/esm/files.js +18 -0
  10. package/dist/esm/files.js.map +1 -1
  11. package/dist/esm/index.d.ts +2 -0
  12. package/dist/esm/index.js +2 -0
  13. package/dist/esm/index.js.map +1 -1
  14. package/dist/esm/indexes.js +1 -1
  15. package/dist/esm/indexes.js.map +1 -1
  16. package/dist/esm/indexes.test.js +1 -1
  17. package/dist/esm/indexes.test.js.map +1 -1
  18. package/dist/esm/migration.d.ts +4 -2
  19. package/dist/esm/migration.js.map +1 -1
  20. package/dist/esm/oids.d.ts +6 -24
  21. package/dist/esm/oids.js +18 -107
  22. package/dist/esm/oids.js.map +1 -1
  23. package/dist/esm/oids.test.js +1 -188
  24. package/dist/esm/oids.test.js.map +1 -1
  25. package/dist/esm/oidsLegacy.d.ts +18 -0
  26. package/dist/esm/oidsLegacy.js +72 -0
  27. package/dist/esm/oidsLegacy.js.map +1 -0
  28. package/dist/esm/oidsLegacy.test.d.ts +1 -0
  29. package/dist/esm/oidsLegacy.test.js +115 -0
  30. package/dist/esm/oidsLegacy.test.js.map +1 -0
  31. package/dist/esm/operation.d.ts +28 -4
  32. package/dist/esm/operation.js +70 -35
  33. package/dist/esm/operation.js.map +1 -1
  34. package/dist/esm/operation.test.js.map +1 -1
  35. package/dist/esm/presence.d.ts +0 -2
  36. package/dist/esm/schema/fields.js +1 -1
  37. package/dist/esm/schema/fields.js.map +1 -1
  38. package/dist/esm/schema/validation.js +14 -7
  39. package/dist/esm/schema/validation.js.map +1 -1
  40. package/dist/esm/utils.d.ts +1 -0
  41. package/dist/esm/utils.js +21 -0
  42. package/dist/esm/utils.js.map +1 -1
  43. package/package.json +1 -1
  44. package/src/authz.ts +67 -0
  45. package/src/baseline.ts +5 -4
  46. package/src/files.ts +25 -0
  47. package/src/index.ts +2 -0
  48. package/src/indexes.test.ts +1 -1
  49. package/src/indexes.ts +1 -1
  50. package/src/migration.ts +5 -1
  51. package/src/oids.test.ts +0 -241
  52. package/src/oids.ts +24 -122
  53. package/src/oidsLegacy.test.ts +147 -0
  54. package/src/oidsLegacy.ts +87 -0
  55. package/src/operation.test.ts +0 -1
  56. package/src/operation.ts +202 -103
  57. package/src/presence.ts +0 -2
  58. package/src/schema/fields.ts +1 -1
  59. package/src/schema/validation.ts +23 -14
  60. package/src/utils.ts +26 -0
package/dist/esm/utils.js CHANGED
@@ -125,4 +125,25 @@ export function debounce(fn, wait) {
125
125
  timeout = setTimeout(() => fn.apply(context, args), wait);
126
126
  };
127
127
  }
128
+ export function throttle(fn, wait) {
129
+ let lastTime = 0;
130
+ // invoke once for the last call
131
+ let trailingTimeout;
132
+ return function (...args) {
133
+ const context = this;
134
+ const now = Date.now();
135
+ if (now - lastTime >= wait) {
136
+ lastTime = now;
137
+ fn.apply(context, args);
138
+ clearTimeout(trailingTimeout);
139
+ }
140
+ else {
141
+ clearTimeout(trailingTimeout);
142
+ trailingTimeout = setTimeout(() => {
143
+ lastTime = now;
144
+ fn.apply(context, args);
145
+ }, wait);
146
+ }
147
+ };
148
+ }
128
149
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdant-web/common",
3
- "version": "2.3.3",
3
+ "version": "2.4.0-next.0",
4
4
  "access": "public",
5
5
  "type": "module",
6
6
  "exports": {
package/src/authz.ts ADDED
@@ -0,0 +1,67 @@
1
+ import { DocumentBaseline } from './baseline.js';
2
+ import { Operation } from './operation.js';
3
+
4
+ function encode(str: string): AuthorizationKey {
5
+ const val = Buffer.from(str).toString('base64');
6
+ return val as AuthorizationKey;
7
+ }
8
+
9
+ function decode(str: string): string {
10
+ return Buffer.from(str, 'base64').toString();
11
+ }
12
+
13
+ export type AuthorizationKey = string & {
14
+ '@@type': 'authz';
15
+ };
16
+
17
+ export const authz = {
18
+ onlyUser: (userId: string): AuthorizationKey => encode(`u:${userId}:*`),
19
+ onlyMe: (): AuthorizationKey => authz.onlyUser(ORIGINATOR_SUBJECT),
20
+ decode: (encoded: string) => {
21
+ const decoded = decode(encoded);
22
+ const parts = decoded.split(':');
23
+ if (parts.length !== 3) {
24
+ throw new Error('Invalid authz string');
25
+ }
26
+ return {
27
+ scope: parts[0],
28
+ subject: parts[1],
29
+ action: parts[2],
30
+ };
31
+ },
32
+ };
33
+
34
+ export const ORIGINATOR_SUBJECT = '$$_originator_$$';
35
+
36
+ /**
37
+ * Rewrites the special "originator" constant subject (used by
38
+ * local-only clients) to the given user ID.
39
+ *
40
+ * Used to initialize a library from a local-only replica
41
+ */
42
+ export function rewriteAuthzOriginator(
43
+ data: { operations?: Operation[]; baselines?: DocumentBaseline[] },
44
+ newSubject: string,
45
+ ) {
46
+ const { operations, baselines } = data;
47
+ if (operations) {
48
+ for (const op of operations) {
49
+ if (op.authz) {
50
+ const decoded = authz.decode(op.authz);
51
+ if (decoded.subject === ORIGINATOR_SUBJECT) {
52
+ op.authz = authz.onlyUser(newSubject);
53
+ }
54
+ }
55
+ }
56
+ }
57
+ if (baselines) {
58
+ for (const baseline of baselines) {
59
+ if (baseline.authz) {
60
+ const decoded = authz.decode(baseline.authz);
61
+ if (decoded.subject === ORIGINATOR_SUBJECT) {
62
+ baseline.authz = authz.onlyUser(newSubject);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
package/src/baseline.ts CHANGED
@@ -1,9 +1,10 @@
1
+ // A: Docs without a base state don't have a baseline, it's
2
+ // written upon rebasing. If you apply ops to an undefined
3
+ // snapshot without an initialize, it remains undefined.
4
+
1
5
  export type DocumentBaseline<T extends any = any> = {
2
6
  oid: string;
3
7
  snapshot: T;
4
8
  timestamp: string;
5
- // TODO: is a deleted flag required here? can we disambiguate
6
- // a document which was snapshotted in a deleted state, vs
7
- // one without a base state at all? what happens if you apply
8
- // ops onto an undefined snapshot (which aren't initialize)?
9
+ authz?: string;
9
10
  };
package/src/files.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { isObject } from './utils.js';
2
+
1
3
  export type FileRef = {
2
4
  '@@type': 'file';
3
5
  id: string;
@@ -22,7 +24,9 @@ export type FileData = {
22
24
  remote: boolean;
23
25
  name: string;
24
26
  type: string;
27
+ /** A local File instance, if available. */
25
28
  file?: Blob;
29
+ /** The server URL of this file. */
26
30
  url?: string;
27
31
  };
28
32
 
@@ -32,3 +36,24 @@ export function getAllFileFields(snapshot: any): [string, FileRef][] {
32
36
  FileRef,
33
37
  ][];
34
38
  }
39
+
40
+ export function isFile(value: any) {
41
+ if (typeof File !== 'undefined' && value instanceof File) {
42
+ return true;
43
+ }
44
+ if (typeof Blob !== 'undefined' && value instanceof Blob) {
45
+ return true;
46
+ }
47
+ return false;
48
+ }
49
+
50
+ export function isFileData(value: any): value is FileData {
51
+ return (
52
+ value &&
53
+ isObject(value) &&
54
+ typeof value.id === 'string' &&
55
+ typeof value.remote === 'boolean' &&
56
+ typeof value.name === 'string' &&
57
+ typeof value.type === 'string'
58
+ );
59
+ }
package/src/index.ts CHANGED
@@ -20,6 +20,7 @@ export type {
20
20
  export type { UserInfo } from './presence.js';
21
21
  export * from './patch.js';
22
22
  export * from './oids.js';
23
+ export * from './oidsLegacy.js';
23
24
  export * from './EventSubscriber.js';
24
25
  export * from './undo.js';
25
26
  export * from './batching.js';
@@ -28,3 +29,4 @@ export type { Ref } from './refs.js';
28
29
  export { makeObjectRef, makeFileRef, isRef, compareRefs } from './refs.js';
29
30
  export * from './memo.js';
30
31
  export * from './error.js';
32
+ export * from './authz.js';
@@ -185,7 +185,7 @@ describe('all indexes', () => {
185
185
  ),
186
186
  ).toEqual({
187
187
  foobar: 'foo' + COMPOUND_INDEX_SEPARATOR + 'foobar',
188
- '@@@snapshot': { foo: 'foo' },
188
+ '@@@snapshot': JSON.stringify({ foo: 'foo' }),
189
189
  foo: 'foo',
190
190
  bar: 'foobar',
191
191
  });
package/src/indexes.ts CHANGED
@@ -161,7 +161,7 @@ export function getIndexValues(
161
161
  basicIndexes,
162
162
  computeCompoundIndices(schema, { ...doc, ...basicIndexes }),
163
163
  );
164
- basicIndexes['@@@snapshot'] = doc;
164
+ basicIndexes['@@@snapshot'] = JSON.stringify(doc);
165
165
  return basicIndexes;
166
166
  }
167
167
 
package/src/migration.ts CHANGED
@@ -13,6 +13,7 @@ import {
13
13
  getOid,
14
14
  hasDefault,
15
15
  validateEntity,
16
+ AuthorizationKey,
16
17
  } from './index.js';
17
18
 
18
19
  /**@deprecated */
@@ -473,7 +474,10 @@ type MigrationQueries<Old extends SchemaDocuments> = {
473
474
  };
474
475
  type MigrationMutations<New extends SchemaDocuments> = {
475
476
  [Key in keyof New]: {
476
- put(document: New[Key]['init']): Promise<New[Key]['snapshot']>;
477
+ put(
478
+ document: New[Key]['init'],
479
+ options?: { access?: AuthorizationKey },
480
+ ): Promise<New[Key]['snapshot']>;
477
481
  delete(primaryKey: string): Promise<void>;
478
482
  };
479
483
  };
package/src/oids.test.ts CHANGED
@@ -1,27 +1,15 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import { createFileRef } from './files.js';
3
3
  import {
4
- areOidsRelated,
5
4
  assignOid,
6
- assignOidPropertiesToAllSubObjects,
7
- assignOidProperty,
8
5
  assignOidsToAllSubObjects,
9
6
  createOid,
10
- createSubOid,
11
7
  decomposeOid,
12
- getOid,
13
8
  getOidSubIdRange,
14
- getOidRoot,
15
9
  hasOid,
16
- maybeGetOidProperty,
17
10
  normalize,
18
11
  normalizeFirstLevel,
19
12
  ObjectIdentifier,
20
- removeOidPropertiesFromAllSubObjects,
21
- getLegacyDotOidSubIdRange,
22
- replaceLegacyOidsInJsonString,
23
- MATCH_LEGACY_OID_JSON_STRING,
24
- replaceLegacyOidsInObject,
25
13
  } from './oids.js';
26
14
 
27
15
  describe('normalizing an object', () => {
@@ -280,127 +268,6 @@ describe('computing a range of oids for a whole object set', () => {
280
268
  expect(isWithin('test/a1', start, end)).toBe(false);
281
269
  expect(isWithin('test/a1:3', start, end)).toBe(false);
282
270
  });
283
- it('should accommodate legacy dot style oids', () => {
284
- const [start, end] = getLegacyDotOidSubIdRange('test/a.foo:barrrr');
285
- expect(start).toEqual('test/a.');
286
- expect(end).toEqual('test/a.\uffff');
287
- expect(start < end).toBe(true);
288
- expect(isWithin('test/a.foo:0', start, end)).toBe(true);
289
- expect(isWithin('test/a.foo:1', start, end)).toBe(true);
290
- expect(isWithin('test/a.bar:zzzzzzzzzzzzzzzzzzzzzzz', start, end)).toBe(
291
- true,
292
- );
293
- expect(isWithin('test/a.aff:\uffff', start, end)).toBe(true);
294
- expect(isWithin('test1/a', start, end)).toBe(false);
295
- expect(isWithin('test/b', start, end)).toBe(false);
296
- expect(isWithin('test/ ', start, end)).toBe(false);
297
- expect(isWithin('test/a1', start, end)).toBe(false);
298
- expect(isWithin('test/a1:3', start, end)).toBe(false);
299
- expect(isWithin('test/a.foo:barrrr', start, end)).toBe(true);
300
- });
301
- });
302
-
303
- describe('assigning OIDs as properties', () => {
304
- it('should assign to all sub-objects', () => {
305
- let i = 0;
306
- function createSubId() {
307
- return (i++).toString();
308
- }
309
-
310
- const initial = {
311
- foo: {
312
- bar: 1,
313
- baz: [2, 3],
314
- },
315
- qux: [
316
- {
317
- corge: true,
318
- },
319
- {
320
- grault: {
321
- garply: 4,
322
- },
323
- },
324
- ],
325
- };
326
- assignOid(initial, 'test/a');
327
- assignOidsToAllSubObjects(initial, createSubId);
328
- assignOidPropertiesToAllSubObjects(initial);
329
-
330
- expect(initial).toMatchInlineSnapshot(`
331
- {
332
- "@@id": "test/a",
333
- "foo": {
334
- "@@id": "test/a:0",
335
- "bar": 1,
336
- "baz": [
337
- 2,
338
- 3,
339
- ],
340
- },
341
- "qux": [
342
- {
343
- "@@id": "test/a:3",
344
- "corge": true,
345
- },
346
- {
347
- "@@id": "test/a:4",
348
- "grault": {
349
- "@@id": "test/a:5",
350
- "garply": 4,
351
- },
352
- },
353
- ],
354
- }
355
- `);
356
- // extra check needed for array since it doesn't serialize in the snapshot
357
- expect(maybeGetOidProperty(initial.qux)).toBe('test/a:2');
358
- });
359
-
360
- it('should transfer assigned OID properties to the memory system', () => {
361
- const initial = assignOidProperty(
362
- {
363
- foo: assignOidProperty(
364
- {
365
- bar: 1,
366
- },
367
- 'test/a:1',
368
- ),
369
- qux: assignOidProperty(
370
- [
371
- assignOidProperty(
372
- {
373
- corge: true,
374
- },
375
- 'test/a:2',
376
- ),
377
- assignOidProperty(
378
- {
379
- grault: assignOidProperty(
380
- {
381
- garply: 4,
382
- },
383
- 'test/a:3',
384
- ),
385
- },
386
- 'test/a:4',
387
- ),
388
- ],
389
- 'test/a:2',
390
- ),
391
- },
392
- 'test/a',
393
- );
394
-
395
- removeOidPropertiesFromAllSubObjects(initial);
396
-
397
- expect(getOid(initial)).toEqual('test/a');
398
- expect(getOid(initial.foo)).toEqual('test/a:1');
399
- expect(getOid(initial.qux)).toEqual('test/a:2');
400
- expect(getOid(initial.qux[0])).toEqual('test/a:2');
401
- expect(getOid(initial.qux[1])).toEqual('test/a:4');
402
- expect(getOid(initial.qux[1].grault)).toEqual('test/a:3');
403
- });
404
271
  });
405
272
 
406
273
  it('should handle special characters in document id or collection', () => {
@@ -430,111 +297,3 @@ describe('assigning OIDs to sub-objects', () => {
430
297
  expect(hasOid(obj.bar[0])).toBe(false);
431
298
  });
432
299
  });
433
-
434
- describe('handling legacy OIDs', () => {
435
- it('should get the root OID for a legacy OID', () => {
436
- expect(getOidRoot('items/clabgyjfh00003968qycsq3ld.inputs.#')).toEqual(
437
- 'items/clabgyjfh00003968qycsq3ld',
438
- );
439
- });
440
- it('should create sub-ids for legacy OIDs in new format', () => {
441
- expect(
442
- createSubOid(
443
- 'items/clabgyjfh00003968qycsq3ld.inputs.#',
444
- () => 'pseudorandom',
445
- ),
446
- ).toEqual('items/clabgyjfh00003968qycsq3ld:pseudorandom');
447
- });
448
- it('should identify new sub-OIDs as related to the legacy root OID', () => {
449
- expect(
450
- areOidsRelated(
451
- 'items/clabgyjfh00003968qycsq3ld.inputs.#',
452
- 'items/clabgyjfh00003968qycsq3ld:pseudorandom',
453
- ),
454
- ).toBe(true);
455
- });
456
- it.each([
457
- ['items/clabgyjfh00003968qycsq3ld.inputs.#:baz', true],
458
- // include more unicode chars
459
- ['items/clabgyjfh00003968qycsq3ld\ufea3.inputs\u39fc.#:baz!!!', true],
460
- // not matching new oids
461
- ['items/clabgyjfh00003968qycsq3ld', false],
462
- ['items/clabgyjfh00003968qycsq3ld:baz', false],
463
- ['items/clabgyjfh00003968qycsq3ld:baz1111', false],
464
- // not matching anything else
465
- [
466
- 'PREPARE SOUS VIDE BATH: Fill container or pot with water. Set the temperature to 130F/54.4C – 132F/55.5C (for very moist and tender) and allow water to heat to that temperature.Tip: start with hot tap water instead of cold water to reduce heating time. Note 4 for other temperatures.',
467
- false,
468
- ],
469
- ])('matches legacy oids', (oid, match) => {
470
- expect(MATCH_LEGACY_OID_JSON_STRING.test('"' + oid + '"'), oid).toBe(match);
471
- // regex are stateful 🙄
472
- MATCH_LEGACY_OID_JSON_STRING.lastIndex = 0;
473
- });
474
- it.each([
475
- [
476
- { op: 'delete', oid: 'items/clabgyjfh00003968qycsq3ld.inputs.#:baz' },
477
- { op: 'delete', oid: 'items/clabgyjfh00003968qycsq3ld:baz' },
478
- ],
479
- [
480
- {
481
- op: 'list-push',
482
- oid: 'items/clabgyjfh00003968qycsq3ld.inputs.#:baz',
483
- value: {
484
- '@@type': 'ref',
485
- id: 'items/clabgyjfh00003968qycsq3ld.inputs.#:qux',
486
- },
487
- },
488
- {
489
- op: 'list-push',
490
- oid: 'items/clabgyjfh00003968qycsq3ld:baz',
491
- value: { '@@type': 'ref', id: 'items/clabgyjfh00003968qycsq3ld:qux' },
492
- },
493
- ],
494
- [
495
- {
496
- op: 'list-remove',
497
- oid: 'items/clabgyjfh00003968qycsq3ld.inputs.#:baz',
498
- value: {
499
- '@@type': 'ref',
500
- id: 'items/clabgyjfh00003968qycsq3ld.inputs.#:qux',
501
- },
502
- },
503
- {
504
- op: 'list-remove',
505
- oid: 'items/clabgyjfh00003968qycsq3ld:baz',
506
- value: { '@@type': 'ref', id: 'items/clabgyjfh00003968qycsq3ld:qux' },
507
- },
508
- ],
509
- [
510
- {
511
- oid: 'items/clabgyjfh00003968qycsq3ld.inputs.#:baz',
512
- timestamp: '2021-03-04T21:00:00.000Z',
513
- snapshot: {
514
- foo: 1,
515
- bar: {
516
- '@@type': 'ref',
517
- id: 'items/clabgyjfh00003968qycsq3ld.inputs.#:qux',
518
- },
519
- },
520
- },
521
- {
522
- oid: 'items/clabgyjfh00003968qycsq3ld:baz',
523
- timestamp: '2021-03-04T21:00:00.000Z',
524
- snapshot: {
525
- foo: 1,
526
- bar: { '@@type': 'ref', id: 'items/clabgyjfh00003968qycsq3ld:qux' },
527
- },
528
- },
529
- ],
530
- [
531
- { oid: 'test/what if.boo.blah so what:fajsdfj' },
532
- { oid: 'test/what if:fajsdfj' },
533
- ],
534
- ])(
535
- 'should replace legacy OIDs in a JSON string with new OIDs',
536
- (from, to) => {
537
- expect(replaceLegacyOidsInObject(from), JSON.stringify(from)).toEqual(to);
538
- },
539
- );
540
- });