@xyo-network/archivist 2.32.0-rc.1 → 2.32.0-rc.2

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 (61) hide show
  1. package/dist/cjs/Archivist.d.ts +5 -4
  2. package/dist/cjs/Archivist.d.ts.map +1 -1
  3. package/dist/cjs/XyoArchivist.d.ts +24 -3
  4. package/dist/cjs/XyoArchivist.d.ts.map +1 -1
  5. package/dist/cjs/XyoArchivist.js +44 -2
  6. package/dist/cjs/XyoArchivist.js.map +1 -1
  7. package/dist/cjs/XyoArchivistWrapper.d.ts +3 -2
  8. package/dist/cjs/XyoArchivistWrapper.d.ts.map +1 -1
  9. package/dist/cjs/XyoArchivistWrapper.js +2 -2
  10. package/dist/cjs/XyoArchivistWrapper.js.map +1 -1
  11. package/dist/cjs/XyoCookieArchivist.d.ts +33 -0
  12. package/dist/cjs/XyoCookieArchivist.d.ts.map +1 -0
  13. package/dist/cjs/XyoCookieArchivist.js +158 -0
  14. package/dist/cjs/XyoCookieArchivist.js.map +1 -0
  15. package/dist/cjs/XyoMemoryArchivist.d.ts +4 -9
  16. package/dist/cjs/XyoMemoryArchivist.d.ts.map +1 -1
  17. package/dist/cjs/XyoMemoryArchivist.js +25 -28
  18. package/dist/cjs/XyoMemoryArchivist.js.map +1 -1
  19. package/dist/cjs/XyoStorageArchivist.d.ts +33 -0
  20. package/dist/cjs/XyoStorageArchivist.d.ts.map +1 -0
  21. package/dist/cjs/XyoStorageArchivist.js +150 -0
  22. package/dist/cjs/XyoStorageArchivist.js.map +1 -0
  23. package/dist/cjs/index.d.ts +3 -0
  24. package/dist/cjs/index.d.ts.map +1 -1
  25. package/dist/cjs/index.js +3 -0
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/docs.json +12661 -4393
  28. package/dist/esm/Archivist.d.ts +5 -4
  29. package/dist/esm/Archivist.d.ts.map +1 -1
  30. package/dist/esm/XyoArchivist.d.ts +24 -3
  31. package/dist/esm/XyoArchivist.d.ts.map +1 -1
  32. package/dist/esm/XyoArchivist.js +32 -2
  33. package/dist/esm/XyoArchivist.js.map +1 -1
  34. package/dist/esm/XyoArchivistWrapper.d.ts +3 -2
  35. package/dist/esm/XyoArchivistWrapper.d.ts.map +1 -1
  36. package/dist/esm/XyoArchivistWrapper.js +2 -2
  37. package/dist/esm/XyoArchivistWrapper.js.map +1 -1
  38. package/dist/esm/XyoCookieArchivist.d.ts +33 -0
  39. package/dist/esm/XyoCookieArchivist.d.ts.map +1 -0
  40. package/dist/esm/XyoCookieArchivist.js +139 -0
  41. package/dist/esm/XyoCookieArchivist.js.map +1 -0
  42. package/dist/esm/XyoMemoryArchivist.d.ts +4 -9
  43. package/dist/esm/XyoMemoryArchivist.d.ts.map +1 -1
  44. package/dist/esm/XyoMemoryArchivist.js +15 -16
  45. package/dist/esm/XyoMemoryArchivist.js.map +1 -1
  46. package/dist/esm/XyoStorageArchivist.d.ts +33 -0
  47. package/dist/esm/XyoStorageArchivist.d.ts.map +1 -0
  48. package/dist/esm/XyoStorageArchivist.js +132 -0
  49. package/dist/esm/XyoStorageArchivist.js.map +1 -0
  50. package/dist/esm/index.d.ts +3 -0
  51. package/dist/esm/index.d.ts.map +1 -1
  52. package/dist/esm/index.js +3 -0
  53. package/dist/esm/index.js.map +1 -1
  54. package/package.json +10 -5
  55. package/src/Archivist.ts +6 -5
  56. package/src/XyoArchivist.ts +48 -5
  57. package/src/XyoArchivistWrapper.ts +5 -4
  58. package/src/XyoCookieArchivist.ts +176 -0
  59. package/src/XyoMemoryArchivist.ts +17 -26
  60. package/src/XyoStorageArchivist.ts +169 -0
  61. package/src/index.ts +3 -0
