@xyo-network/api 2.21.20 → 2.21.23
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/dist/cjs/Archivist/Model/Archivist.d.ts +6 -4
- package/dist/cjs/Archivist/Payload/Api.d.ts +1 -7
- package/dist/cjs/Archivist/Payload/Api.js.map +1 -1
- package/dist/cjs/Archivist/XyoApiArchivist.d.ts +12 -0
- package/dist/cjs/Archivist/XyoApiArchivist.js +35 -0
- package/dist/cjs/Archivist/XyoApiArchivist.js.map +1 -0
- package/dist/cjs/Archivist/XyoArchivist.d.ts +17 -0
- package/dist/cjs/Archivist/XyoArchivist.js +35 -0
- package/dist/cjs/Archivist/XyoArchivist.js.map +1 -0
- package/dist/cjs/Archivist/XyoMemoryArchivist.d.ts +12 -0
- package/dist/cjs/Archivist/XyoMemoryArchivist.js +65 -0
- package/dist/cjs/Archivist/XyoMemoryArchivist.js.map +1 -0
- package/dist/cjs/Archivist/index.d.ts +1 -1
- package/dist/cjs/Archivist/index.js +1 -1
- package/dist/cjs/Archivist/index.js.map +1 -1
- package/dist/esm/Archivist/Model/Archivist.d.ts +6 -4
- package/dist/esm/Archivist/Payload/Api.d.ts +1 -7
- package/dist/esm/Archivist/Payload/Api.js.map +1 -1
- package/dist/esm/Archivist/XyoApiArchivist.d.ts +12 -0
- package/dist/esm/Archivist/XyoApiArchivist.js +22 -0
- package/dist/esm/Archivist/XyoApiArchivist.js.map +1 -0
- package/dist/esm/Archivist/XyoArchivist.d.ts +17 -0
- package/dist/esm/Archivist/XyoArchivist.js +28 -0
- package/dist/esm/Archivist/XyoArchivist.js.map +1 -0
- package/dist/esm/Archivist/XyoMemoryArchivist.d.ts +12 -0
- package/dist/esm/Archivist/XyoMemoryArchivist.js +58 -0
- package/dist/esm/Archivist/XyoMemoryArchivist.js.map +1 -0
- package/dist/esm/Archivist/index.d.ts +1 -1
- package/dist/esm/Archivist/index.js +1 -1
- package/dist/esm/Archivist/index.js.map +1 -1
- package/package.json +8 -6
- package/src/Archivist/Payload/Api.ts +1 -8
- package/src/Archivist/XyoApiArchivist.ts +31 -0
- package/src/Archivist/index.ts +1 -1
- package/src/Archivist/Model/Archivist.ts +0 -20
- package/src/Archivist/Model/index.ts +0 -1
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
export interface QueryableArchivist<TQueryResponse, TQuery> {
|
|
2
|
-
find(query: TQuery): Promise<TQueryResponse
|
|
2
|
+
find(query: TQuery): Promise<TQueryResponse> | TQueryResponse;
|
|
3
3
|
}
|
|
4
4
|
export interface ReadArchivist<TReadResponse, TId = string> {
|
|
5
|
-
get(id: TId): Promise<TReadResponse
|
|
5
|
+
get(id: TId): Promise<TReadResponse | undefined> | TReadResponse | undefined;
|
|
6
6
|
}
|
|
7
|
-
export interface WriteArchivist<TWriteResponse, TWrite> {
|
|
8
|
-
insert(item: TWrite): Promise<TWriteResponse
|
|
7
|
+
export interface WriteArchivist<TWriteResponse, TWrite, TId = string> {
|
|
8
|
+
insert(item: TWrite): Promise<TWriteResponse> | TWriteResponse;
|
|
9
|
+
delete?(id: TId): Promise<boolean> | boolean;
|
|
10
|
+
clear?(): void;
|
|
9
11
|
}
|
|
10
12
|
export declare type ReadWriteArchivist<TWriteResponse, TWrite, TReadResponse = TWriteResponse, TId = string> = ReadArchivist<TReadResponse, TId> & WriteArchivist<TWriteResponse, TWrite>;
|
|
11
13
|
export declare type Archivist<TWriteResponse, TWrite, TReadResponse = TWriteResponse, TId = string, TQueryResponse = unknown, TQuery = unknown> = ReadWriteArchivist<TWriteResponse, TWrite, TReadResponse, TId> & QueryableArchivist<TQueryResponse, TQuery>;
|
|
@@ -1,15 +1,9 @@
|
|
|
1
|
+
import { XyoPayloadFindFilter } from '@xyo-network/archivist';
|
|
1
2
|
import { XyoPayload, XyoPayloadWithPartialMeta } from '@xyo-network/payload';
|
|
2
3
|
import { XyoApiConfig } from '../../models';
|
|
3
4
|
import { XyoApiSimple } from '../../Simple';
|
|
4
5
|
import { WithArchive } from '../../WithArchive';
|
|
5
6
|
import { XyoArchivistArchivePayloadSchemaApi } from './Schema';
|
|
6
|
-
export interface XyoPayloadFindFilter {
|
|
7
|
-
[key: string]: unknown;
|
|
8
|
-
order?: 'desc' | 'asc';
|
|
9
|
-
timestamp?: number;
|
|
10
|
-
limit?: number;
|
|
11
|
-
schema?: string;
|
|
12
|
-
}
|
|
13
7
|
export interface XyoPayloadStats {
|
|
14
8
|
count: number;
|
|
15
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Api.js","sourceRoot":"","sources":["../../../../src/Archivist/Payload/Api.ts"],"names":[],"mappings":";;;;AAAA,2CAAyC;
|
|
1
|
+
{"version":3,"file":"Api.js","sourceRoot":"","sources":["../../../../src/Archivist/Payload/Api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { XyoAccount } from '@xyo-network/account';
|
|
2
|
+
import { XyoArchivist, XyoPayloadFindFilter } from '@xyo-network/archivist';
|
|
3
|
+
import { XyoBoundWitnessWithPartialMeta } from '@xyo-network/boundwitness';
|
|
4
|
+
import { XyoArchivistApi } from './Api';
|
|
5
|
+
export declare class XyoApiArchivist extends XyoArchivist {
|
|
6
|
+
protected api: XyoArchivistApi;
|
|
7
|
+
protected archive: string;
|
|
8
|
+
constructor(api: XyoArchivistApi, archive: string, parent?: XyoArchivist, account?: XyoAccount);
|
|
9
|
+
get(hash: string): Promise<import("@xyo-network/payload").XyoPayload<object> | undefined>;
|
|
10
|
+
insert(payload: XyoBoundWitnessWithPartialMeta): Promise<string[]>;
|
|
11
|
+
find(filter: XyoPayloadFindFilter): Promise<import("@xyo-network/payload").XyoPayloadWithPartialMeta<unknown>[]>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.XyoApiArchivist = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const sdk_js_1 = require("@xylabs/sdk-js");
|
|
6
|
+
const archivist_1 = require("@xyo-network/archivist");
|
|
7
|
+
class XyoApiArchivist extends archivist_1.XyoArchivist {
|
|
8
|
+
constructor(api, archive, parent, account) {
|
|
9
|
+
super(parent, account);
|
|
10
|
+
this.api = api;
|
|
11
|
+
this.archive = archive;
|
|
12
|
+
}
|
|
13
|
+
get(hash) {
|
|
14
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
15
|
+
const [payloads] = yield this.api.archive(this.archive).payload.hash(hash).get('tuple');
|
|
16
|
+
return payloads === null || payloads === void 0 ? void 0 : payloads.pop();
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
insert(payload) {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
22
|
+
return (_b = (_a = (yield this.api.archive(this.archive).block.post([payload]))) === null || _a === void 0 ? void 0 : _a.map((value) => (0, sdk_js_1.assertEx)(value._hash))) !== null && _b !== void 0 ? _b : [];
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
find(filter) {
|
|
26
|
+
var _a, _b;
|
|
27
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
const [payloads = []] = (_a = (yield this.api.archive(this.archive).payload.find(filter, 'tuple'))) !== null && _a !== void 0 ? _a : [];
|
|
29
|
+
const [blocks = []] = (_b = (yield this.api.archive(this.archive).block.find(filter, 'tuple'))) !== null && _b !== void 0 ? _b : [];
|
|
30
|
+
return payloads.concat(blocks);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.XyoApiArchivist = XyoApiArchivist;
|
|
35
|
+
//# sourceMappingURL=XyoApiArchivist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XyoApiArchivist.js","sourceRoot":"","sources":["../../../src/Archivist/XyoApiArchivist.ts"],"names":[],"mappings":";;;;AAAA,2CAAyC;AAEzC,sDAA2E;AAK3E,MAAa,eAAgB,SAAQ,wBAAY;IAG/C,YAAY,GAAoB,EAAE,OAAe,EAAE,MAAqB,EAAE,OAAoB;QAC5F,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACtB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAEY,GAAG,CAAC,IAAY;;YAC3B,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACvF,OAAO,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,GAAG,EAAE,CAAA;QACxB,CAAC;KAAA;IAEY,MAAM,CAAC,OAAuC;;;YACzD,OAAO,MAAA,MAAA,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,0CAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,iBAAQ,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,mCAAI,EAAE,CAAA;;KACjH;IAEY,IAAI,CAAC,MAA4B;;;YAC5C,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,MAAA,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,mCAAI,EAAE,CAAA;YAClG,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,MAAA,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,mCAAI,EAAE,CAAA;YAC9F,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;;KAC/B;CACF;AAvBD,0CAuBC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { XyoAccount } from '@xyo-network/account';
|
|
2
|
+
import { XyoBoundWitness, XyoBoundWitnessWithPartialMeta } from '@xyo-network/boundwitness';
|
|
3
|
+
import { XyoPayload, XyoPayloadWithPartialMeta } from '@xyo-network/payload';
|
|
4
|
+
import { Archivist } from './Model';
|
|
5
|
+
import { XyoPayloadFindFilter } from './Payload';
|
|
6
|
+
export declare abstract class XyoArchivist<TWrite extends XyoBoundWitness = XyoBoundWitnessWithPartialMeta, TRead extends XyoPayload = XyoPayloadWithPartialMeta> implements Archivist<string[], TWrite, TRead | undefined, string, TRead[], XyoPayloadFindFilter> {
|
|
7
|
+
protected parent?: XyoArchivist;
|
|
8
|
+
protected account?: XyoAccount;
|
|
9
|
+
constructor(parent?: XyoArchivist, account?: XyoAccount);
|
|
10
|
+
abstract insert(item: TWrite): string[] | Promise<string[]>;
|
|
11
|
+
abstract find(query: XyoPayloadFindFilter): TRead[] | Promise<TRead[]>;
|
|
12
|
+
abstract get(hash: string): TRead | Promise<TRead | undefined> | undefined;
|
|
13
|
+
all(): TRead[] | Promise<TRead[] | undefined> | undefined;
|
|
14
|
+
delete(_hash: string): boolean | Promise<boolean>;
|
|
15
|
+
clear(): void | Promise<void>;
|
|
16
|
+
commit(): Promise<string>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.XyoArchivist = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const sdk_js_1 = require("@xylabs/sdk-js");
|
|
6
|
+
const boundwitness_1 = require("@xyo-network/boundwitness");
|
|
7
|
+
class XyoArchivist {
|
|
8
|
+
constructor(parent, account) {
|
|
9
|
+
this.parent = parent;
|
|
10
|
+
this.account = account;
|
|
11
|
+
}
|
|
12
|
+
all() {
|
|
13
|
+
throw Error('getAll not supported');
|
|
14
|
+
}
|
|
15
|
+
delete(_hash) {
|
|
16
|
+
throw Error('delete not supported');
|
|
17
|
+
}
|
|
18
|
+
clear() {
|
|
19
|
+
throw Error('clear not supported');
|
|
20
|
+
}
|
|
21
|
+
commit() {
|
|
22
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
23
|
+
const parent = (0, sdk_js_1.assertEx)(this.parent, 'Parent is required for commit');
|
|
24
|
+
const account = (0, sdk_js_1.assertEx)(this.account, 'Account is required for commit');
|
|
25
|
+
const payloads = (0, sdk_js_1.assertEx)(yield parent.all(), 'Nothing to commit');
|
|
26
|
+
const builder = new boundwitness_1.XyoBoundWitnessBuilder();
|
|
27
|
+
const block = builder.payloads(payloads).witness(account).build();
|
|
28
|
+
const [hash] = yield parent.insert(block);
|
|
29
|
+
yield this.clear();
|
|
30
|
+
return hash;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.XyoArchivist = XyoArchivist;
|
|
35
|
+
//# sourceMappingURL=XyoArchivist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XyoArchivist.js","sourceRoot":"","sources":["../../../src/Archivist/XyoArchivist.ts"],"names":[],"mappings":";;;;AAAA,2CAAyC;AAEzC,4DAAmH;AAMnH,MAAsB,YAAY;IAKhC,YAAY,MAAqB,EAAE,OAAoB;QACrD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAIM,GAAG;QACR,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACrC,CAAC;IACM,MAAM,CAAC,KAAa;QACzB,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACrC,CAAC;IACM,KAAK;QACV,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACpC,CAAC;IACY,MAAM;;YACjB,MAAM,MAAM,GAAG,IAAA,iBAAQ,EAAC,IAAI,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAA;YACrE,MAAM,OAAO,GAAG,IAAA,iBAAQ,EAAC,IAAI,CAAC,OAAO,EAAE,gCAAgC,CAAC,CAAA;YACxE,MAAM,QAAQ,GAAG,IAAA,iBAAQ,EAAC,MAAM,MAAM,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAA;YAClE,MAAM,OAAO,GAAG,IAAI,qCAAsB,EAAE,CAAA;YAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAA;YACjE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACzC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;YAClB,OAAO,IAAI,CAAA;QACb,CAAC;KAAA;CACF;AA/BD,oCA+BC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { XyoBoundWitnessWithMeta } from '@xyo-network/boundwitness';
|
|
2
|
+
import { XyoPayload, XyoPayloadWithPartialMeta } from '@xyo-network/payload';
|
|
3
|
+
import { XyoPayloadFindFilter } from './Payload';
|
|
4
|
+
import { XyoArchivist } from './XyoArchivist';
|
|
5
|
+
export declare class XyoMemoryArchivist extends XyoArchivist {
|
|
6
|
+
private cache;
|
|
7
|
+
delete(hash: string): boolean;
|
|
8
|
+
clear(): void;
|
|
9
|
+
get(hash: string): XyoPayloadWithPartialMeta<unknown> | Promise<XyoPayloadWithPartialMeta<unknown> | undefined> | undefined;
|
|
10
|
+
insert(payload: XyoBoundWitnessWithMeta): string[];
|
|
11
|
+
find<T extends XyoPayload = XyoPayload>(filter: XyoPayloadFindFilter): T[];
|
|
12
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.XyoMemoryArchivist = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const boundwitness_1 = require("@xyo-network/boundwitness");
|
|
6
|
+
const payload_1 = require("@xyo-network/payload");
|
|
7
|
+
const lru_cache_1 = tslib_1.__importDefault(require("lru-cache"));
|
|
8
|
+
const XyoArchivist_1 = require("./XyoArchivist");
|
|
9
|
+
class XyoMemoryArchivist extends XyoArchivist_1.XyoArchivist {
|
|
10
|
+
constructor() {
|
|
11
|
+
super(...arguments);
|
|
12
|
+
this.cache = new lru_cache_1.default({ max: 10000 });
|
|
13
|
+
}
|
|
14
|
+
delete(hash) {
|
|
15
|
+
return this.cache.delete(hash);
|
|
16
|
+
}
|
|
17
|
+
clear() {
|
|
18
|
+
this.cache.clear();
|
|
19
|
+
}
|
|
20
|
+
get(hash) {
|
|
21
|
+
var _a, _b;
|
|
22
|
+
return (_a = this.cache.get(hash)) !== null && _a !== void 0 ? _a : (_b = this.parent) === null || _b === void 0 ? void 0 : _b.get(hash);
|
|
23
|
+
}
|
|
24
|
+
insert(payload) {
|
|
25
|
+
var _a;
|
|
26
|
+
const wrapper = new boundwitness_1.XyoBoundWitnessWrapper(payload);
|
|
27
|
+
const payloadWithmeta = Object.assign(Object.assign({}, payload), { _hash: wrapper.hash, _timestamp: Date.now() });
|
|
28
|
+
const hashes = [];
|
|
29
|
+
hashes.push(payloadWithmeta._hash);
|
|
30
|
+
this.cache.set(payloadWithmeta._hash, payloadWithmeta);
|
|
31
|
+
(_a = payload._payloads) === null || _a === void 0 ? void 0 : _a.forEach((payload) => {
|
|
32
|
+
const wrapper = new payload_1.XyoPayloadWrapper(payload);
|
|
33
|
+
const payloadWithmeta = Object.assign(Object.assign({}, payload), { _hash: wrapper.hash, _timestamp: Date.now() });
|
|
34
|
+
hashes.push(payloadWithmeta._hash);
|
|
35
|
+
this.cache.set(payloadWithmeta._hash, payloadWithmeta);
|
|
36
|
+
});
|
|
37
|
+
return hashes;
|
|
38
|
+
}
|
|
39
|
+
find(filter) {
|
|
40
|
+
const result = [];
|
|
41
|
+
if (filter.type === 'schema') {
|
|
42
|
+
const filterSchema = filter.schema !== undefined ? (Array.isArray(filter.schema) ? filter.schema : [filter.schema]) : undefined;
|
|
43
|
+
this.cache.forEach((value) => {
|
|
44
|
+
let match = value;
|
|
45
|
+
match = filterSchema === undefined || filterSchema.includes(value.schema) ? value : undefined;
|
|
46
|
+
if (match) {
|
|
47
|
+
result.push(match);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (filter.type === 'hash') {
|
|
52
|
+
const filterHash = filter.hash !== undefined ? (Array.isArray(filter.hash) ? filter.hash : [filter.hash]) : undefined;
|
|
53
|
+
this.cache.forEach((value) => {
|
|
54
|
+
let match = value;
|
|
55
|
+
match = filterHash === undefined || filterHash.includes(new payload_1.XyoPayloadWrapper(value).hash) ? value : undefined;
|
|
56
|
+
if (match) {
|
|
57
|
+
result.push(match);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.XyoMemoryArchivist = XyoMemoryArchivist;
|
|
65
|
+
//# sourceMappingURL=XyoMemoryArchivist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XyoMemoryArchivist.js","sourceRoot":"","sources":["../../../src/Archivist/XyoMemoryArchivist.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,6 @@ tslib_1.__exportStar(require("./Api"), exports);
|
|
|
6
6
|
tslib_1.__exportStar(require("./Archive"), exports);
|
|
7
7
|
tslib_1.__exportStar(require("./Archives"), exports);
|
|
8
8
|
tslib_1.__exportStar(require("./Block"), exports);
|
|
9
|
-
tslib_1.__exportStar(require("./Model"), exports);
|
|
10
9
|
tslib_1.__exportStar(require("./Payload"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./XyoApiArchivist"), exports);
|
|
11
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Archivist/index.ts"],"names":[],"mappings":";;;AAAA,oDAAyB;AACzB,gDAAqB;AACrB,oDAAyB;AACzB,qDAA0B;AAC1B,kDAAuB;AACvB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Archivist/index.ts"],"names":[],"mappings":";;;AAAA,oDAAyB;AACzB,gDAAqB;AACrB,oDAAyB;AACzB,qDAA0B;AAC1B,kDAAuB;AACvB,oDAAyB;AACzB,4DAAiC"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
export interface QueryableArchivist<TQueryResponse, TQuery> {
|
|
2
|
-
find(query: TQuery): Promise<TQueryResponse
|
|
2
|
+
find(query: TQuery): Promise<TQueryResponse> | TQueryResponse;
|
|
3
3
|
}
|
|
4
4
|
export interface ReadArchivist<TReadResponse, TId = string> {
|
|
5
|
-
get(id: TId): Promise<TReadResponse
|
|
5
|
+
get(id: TId): Promise<TReadResponse | undefined> | TReadResponse | undefined;
|
|
6
6
|
}
|
|
7
|
-
export interface WriteArchivist<TWriteResponse, TWrite> {
|
|
8
|
-
insert(item: TWrite): Promise<TWriteResponse
|
|
7
|
+
export interface WriteArchivist<TWriteResponse, TWrite, TId = string> {
|
|
8
|
+
insert(item: TWrite): Promise<TWriteResponse> | TWriteResponse;
|
|
9
|
+
delete?(id: TId): Promise<boolean> | boolean;
|
|
10
|
+
clear?(): void;
|
|
9
11
|
}
|
|
10
12
|
export declare type ReadWriteArchivist<TWriteResponse, TWrite, TReadResponse = TWriteResponse, TId = string> = ReadArchivist<TReadResponse, TId> & WriteArchivist<TWriteResponse, TWrite>;
|
|
11
13
|
export declare type Archivist<TWriteResponse, TWrite, TReadResponse = TWriteResponse, TId = string, TQueryResponse = unknown, TQuery = unknown> = ReadWriteArchivist<TWriteResponse, TWrite, TReadResponse, TId> & QueryableArchivist<TQueryResponse, TQuery>;
|
|
@@ -1,15 +1,9 @@
|
|
|
1
|
+
import { XyoPayloadFindFilter } from '@xyo-network/archivist';
|
|
1
2
|
import { XyoPayload, XyoPayloadWithPartialMeta } from '@xyo-network/payload';
|
|
2
3
|
import { XyoApiConfig } from '../../models';
|
|
3
4
|
import { XyoApiSimple } from '../../Simple';
|
|
4
5
|
import { WithArchive } from '../../WithArchive';
|
|
5
6
|
import { XyoArchivistArchivePayloadSchemaApi } from './Schema';
|
|
6
|
-
export interface XyoPayloadFindFilter {
|
|
7
|
-
[key: string]: unknown;
|
|
8
|
-
order?: 'desc' | 'asc';
|
|
9
|
-
timestamp?: number;
|
|
10
|
-
limit?: number;
|
|
11
|
-
schema?: string;
|
|
12
|
-
}
|
|
13
7
|
export interface XyoPayloadStats {
|
|
14
8
|
count: number;
|
|
15
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Api.js","sourceRoot":"","sources":["../../../../src/Archivist/Payload/Api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"Api.js","sourceRoot":"","sources":["../../../../src/Archivist/Payload/Api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { XyoAccount } from '@xyo-network/account';
|
|
2
|
+
import { XyoArchivist, XyoPayloadFindFilter } from '@xyo-network/archivist';
|
|
3
|
+
import { XyoBoundWitnessWithPartialMeta } from '@xyo-network/boundwitness';
|
|
4
|
+
import { XyoArchivistApi } from './Api';
|
|
5
|
+
export declare class XyoApiArchivist extends XyoArchivist {
|
|
6
|
+
protected api: XyoArchivistApi;
|
|
7
|
+
protected archive: string;
|
|
8
|
+
constructor(api: XyoArchivistApi, archive: string, parent?: XyoArchivist, account?: XyoAccount);
|
|
9
|
+
get(hash: string): Promise<import("@xyo-network/payload").XyoPayload<object> | undefined>;
|
|
10
|
+
insert(payload: XyoBoundWitnessWithPartialMeta): Promise<string[]>;
|
|
11
|
+
find(filter: XyoPayloadFindFilter): Promise<import("@xyo-network/payload").XyoPayloadWithPartialMeta<unknown>[]>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/sdk-js';
|
|
2
|
+
import { XyoArchivist } from '@xyo-network/archivist';
|
|
3
|
+
export class XyoApiArchivist extends XyoArchivist {
|
|
4
|
+
constructor(api, archive, parent, account) {
|
|
5
|
+
super(parent, account);
|
|
6
|
+
this.api = api;
|
|
7
|
+
this.archive = archive;
|
|
8
|
+
}
|
|
9
|
+
async get(hash) {
|
|
10
|
+
const [payloads] = await this.api.archive(this.archive).payload.hash(hash).get('tuple');
|
|
11
|
+
return payloads?.pop();
|
|
12
|
+
}
|
|
13
|
+
async insert(payload) {
|
|
14
|
+
return (await this.api.archive(this.archive).block.post([payload]))?.map((value) => assertEx(value._hash)) ?? [];
|
|
15
|
+
}
|
|
16
|
+
async find(filter) {
|
|
17
|
+
const [payloads = []] = (await this.api.archive(this.archive).payload.find(filter, 'tuple')) ?? [];
|
|
18
|
+
const [blocks = []] = (await this.api.archive(this.archive).block.find(filter, 'tuple')) ?? [];
|
|
19
|
+
return payloads.concat(blocks);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=XyoApiArchivist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XyoApiArchivist.js","sourceRoot":"","sources":["../../../src/Archivist/XyoApiArchivist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAwB,MAAM,wBAAwB,CAAA;AAK3E,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAG/C,YAAY,GAAoB,EAAE,OAAe,EAAE,MAAqB,EAAE,OAAoB;QAC5F,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACtB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,IAAY;QAC3B,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACvF,OAAO,QAAQ,EAAE,GAAG,EAAE,CAAA;IACxB,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,OAAuC;QACzD,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;IAClH,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAA4B;QAC5C,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;QAClG,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;QAC9F,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { XyoAccount } from '@xyo-network/account';
|
|
2
|
+
import { XyoBoundWitness, XyoBoundWitnessWithPartialMeta } from '@xyo-network/boundwitness';
|
|
3
|
+
import { XyoPayload, XyoPayloadWithPartialMeta } from '@xyo-network/payload';
|
|
4
|
+
import { Archivist } from './Model';
|
|
5
|
+
import { XyoPayloadFindFilter } from './Payload';
|
|
6
|
+
export declare abstract class XyoArchivist<TWrite extends XyoBoundWitness = XyoBoundWitnessWithPartialMeta, TRead extends XyoPayload = XyoPayloadWithPartialMeta> implements Archivist<string[], TWrite, TRead | undefined, string, TRead[], XyoPayloadFindFilter> {
|
|
7
|
+
protected parent?: XyoArchivist;
|
|
8
|
+
protected account?: XyoAccount;
|
|
9
|
+
constructor(parent?: XyoArchivist, account?: XyoAccount);
|
|
10
|
+
abstract insert(item: TWrite): string[] | Promise<string[]>;
|
|
11
|
+
abstract find(query: XyoPayloadFindFilter): TRead[] | Promise<TRead[]>;
|
|
12
|
+
abstract get(hash: string): TRead | Promise<TRead | undefined> | undefined;
|
|
13
|
+
all(): TRead[] | Promise<TRead[] | undefined> | undefined;
|
|
14
|
+
delete(_hash: string): boolean | Promise<boolean>;
|
|
15
|
+
clear(): void | Promise<void>;
|
|
16
|
+
commit(): Promise<string>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/sdk-js';
|
|
2
|
+
import { XyoBoundWitnessBuilder } from '@xyo-network/boundwitness';
|
|
3
|
+
export class XyoArchivist {
|
|
4
|
+
constructor(parent, account) {
|
|
5
|
+
this.parent = parent;
|
|
6
|
+
this.account = account;
|
|
7
|
+
}
|
|
8
|
+
all() {
|
|
9
|
+
throw Error('getAll not supported');
|
|
10
|
+
}
|
|
11
|
+
delete(_hash) {
|
|
12
|
+
throw Error('delete not supported');
|
|
13
|
+
}
|
|
14
|
+
clear() {
|
|
15
|
+
throw Error('clear not supported');
|
|
16
|
+
}
|
|
17
|
+
async commit() {
|
|
18
|
+
const parent = assertEx(this.parent, 'Parent is required for commit');
|
|
19
|
+
const account = assertEx(this.account, 'Account is required for commit');
|
|
20
|
+
const payloads = assertEx(await parent.all(), 'Nothing to commit');
|
|
21
|
+
const builder = new XyoBoundWitnessBuilder();
|
|
22
|
+
const block = builder.payloads(payloads).witness(account).build();
|
|
23
|
+
const [hash] = await parent.insert(block);
|
|
24
|
+
await this.clear();
|
|
25
|
+
return hash;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=XyoArchivist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XyoArchivist.js","sourceRoot":"","sources":["../../../src/Archivist/XyoArchivist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAmB,sBAAsB,EAAkC,MAAM,2BAA2B,CAAA;AAMnH,MAAM,OAAgB,YAAY;IAKhC,YAAY,MAAqB,EAAE,OAAoB;QACrD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAIM,GAAG;QACR,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACrC,CAAC;IACM,MAAM,CAAC,KAAa;QACzB,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACrC,CAAC;IACM,KAAK;QACV,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACpC,CAAC;IACM,KAAK,CAAC,MAAM;QACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAA;QACrE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,gCAAgC,CAAC,CAAA;QACxE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAA;QAClE,MAAM,OAAO,GAAG,IAAI,sBAAsB,EAAE,CAAA;QAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAA;QACjE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;QAClB,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { XyoBoundWitnessWithMeta } from '@xyo-network/boundwitness';
|
|
2
|
+
import { XyoPayload, XyoPayloadWithPartialMeta } from '@xyo-network/payload';
|
|
3
|
+
import { XyoPayloadFindFilter } from './Payload';
|
|
4
|
+
import { XyoArchivist } from './XyoArchivist';
|
|
5
|
+
export declare class XyoMemoryArchivist extends XyoArchivist {
|
|
6
|
+
private cache;
|
|
7
|
+
delete(hash: string): boolean;
|
|
8
|
+
clear(): void;
|
|
9
|
+
get(hash: string): XyoPayloadWithPartialMeta<unknown> | Promise<XyoPayloadWithPartialMeta<unknown> | undefined> | undefined;
|
|
10
|
+
insert(payload: XyoBoundWitnessWithMeta): string[];
|
|
11
|
+
find<T extends XyoPayload = XyoPayload>(filter: XyoPayloadFindFilter): T[];
|
|
12
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { XyoBoundWitnessWrapper } from '@xyo-network/boundwitness';
|
|
2
|
+
import { XyoPayloadWrapper } from '@xyo-network/payload';
|
|
3
|
+
import LruCache from 'lru-cache';
|
|
4
|
+
import { XyoArchivist } from './XyoArchivist';
|
|
5
|
+
export class XyoMemoryArchivist extends XyoArchivist {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
this.cache = new LruCache({ max: 10000 });
|
|
9
|
+
}
|
|
10
|
+
delete(hash) {
|
|
11
|
+
return this.cache.delete(hash);
|
|
12
|
+
}
|
|
13
|
+
clear() {
|
|
14
|
+
this.cache.clear();
|
|
15
|
+
}
|
|
16
|
+
get(hash) {
|
|
17
|
+
return this.cache.get(hash) ?? this.parent?.get(hash);
|
|
18
|
+
}
|
|
19
|
+
insert(payload) {
|
|
20
|
+
const wrapper = new XyoBoundWitnessWrapper(payload);
|
|
21
|
+
const payloadWithmeta = { ...payload, _hash: wrapper.hash, _timestamp: Date.now() };
|
|
22
|
+
const hashes = [];
|
|
23
|
+
hashes.push(payloadWithmeta._hash);
|
|
24
|
+
this.cache.set(payloadWithmeta._hash, payloadWithmeta);
|
|
25
|
+
payload._payloads?.forEach((payload) => {
|
|
26
|
+
const wrapper = new XyoPayloadWrapper(payload);
|
|
27
|
+
const payloadWithmeta = { ...payload, _hash: wrapper.hash, _timestamp: Date.now() };
|
|
28
|
+
hashes.push(payloadWithmeta._hash);
|
|
29
|
+
this.cache.set(payloadWithmeta._hash, payloadWithmeta);
|
|
30
|
+
});
|
|
31
|
+
return hashes;
|
|
32
|
+
}
|
|
33
|
+
find(filter) {
|
|
34
|
+
const result = [];
|
|
35
|
+
if (filter.type === 'schema') {
|
|
36
|
+
const filterSchema = filter.schema !== undefined ? (Array.isArray(filter.schema) ? filter.schema : [filter.schema]) : undefined;
|
|
37
|
+
this.cache.forEach((value) => {
|
|
38
|
+
let match = value;
|
|
39
|
+
match = filterSchema === undefined || filterSchema.includes(value.schema) ? value : undefined;
|
|
40
|
+
if (match) {
|
|
41
|
+
result.push(match);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (filter.type === 'hash') {
|
|
46
|
+
const filterHash = filter.hash !== undefined ? (Array.isArray(filter.hash) ? filter.hash : [filter.hash]) : undefined;
|
|
47
|
+
this.cache.forEach((value) => {
|
|
48
|
+
let match = value;
|
|
49
|
+
match = filterHash === undefined || filterHash.includes(new XyoPayloadWrapper(value).hash) ? value : undefined;
|
|
50
|
+
if (match) {
|
|
51
|
+
result.push(match);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=XyoMemoryArchivist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XyoMemoryArchivist.js","sourceRoot":"","sources":["../../../src/Archivist/XyoMemoryArchivist.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAC3F,OAAO,EAAyC,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC/F,OAAO,QAAQ,MAAM,WAAW,CAAA;AAGhC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAApD;;QACU,UAAK,GAAgD,IAAI,QAAQ,CAAoC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;IAqD9H,CAAC;IAnDQ,MAAM,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAEM,GAAG,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;IACvD,CAAC;IAEM,MAAM,CAAC,OAAgC;QAC5C,MAAM,OAAO,GAAG,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,eAAe,GAAG,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;QACnF,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,CAAA;QACtD,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAA;YAC9C,MAAM,eAAe,GAAG,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;YACnF,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;YAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;QACF,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,IAAI,CAAoC,MAA4B;QACzE,MAAM,MAAM,GAAQ,EAAE,CAAA;QACtB,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;YAC5B,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAC/H,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC3B,IAAI,KAAK,GAA2B,KAAK,CAAA;gBACzC,KAAK,GAAG,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;gBAC7F,IAAI,KAAK,EAAE;oBACT,MAAM,CAAC,IAAI,CAAC,KAAU,CAAC,CAAA;iBACxB;YACH,CAAC,CAAC,CAAA;SACH;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE;YAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YACrH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC3B,IAAI,KAAK,GAA2B,KAAK,CAAA;gBACzC,KAAK,GAAG,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;gBAC9G,IAAI,KAAK,EAAE;oBACT,MAAM,CAAC,IAAI,CAAC,KAAU,CAAC,CAAA;iBACxB;YACH,CAAC,CAAC,CAAA;SACH;QACD,OAAO,MAAM,CAAA;IACf,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Archivist/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,OAAO,CAAA;AACrB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Archivist/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,OAAO,CAAA;AACrB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA"}
|
package/package.json
CHANGED
|
@@ -10,12 +10,14 @@
|
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@xylabs/sdk-js": "^2.6.2",
|
|
13
|
-
"@xyo-network/account": "^2.21.
|
|
14
|
-
"@xyo-network/
|
|
15
|
-
"@xyo-network/
|
|
16
|
-
"@xyo-network/
|
|
17
|
-
"@xyo-network/
|
|
13
|
+
"@xyo-network/account": "^2.21.23",
|
|
14
|
+
"@xyo-network/archivist": "^2.21.23",
|
|
15
|
+
"@xyo-network/boundwitness": "^2.21.23",
|
|
16
|
+
"@xyo-network/core": "^2.21.23",
|
|
17
|
+
"@xyo-network/payload": "^2.21.23",
|
|
18
|
+
"@xyo-network/typeof": "^2.21.23",
|
|
18
19
|
"axios": "^0.27.2",
|
|
20
|
+
"lru-cache": "^7.13.1",
|
|
19
21
|
"pako": "^2.0.4",
|
|
20
22
|
"uuid": "^8.3.2"
|
|
21
23
|
},
|
|
@@ -60,6 +62,6 @@
|
|
|
60
62
|
},
|
|
61
63
|
"sideEffects": true,
|
|
62
64
|
"types": "dist/esm/index.d.ts",
|
|
63
|
-
"version": "2.21.
|
|
65
|
+
"version": "2.21.23",
|
|
64
66
|
"packageManager": "yarn@3.1.1"
|
|
65
67
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/sdk-js'
|
|
2
|
+
import { XyoPayloadFindFilter } from '@xyo-network/archivist'
|
|
2
3
|
import { XyoPayload, XyoPayloadWithPartialMeta } from '@xyo-network/payload'
|
|
3
4
|
|
|
4
5
|
import { XyoApiConfig } from '../../models'
|
|
@@ -6,14 +7,6 @@ import { XyoApiSimple } from '../../Simple'
|
|
|
6
7
|
import { WithArchive } from '../../WithArchive'
|
|
7
8
|
import { XyoArchivistArchivePayloadSchemaApi } from './Schema'
|
|
8
9
|
|
|
9
|
-
export interface XyoPayloadFindFilter {
|
|
10
|
-
[key: string]: unknown
|
|
11
|
-
order?: 'desc' | 'asc'
|
|
12
|
-
timestamp?: number
|
|
13
|
-
limit?: number
|
|
14
|
-
schema?: string
|
|
15
|
-
}
|
|
16
|
-
|
|
17
10
|
export interface XyoPayloadStats {
|
|
18
11
|
count: number
|
|
19
12
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/sdk-js'
|
|
2
|
+
import { XyoAccount } from '@xyo-network/account'
|
|
3
|
+
import { XyoArchivist, XyoPayloadFindFilter } from '@xyo-network/archivist'
|
|
4
|
+
import { XyoBoundWitnessWithPartialMeta } from '@xyo-network/boundwitness'
|
|
5
|
+
|
|
6
|
+
import { XyoArchivistApi } from './Api'
|
|
7
|
+
|
|
8
|
+
export class XyoApiArchivist extends XyoArchivist {
|
|
9
|
+
protected api: XyoArchivistApi
|
|
10
|
+
protected archive: string
|
|
11
|
+
constructor(api: XyoArchivistApi, archive: string, parent?: XyoArchivist, account?: XyoAccount) {
|
|
12
|
+
super(parent, account)
|
|
13
|
+
this.api = api
|
|
14
|
+
this.archive = archive
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public async get(hash: string) {
|
|
18
|
+
const [payloads] = await this.api.archive(this.archive).payload.hash(hash).get('tuple')
|
|
19
|
+
return payloads?.pop()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public async insert(payload: XyoBoundWitnessWithPartialMeta) {
|
|
23
|
+
return (await this.api.archive(this.archive).block.post([payload]))?.map((value) => assertEx(value._hash)) ?? []
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public async find(filter: XyoPayloadFindFilter) {
|
|
27
|
+
const [payloads = []] = (await this.api.archive(this.archive).payload.find(filter, 'tuple')) ?? []
|
|
28
|
+
const [blocks = []] = (await this.api.archive(this.archive).block.find(filter, 'tuple')) ?? []
|
|
29
|
+
return payloads.concat(blocks)
|
|
30
|
+
}
|
|
31
|
+
}
|
package/src/Archivist/index.ts
CHANGED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export interface QueryableArchivist<TQueryResponse, TQuery> {
|
|
2
|
-
find(query: TQuery): Promise<TQueryResponse>
|
|
3
|
-
}
|
|
4
|
-
export interface ReadArchivist<TReadResponse, TId = string> {
|
|
5
|
-
get(id: TId): Promise<TReadResponse>
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export interface WriteArchivist<TWriteResponse, TWrite> {
|
|
9
|
-
insert(item: TWrite): Promise<TWriteResponse>
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export type ReadWriteArchivist<TWriteResponse, TWrite, TReadResponse = TWriteResponse, TId = string> = ReadArchivist<TReadResponse, TId> & WriteArchivist<TWriteResponse, TWrite>
|
|
13
|
-
|
|
14
|
-
export type Archivist<TWriteResponse, TWrite, TReadResponse = TWriteResponse, TId = string, TQueryResponse = unknown, TQuery = unknown> = ReadWriteArchivist<
|
|
15
|
-
TWriteResponse,
|
|
16
|
-
TWrite,
|
|
17
|
-
TReadResponse,
|
|
18
|
-
TId
|
|
19
|
-
> &
|
|
20
|
-
QueryableArchivist<TQueryResponse, TQuery>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './Archivist'
|