@@ -0,0 +1,132 @@
1
+ import { assertEx } from '@xylabs/sdk-js';
2
+ import { XyoPayloadWrapper } from '@xyo-network/payload';
3
+ import compact from 'lodash/compact';
4
+ import store from 'store2';
5
+ import { XyoArchivistAllQuerySchema, XyoArchivistClearQuerySchema, XyoArchivistCommitQuerySchema, XyoArchivistDeleteQuerySchema, XyoArchivistFindQuerySchema, XyoArchivistInsertQuerySchema, } from './Queries';
6
+ import { XyoArchivist } from './XyoArchivist';
7
+ export const XyoStorageArchivistConfigSchema = 'network.xyo.module.config.archivist.storage';
8
+ class StorageArchivistError extends Error {
9
+ constructor(action, error, message) {
10
+ super(`Storage Archivist [${action}] failed${message ? ` (${message})` : ''}`, { cause: error });
11
+ }
12
+ }
13
+ export class XyoStorageArchivist extends XyoArchivist {
14
+ get type() {
15
+ return this.config?.type ?? 'local';
16
+ }
17
+ get namespace() {
18
+ return this.config?.namespace ?? 'xyoarch';
19
+ }
20
+ get maxEntries() {
21
+ return this.config?.maxEntries ?? 1000;
22
+ }
23
+ get maxEntrySize() {
24
+ return this.config?.maxEntries ?? 16000;
25
+ }
26
+ get queries() {
27
+ return [
28
+ ...super.queries,
29
+ XyoArchivistAllQuerySchema,
30
+ XyoArchivistDeleteQuerySchema,
31
+ XyoArchivistClearQuerySchema,
32
+ XyoArchivistFindQuerySchema,
33
+ XyoArchivistCommitQuerySchema,
34
+ ];
35
+ }
36
+ storage;
37
+ constructor(config) {
38
+ super({ ...config, schema: XyoStorageArchivistConfigSchema });
39
+ this.storage = store[this.type].namespace(this.namespace);
40
+ }
41
+ delete(hashes) {
42
+ try {
43
+ return hashes.map((hash) => {
44
+ this.storage.remove(hash);
45
+ return true;
46
+ });
47
+ }
48
+ catch (ex) {
49
+ throw new StorageArchivistError('delete', ex, 'unexpected');
50
+ }
51
+ }
52
+ clear() {
53
+ try {
54
+ this.storage.clear();
55
+ }
56
+ catch (ex) {
57
+ throw new StorageArchivistError('clear', ex, 'unexpected');
58
+ }
59
+ }
60
+ async get(hashes) {
61
+ try {
62
+ return await Promise.all(hashes.map(async (hash) => {
63
+ const cookieString = this.storage.get(hash);
64
+ return cookieString ? JSON.parse(cookieString) : (await this.getFromParents(hash)) ?? null;
65
+ }));
66
+ }
67
+ catch (ex) {
68
+ throw new StorageArchivistError('get', ex, 'unexpected');
69
+ }
70
+ }
71
+ async insert(payloads) {
72
+ try {
73
+ const storedPayloads = payloads.map((payload) => {
74
+ const wrapper = new XyoPayloadWrapper(payload);
75
+ const hash = wrapper.hash;
76
+ const value = JSON.stringify(wrapper.payload);
77
+ assertEx(value.length < this.maxEntrySize, `Payload too large [${wrapper.hash}, ${value.length}]`);
78
+ this.storage.set(hash, JSON.stringify(wrapper.payload));
79
+ return wrapper.payload;
80
+ });
81
+ const boundwitness = this.bindPayloads(storedPayloads);
82
+ if (this.writeThrough) {
83
+ await this.writeToParents([boundwitness, ...storedPayloads]);
84
+ }
85
+ return boundwitness;
86
+ }
87
+ catch (ex) {
88
+ throw new StorageArchivistError('insert', ex, 'unexpected');
89
+ }
90
+ }
91
+ async find(filter) {
92
+ try {
93
+ const x = (await this.all()).filter((payload) => {
94
+ if (filter.schema && filter.schema !== payload.schema) {
95
+ return false;
96
+ }
97
+ return true;
98
+ });
99
+ return x;
100
+ }
101
+ catch (ex) {
102
+ throw new StorageArchivistError('find', ex, 'unexpected');
103
+ }
104
+ }
105
+ all() {
106
+ try {
107
+ return Object.entries(this.storage.getAll())
108
+ .filter(([key]) => key.startsWith(`${this.namespace}-`))
109
+ .map(([, value]) => JSON.parse(value));
110
+ }
111
+ catch (ex) {
112
+ throw new StorageArchivistError('all', ex, 'unexpected');
113
+ }
114
+ }
115
+ async commit() {
116
+ try {
117
+ const payloads = await this.all();
118
+ assertEx(payloads.length > 0, 'Nothing to commit');
119
+ const block = this.bindPayloads(payloads);
120
+ await Promise.allSettled(compact(Object.values(this.parents?.commit ?? [])?.map(async (parent) => {
121
+ const query = { payloads: [block, ...payloads], schema: XyoArchivistInsertQuerySchema };
122
+ return await parent?.query(query);
123
+ })));
124
+ await this.clear();
125
+ return block;
126
+ }
127
+ catch (ex) {
128
+ throw new StorageArchivistError('commit', ex, 'unexpected');
129
+ }
130
+ }
131
+ }
132
+ //# sourceMappingURL=XyoStorageArchivist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XyoStorageArchivist.js","sourceRoot":"","sources":["../../src/XyoStorageArchivist.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,11 @@
1
1
  export * from './Archivist';
2
2
  export * from './Config';
3
+ export * from './PartialArchivistConfig';
3
4
  export * from './Queries';
4
5
  export * from './XyoArchivist';
5
6
  export * from './XyoArchivistWrapper';
7
+ export * from './XyoCookieArchivist';
6
8
  export * from './XyoMemoryArchivist';
7
9
  export * from './XyoPayloadFindFilter';
10
+ export * from './XyoStorageArchivist';
8
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,0BAA0B,CAAA;AACxC,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA"}
package/dist/esm/index.js CHANGED
@@ -1,8 +1,11 @@
1
1
  export * from './Archivist';
2
2
  export * from './Config';
3
+ export * from './PartialArchivistConfig';
3
4
  export * from './Queries';
4
5
  export * from './XyoArchivist';
5
6
  export * from './XyoArchivistWrapper';
7
+ export * from './XyoCookieArchivist';
6
8
  export * from './XyoMemoryArchivist';
7
9
  export * from './XyoPayloadFindFilter';
10
+ export * from './XyoStorageArchivist';
8
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,0BAA0B,CAAA;AACxC,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA"}
package/package.json CHANGED
@@ -10,14 +10,19 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@xylabs/sdk-js": "^2.6.7",
13
- "@xyo-network/boundwitness": "^2.32.0-rc.1",
14
- "@xyo-network/module": "^2.32.0-rc.1",
15
- "@xyo-network/payload": "^2.32.0-rc.1",
16
- "@xyo-network/promisable": "^2.32.0-rc.1",
13
+ "@xyo-network/boundwitness": "^2.32.0-rc.2",
14
+ "@xyo-network/module": "^2.32.0-rc.2",
15
+ "@xyo-network/payload": "^2.32.0-rc.2",
16
+ "@xyo-network/promisable": "^2.32.0-rc.2",
17
+ "js-cookie": "^3.0.1",
17
18
  "lodash": "^4.17.21",
18
19
  "lru-cache": "^7.14.0",
20
+ "store2": "^2.14.2",
19
21
  "tslib": "^2.4.0"
20
22
  },
23
+ "devDependencies": {
24
+ "@types/js-cookie": "^3.0.2"
25
+ },
21
26
  "description": "Primary SDK for using XYO Protocol 2.0",
22
27
  "browser": "dist/esm/index.js",
23
28
  "docs": "dist/docs.json",
@@ -52,6 +57,6 @@
52
57
  },
53
58
  "sideEffects": false,
54
59
  "types": "dist/esm/index.d.ts",
55
- "version": "2.32.0-rc.1",
60
+ "version": "2.32.0-rc.2",
56
61
  "stableVersion": "2.31.5"
57
62
  }
package/src/Archivist.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { XyoBoundWitness } from '@xyo-network/boundwitness'
1
2
  import { Module } from '@xyo-network/module'
2
3
  import { XyoPayload } from '@xyo-network/payload'
3
4
  import { NullablePromisableArray, Promisable, PromisableArray } from '@xyo-network/promisable'
@@ -17,7 +18,7 @@ export interface WriteArchivist<
17
18
  TId = string,
18
19
  TQuery extends XyoArchivistQuery = XyoArchivistQuery,
19
20
  > extends Module<TQuery> {
20
- insert(item: TWrite[]): PromisableArray<TWriteResponse>
21
+ insert(item: TWrite[]): Promisable<TWriteResponse>
21
22
  delete?(ids: TId[]): PromisableArray<boolean>
22
23
  clear?(): Promisable<void>
23
24
  }
@@ -31,13 +32,13 @@ export interface FindArchivist<
31
32
  find(filter: TFindFilter): PromisableArray<TFindResponse>
32
33
  }
33
34
 
34
- export interface StashArchivist<TReadResponse, TQuery extends XyoArchivistQuery = XyoArchivistQuery> extends Module<TQuery> {
35
- commit?(): PromisableArray<TReadResponse>
35
+ export interface StashArchivist<TWriteResponse, TQuery extends XyoArchivistQuery = XyoArchivistQuery> extends Module<TQuery> {
36
+ commit?(): Promisable<TWriteResponse>
36
37
  }
37
38
 
38
39
  export interface Archivist<
39
40
  TReadResponse = XyoPayload | null,
40
- TWriteResponse = TReadResponse | null,
41
+ TWriteResponse = XyoBoundWitness | null,
41
42
  TWrite = TReadResponse,
42
43
  TFindResponse = TReadResponse | null,
43
44
  TFindFilter = XyoPayloadFindFilter,
@@ -46,4 +47,4 @@ export interface Archivist<
46
47
  > extends ReadArchivist<TReadResponse, TId, TQuery>,
47
48
  FindArchivist<TReadResponse, TFindResponse, TFindFilter, TQuery>,
48
49
  WriteArchivist<TReadResponse, TWriteResponse, TWrite, TId, TQuery>,
49
- StashArchivist<TReadResponse, TQuery> {}
50
+ StashArchivist<TWriteResponse, TQuery> {}
@@ -1,7 +1,9 @@
1
1
  import { assertEx } from '@xylabs/sdk-js'
2
+ import { XyoBoundWitness } from '@xyo-network/boundwitness'
2
3
  import { Module, XyoModule, XyoModuleInitializeQuerySchema, XyoModuleQueryResult, XyoModuleShutdownQuerySchema } from '@xyo-network/module'
3
- import { XyoPayload } from '@xyo-network/payload'
4
+ import { XyoPayload, XyoPayloadWrapper } from '@xyo-network/payload'
4
5
  import { NullablePromisableArray, Promisable, PromisableArray } from '@xyo-network/promisable'
6
+ import compact from 'lodash/compact'
5
7
 
6
8
  import { Archivist } from './Archivist'
7
9
  import { XyoArchivistConfig, XyoArchivistParents } from './Config'
@@ -11,7 +13,9 @@ import {
11
13
  XyoArchivistCommitQuerySchema,
12
14
  XyoArchivistDeleteQuerySchema,
13
15
  XyoArchivistFindQuerySchema,
16
+ XyoArchivistGetQuery,
14
17
  XyoArchivistGetQuerySchema,
18
+ XyoArchivistInsertQuery,
15
19
  XyoArchivistInsertQuerySchema,
16
20
  XyoArchivistQuery,
17
21
  XyoArchivistQuerySchema,
@@ -26,6 +30,14 @@ export abstract class XyoArchivist<TConfig extends XyoPayload = XyoPayload>
26
30
  return [XyoModuleInitializeQuerySchema, XyoModuleShutdownQuerySchema, XyoArchivistGetQuerySchema, XyoArchivistInsertQuerySchema]
27
31
  }
28
32
 
33
+ public get cacheParentReads() {
34
+ return !!this.config?.cacheParentReads
35
+ }
36
+
37
+ public get writeThrough() {
38
+ return !!this.config?.writeThrough
39
+ }
40
+
29
41
  public all(): PromisableArray<XyoPayload> {
30
42
  throw Error('Not implemented')
31
43
  }
@@ -34,7 +46,7 @@ export abstract class XyoArchivist<TConfig extends XyoPayload = XyoPayload>
34
46
  throw Error('Not implemented')
35
47
  }
36
48
 
37
- public commit(): PromisableArray<XyoPayload> {
49
+ public commit(): Promisable<XyoBoundWitness> {
38
50
  throw Error('Not implemented')
39
51
  }
40
52
 
@@ -48,7 +60,7 @@ export abstract class XyoArchivist<TConfig extends XyoPayload = XyoPayload>
48
60
 
49
61
  abstract get(hashes: string[]): NullablePromisableArray<XyoPayload>
50
62
 
51
- abstract insert(item: XyoPayload[]): PromisableArray<XyoPayload>
63
+ abstract insert(item: XyoPayload[]): Promisable<XyoBoundWitness>
52
64
 
53
65
  async query(query: XyoArchivistQuery): Promise<XyoModuleQueryResult> {
54
66
  if (!this.queries.find((schema) => schema === query.schema)) {
@@ -64,7 +76,7 @@ export abstract class XyoArchivist<TConfig extends XyoPayload = XyoPayload>
64
76
  await this.clear()
65
77
  break
66
78
  case XyoArchivistCommitQuerySchema:
67
- payloads.push(...(await this.commit()))
79
+ payloads.push(await this.commit())
68
80
  break
69
81
  case XyoArchivistDeleteQuerySchema:
70
82
  await this.delete(query.hashes)
@@ -76,7 +88,7 @@ export abstract class XyoArchivist<TConfig extends XyoPayload = XyoPayload>
76
88
  payloads.push(...(await this.get(query.hashes)))
77
89
  break
78
90
  case XyoArchivistInsertQuerySchema:
79
- payloads.push(...(await this.insert(query.payloads)))
91
+ payloads.push(await this.insert(query.payloads), ...query.payloads)
80
92
  break
81
93
  }
82
94
  return [this.bindPayloads(payloads), payloads]
@@ -92,6 +104,37 @@ export abstract class XyoArchivist<TConfig extends XyoPayload = XyoPayload>
92
104
  return resolved
93
105
  }
94
106
 
107
+ protected async getFromParents(hash: string) {
108
+ return compact(
109
+ await Promise.all(
110
+ Object.values(this.parents?.read ?? {}).map(async (parent) => {
111
+ const query: XyoArchivistGetQuery = { hashes: [hash], schema: XyoArchivistGetQuerySchema }
112
+ const [, payloads] = (await parent?.query(query)) ?? []
113
+ const wrapper = payloads?.[0] ? new XyoPayloadWrapper(payloads?.[0]) : undefined
114
+ if (wrapper && wrapper.hash !== hash) {
115
+ console.warn(`Parent [${parent?.address}] returned payload with invalid hash [${hash} != ${wrapper.hash}]`)
116
+ return null
117
+ }
118
+ return wrapper?.payload
119
+ }),
120
+ ),
121
+ )[0]
122
+ }
123
+
124
+ protected async writeToParent(parent: Module, payloads: XyoPayload[]) {
125
+ const query: XyoArchivistInsertQuery = { payloads, schema: XyoArchivistInsertQuerySchema }
126
+ const [, writtenPayloads] = (await parent?.query(query)) ?? []
127
+ return writtenPayloads
128
+ }
129
+
130
+ protected async writeToParents(payloads: XyoPayload[]) {
131
+ return await Promise.all(
132
+ Object.values(this.parents?.write ?? {}).map(async (parent) => {
133
+ return parent ? await this.writeToParent(parent, payloads) : undefined
134
+ }),
135
+ )
136
+ }
137
+
95
138
  private _parents?: XyoArchivistParents
96
139
  get parents() {
97
140
  this._parents = this._parents ?? {
@@ -1,3 +1,4 @@
1
+ import { XyoBoundWitness } from '@xyo-network/boundwitness'
1
2
  import { XyoModuleWrapper } from '@xyo-network/module'
2
3
  import { XyoPayload } from '@xyo-network/payload'
3
4
 
@@ -36,9 +37,9 @@ export class XyoArchivistWrapper extends XyoModuleWrapper implements Archivist {
36
37
  return (await this.module.query(query))[1]
37
38
  }
38
39
 
39
- public async insert(payloads: XyoPayload[]): Promise<(XyoPayload | null)[]> {
40
+ public async insert(payloads: XyoPayload[]): Promise<XyoBoundWitness> {
40
41
  const query: XyoArchivistInsertQuery = { payloads, schema: XyoArchivistInsertQuerySchema }
41
- return (await this.module.query(query))[1]
42
+ return (await this.module.query(query))[0]
42
43
  }
43
44
 
44
45
  public async find(filter: XyoPayloadFindFilter): Promise<(XyoPayload | null)[]> {
@@ -51,8 +52,8 @@ export class XyoArchivistWrapper extends XyoModuleWrapper implements Archivist {
51
52
  return (await this.module.query(query))[1]
52
53
  }
53
54
 
54
- public async commit(): Promise<(XyoPayload | null)[]> {
55
+ public async commit(): Promise<XyoBoundWitness> {
55
56
  const query: XyoArchivistCommitQuery = { schema: XyoArchivistCommitQuerySchema }
56
- return (await this.module.query(query))[1]
57
+ return (await this.module.query(query))[0]
57
58
  }
58
59
  }
@@ -0,0 +1,176 @@
1
+ import { assertEx } from '@xylabs/sdk-js'
2
+ import { XyoBoundWitness } from '@xyo-network/boundwitness'
3
+ import { XyoPayload, XyoPayloadWrapper } from '@xyo-network/payload'
4
+ import { PromisableArray } from '@xyo-network/promisable'
5
+ import Cookies from 'js-cookie'
6
+ import compact from 'lodash/compact'
7
+
8
+ import { XyoArchivistConfig } from './Config'
9
+ import { PartialArchivistConfig } from './PartialArchivistConfig'
10
+ import {
11
+ XyoArchivistAllQuerySchema,
12
+ XyoArchivistClearQuerySchema,
13
+ XyoArchivistCommitQuerySchema,
14
+ XyoArchivistDeleteQuerySchema,
15
+ XyoArchivistFindQuerySchema,
16
+ XyoArchivistInsertQuery,
17
+ XyoArchivistInsertQuerySchema,
18
+ } from './Queries'
19
+ import { XyoArchivist } from './XyoArchivist'
20
+ import { XyoPayloadFindFilter } from './XyoPayloadFindFilter'
21
+
22
+ export type XyoCookieArchivistConfigSchema = 'network.xyo.module.config.archivist.cookie'
23
+ export const XyoCookieArchivistConfigSchema: XyoCookieArchivistConfigSchema = 'network.xyo.module.config.archivist.cookie'
24
+
25
+ export type XyoCookieArchivistConfig = XyoArchivistConfig<{
26
+ schema: XyoCookieArchivistConfigSchema
27
+ domain?: string
28
+ maxEntries?: number
29
+ maxEntrySize?: number
30
+ namespace?: string
31
+ }>
32
+
33
+ class CookieArchivistError extends Error {
34
+ constructor(action: string, error: Error['cause'], message?: string) {
35
+ super(`Cookie Archivist [${action}] failed${message ? ` (${message})` : ''}`, { cause: error })
36
+ }
37
+ }
38
+
39
+ export class XyoCookieArchivist extends XyoArchivist<XyoCookieArchivistConfig> {
40
+ public get domain() {
41
+ return this.config?.domain
42
+ }
43
+
44
+ public get namespace() {
45
+ return this.config?.namespace ?? 'xyoarch'
46
+ }
47
+
48
+ public get maxEntries() {
49
+ //all browsers support at least 60 cookies
50
+ return this.config?.maxEntries ?? 60
51
+ }
52
+
53
+ public get maxEntrySize() {
54
+ //all browsers support at least 4000 length per cookie
55
+ return this.config?.maxEntrySize ?? 4000
56
+ }
57
+
58
+ public override get queries() {
59
+ return [
60
+ ...super.queries,
61
+ XyoArchivistAllQuerySchema,
62
+ XyoArchivistDeleteQuerySchema,
63
+ XyoArchivistClearQuerySchema,
64
+ XyoArchivistFindQuerySchema,
65
+ XyoArchivistCommitQuerySchema,
66
+ ]
67
+ }
68
+
69
+ constructor(config?: PartialArchivistConfig<XyoCookieArchivistConfig>) {
70
+ super({ ...config, schema: XyoCookieArchivistConfigSchema })
71
+ }
72
+
73
+ private keyFromHash(hash: string) {
74
+ return `${this.namespace}-${hash}`
75
+ }
76
+
77
+ public delete(hashes: string[]): PromisableArray<boolean> {
78
+ try {
79
+ return hashes.map((hash) => {
80
+ Cookies.remove(this.keyFromHash(hash))
81
+ return true
82
+ })
83
+ } catch (ex) {
84
+ throw new CookieArchivistError('delete', ex, 'unexpected')
85
+ }
86
+ }
87
+
88
+ public override clear(): void | Promise<void> {
89
+ try {
90
+ Object.entries(Cookies.get()).map(([key]) => {
91
+ if (key.startsWith(`${this.namespace}-`)) {
92
+ Cookies.remove(key)
93
+ }
94
+ })
95
+ } catch (ex) {
96
+ throw new CookieArchivistError('clear', ex, 'unexpected')
97
+ }
98
+ }
99
+
100
+ public async get(hashes: string[]): Promise<(XyoPayload | null)[]> {
101
+ try {
102
+ return await Promise.all(
103
+ hashes.map(async (hash) => {
104
+ const cookieString = Cookies.get(this.keyFromHash(hash))
105
+ return cookieString ? JSON.parse(cookieString) : (await this.getFromParents(hash)) ?? null
106
+ }),
107
+ )
108
+ } catch (ex) {
109
+ throw new CookieArchivistError('get', ex, 'unexpected')
110
+ }
111
+ }
112
+
113
+ public async insert(payloads: XyoPayload[]): Promise<XyoBoundWitness> {
114
+ try {
115
+ const storedPayloads = payloads.map((payload) => {
116
+ const wrapper = new XyoPayloadWrapper(payload)
117
+ const key = this.keyFromHash(wrapper.hash)
118
+ const value = JSON.stringify(wrapper.payload)
119
+ assertEx(value.length < this.maxEntrySize, `Payload too large [${wrapper.hash}, ${value.length}]`)
120
+ Cookies.set(key, JSON.stringify(wrapper.payload))
121
+ return wrapper.payload
122
+ })
123
+ const boundwitness = this.bindPayloads(storedPayloads)
124
+ if (this.writeThrough) {
125
+ await this.writeToParents([boundwitness, ...storedPayloads])
126
+ }
127
+ return boundwitness
128
+ } catch (ex) {
129
+ throw new CookieArchivistError('insert', ex, 'unexpected')
130
+ }
131
+ }
132
+
133
+ public async find(filter: XyoPayloadFindFilter): Promise<XyoPayload[]> {
134
+ try {
135
+ const x = (await this.all()).filter((payload) => {
136
+ if (filter.schema && filter.schema !== payload.schema) {
137
+ return false
138
+ }
139
+ return true
140
+ })
141
+ return x
142
+ } catch (ex) {
143
+ throw new CookieArchivistError('find', ex, 'unexpected')
144
+ }
145
+ }
146
+
147
+ public all(): PromisableArray<XyoPayload> {
148
+ try {
149
+ return Object.entries(Cookies.get())
150
+ .filter(([key]) => key.startsWith(`${this.namespace}-`))
151
+ .map(([, value]) => JSON.parse(value))
152
+ } catch (ex) {
153
+ throw new CookieArchivistError('all', ex, 'unexpected')
154
+ }
155
+ }
156
+
157
+ public async commit(): Promise<XyoBoundWitness> {
158
+ try {
159
+ const payloads = await this.all()
160
+ assertEx(payloads.length > 0, 'Nothing to commit')
161
+ const block = this.bindPayloads(payloads)
162
+ await Promise.allSettled(
163
+ compact(
164
+ Object.values(this.parents?.commit ?? [])?.map(async (parent) => {
165
+ const query: XyoArchivistInsertQuery = { payloads: [block, ...payloads], schema: XyoArchivistInsertQuerySchema }
166
+ return await parent?.query(query)
167
+ }),
168
+ ),
169
+ )
170
+ await this.clear()
171
+ return block
172
+ } catch (ex) {
173
+ throw new CookieArchivistError('commit', ex, 'unexpected')
174
+ }
175
+ }
176
+ }
@@ -1,5 +1,5 @@
1
1
  import { assertEx } from '@xylabs/sdk-js'
2
- import { XyoBoundWitness, XyoBoundWitnessBuilder } from '@xyo-network/boundwitness'
2
+ import { XyoBoundWitness } from '@xyo-network/boundwitness'
3
3
  import { XyoPayload, XyoPayloadWrapper } from '@xyo-network/payload'
4
4
  import { PromisableArray } from '@xyo-network/promisable'
5
5
  import compact from 'lodash/compact'
@@ -13,8 +13,6 @@ import {
13
13
  XyoArchivistCommitQuerySchema,
14
14
  XyoArchivistDeleteQuerySchema,
15
15
  XyoArchivistFindQuerySchema,
16
- XyoArchivistGetQuery,
17
- XyoArchivistGetQuerySchema,
18
16
  XyoArchivistInsertQuery,
19
17
  XyoArchivistInsertQuerySchema,
20
18
  } from './Queries'
@@ -76,25 +74,15 @@ export class XyoMemoryArchivist extends XyoArchivist<XyoMemoryArchivistConfig> {
76
74
  }
77
75
  }
78
76
 
79
- protected async getFromParents(hash: string) {
80
- return compact(
81
- await Promise.all(
82
- compact(
83
- Object.values(this.parents?.read ?? {}).map(async (parent) => {
84
- const query: XyoArchivistGetQuery = { hashes: [hash], schema: XyoArchivistGetQuerySchema }
85
- const [, payloads] = (await parent?.query(query)) ?? []
86
- return payloads?.[0]
87
- }),
88
- ),
89
- ),
90
- )[0]
91
- }
92
-
93
77
  public async get(hashes: string[]): Promise<(XyoPayload | null)[]> {
94
78
  try {
95
79
  return await Promise.all(
96
80
  hashes.map(async (hash) => {
97
- return this.cache.get(hash) ?? (await this.getFromParents(hash)) ?? null
81
+ const payload = this.cache.get(hash) ?? (await this.getFromParents(hash)) ?? null
82
+ if (this.cacheParentReads) {
83
+ this.cache.set(hash, payload)
84
+ }
85
+ return payload
98
86
  }),
99
87
  )
100
88
  } catch (ex) {
@@ -102,14 +90,19 @@ export class XyoMemoryArchivist extends XyoArchivist<XyoMemoryArchivistConfig> {
102
90
  }
103
91
  }
104
92
 
105
- public insert(payloads: XyoPayload[]): PromisableArray<XyoPayload> {
93
+ public async insert(payloads: XyoPayload[]): Promise<XyoBoundWitness> {
106
94
  try {
107
- return payloads.map((payload) => {
95
+ payloads.map((payload) => {
108
96
  const wrapper = new XyoPayloadWrapper(payload)
109
97
  const payloadWithmeta = { ...payload, _hash: wrapper.hash, _timestamp: Date.now() }
110
98
  this.cache.set(payloadWithmeta._hash, payloadWithmeta)
111
99
  return payloadWithmeta
112
100
  })
101
+ const boundwitness = this.bindPayloads(payloads)
102
+ if (this.writeThrough) {
103
+ await this.writeToParents(payloads)
104
+ }
105
+ return boundwitness
113
106
  } catch (ex) {
114
107
  throw new MemoryArchivistError('insert', ex, 'unexpected')
115
108
  }
@@ -129,7 +122,7 @@ export class XyoMemoryArchivist extends XyoArchivist<XyoMemoryArchivistConfig> {
129
122
  }
130
123
  }
131
124
 
132
- public all(): Promise<XyoPayload[]> | XyoPayload[] {
125
+ public all(): PromisableArray<XyoPayload> {
133
126
  try {
134
127
  return this.cache.dump().map((value) => value[1].value)
135
128
  } catch (ex) {
@@ -137,12 +130,10 @@ export class XyoMemoryArchivist extends XyoArchivist<XyoMemoryArchivistConfig> {
137
130
  }
138
131
  }
139
132
 
140
- public async commit(): Promise<XyoPayload[]> {
133
+ public async commit(): Promise<XyoBoundWitness> {
141
134
  try {
142
- const account = assertEx(this.account, 'Account is required for commit')
143
135
  const payloads = assertEx(await this.all(), 'Nothing to commit')
144
- const builder = new XyoBoundWitnessBuilder<XyoBoundWitness, XyoPayload>()
145
- const block = builder.payloads(payloads).witness(account).build()
136
+ const block = this.bindPayloads(payloads)
146
137
  await Promise.allSettled(
147
138
  compact(
148
139
  Object.values(this.parents?.commit ?? [])?.map(async (parent) => {
@@ -152,7 +143,7 @@ export class XyoMemoryArchivist extends XyoArchivist<XyoMemoryArchivistConfig> {
152
143
  ),
153
144
  )
154
145
  await this.clear()
155
- return payloads
146
+ return block
156
147
  } catch (ex) {
157
148
  throw new MemoryArchivistError('commit', ex, 'unexpected')
158
149
  }