@peerbit/document 13.0.44 → 13.1.1

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.
@@ -0,0 +1,42 @@
1
+ import type { PublicSignKey } from "@peerbit/crypto";
2
+ import type { Context } from "@peerbit/document-interface";
3
+ export type DocumentTransformFacts = {
4
+ entryPublicKeys?: readonly PublicSignKey[];
5
+ };
6
+ export type DocumentTransformer<T, I> = (obj: T, context: Context, facts?: DocumentTransformFacts) => I | Promise<I>;
7
+ type DocumentTransformSourceDescriptor = {
8
+ readonly kind: "field";
9
+ readonly path: string | readonly string[];
10
+ } | {
11
+ readonly kind: "context";
12
+ readonly field: "created" | "modified" | "head" | "gid" | "size";
13
+ } | {
14
+ readonly kind: "entryFirstSignerPublicKey";
15
+ };
16
+ export type DocumentTransformDescriptor = {
17
+ readonly kind: "identity";
18
+ } | {
19
+ readonly kind: "pick";
20
+ readonly fields: readonly (string | readonly string[])[];
21
+ } | {
22
+ readonly kind: "project";
23
+ readonly fields: readonly {
24
+ readonly target: string | readonly string[];
25
+ readonly source: DocumentTransformSourceDescriptor;
26
+ }[];
27
+ };
28
+ type DocumentTransformSource = string | readonly string[] | DocumentTransformSourceDescriptor;
29
+ export declare const getDocumentTransformDescriptor: <T, I>(transformer: DocumentTransformer<T, I> | undefined) => DocumentTransformDescriptor | undefined;
30
+ export declare const canPrepareDocumentTransformBeforeAppend: (descriptor: DocumentTransformDescriptor | undefined) => boolean;
31
+ export declare const canPrepareDocumentTransformWithAppendFacts: (descriptor: DocumentTransformDescriptor | undefined) => boolean;
32
+ export declare const documentTransformPreservesFieldPath: (descriptor: DocumentTransformDescriptor | undefined, path: string | readonly string[]) => boolean;
33
+ export declare const transform: {
34
+ readonly identity: <T = unknown>() => DocumentTransformer<T, T>;
35
+ readonly pick: <T = Record<string, unknown>, I extends object = Partial<T>>(fields: readonly (string | readonly string[])[]) => DocumentTransformer<T, I>;
36
+ readonly field: (path: string | readonly string[]) => DocumentTransformSourceDescriptor;
37
+ readonly context: (field: "created" | "modified" | "head" | "gid" | "size") => DocumentTransformSourceDescriptor;
38
+ readonly entryFirstSignerPublicKey: () => DocumentTransformSourceDescriptor;
39
+ readonly project: <T = unknown, I extends object = Record<string, unknown>>(fields: Record<string, DocumentTransformSource>) => DocumentTransformer<T, I>;
40
+ };
41
+ export {};
42
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAE3D,MAAM,MAAM,sBAAsB,GAAG;IACpC,eAAe,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,CAAC,EAAE,CAAC,IAAI,CACvC,GAAG,EAAE,CAAC,EACN,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE,sBAAsB,KAC1B,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEpB,KAAK,iCAAiC,GACnC;IACA,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;CACzC,GACD;IACA,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CAChE,GACD;IACA,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;CAC1C,CAAC;AAEL,MAAM,MAAM,2BAA2B,GACpC;IACA,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CACzB,GACD;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;CACxD,GACD;IACA,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS;QACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;QAC5C,QAAQ,CAAC,MAAM,EAAE,iCAAiC,CAAC;KACnD,EAAE,CAAC;CACH,CAAC;AAUL,KAAK,uBAAuB,GACzB,MAAM,GACN,SAAS,MAAM,EAAE,GACjB,iCAAiC,CAAC;AA8FrC,eAAO,MAAM,8BAA8B,GAAI,CAAC,EAAE,CAAC,EAClD,aAAa,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,KAChD,2BAA2B,GAAG,SAG/B,CAAC;AAEH,eAAO,MAAM,uCAAuC,GACnD,YAAY,2BAA2B,GAAG,SAAS,KACjD,OAaF,CAAC;AAEF,eAAO,MAAM,0CAA0C,GACtD,YAAY,2BAA2B,GAAG,SAAS,KACjD,OAcF,CAAC;AAEF,eAAO,MAAM,mCAAmC,GAC/C,YAAY,2BAA2B,GAAG,SAAS,EACnD,MAAM,MAAM,GAAG,SAAS,MAAM,EAAE,KAC9B,OAiBF,CAAC;AAEF,eAAO,MAAM,SAAS;wBACV,CAAC,iBAAe,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC;oBAInD,CAAC,4BACD,CAAC,SAAS,MAAM,uBAER,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,EAAE,KAC7C,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC;2BAerB,MAAM,GAAG,SAAS,MAAM,EAAE,KAC9B,iCAAiC;8BAM5B,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,KACrD,iCAAiC;8CAG/B,iCAAiC;uBAI5B,CAAC,YAAY,CAAC,SAAS,MAAM,oCAC9B,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,KAC7C,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC;CAwBnB,CAAC"}
@@ -0,0 +1,136 @@
1
+ const NATIVE_DOCUMENT_TRANSFORM = Symbol.for("@peerbit/document/native-document-transform");
2
+ const copyBytes = (bytes) => new Uint8Array(bytes);
3
+ const freezePath = (path) => typeof path === "string" ? path : Object.freeze([...path]);
4
+ const asPath = (path) => typeof path === "string" ? [path] : path;
5
+ const pathsEqual = (left, right) => {
6
+ const leftPath = asPath(left);
7
+ const rightPath = asPath(right);
8
+ return (leftPath.length === rightPath.length &&
9
+ leftPath.every((segment, index) => segment === rightPath[index]));
10
+ };
11
+ const getFieldValue = (value, path) => {
12
+ let current = value;
13
+ for (const segment of asPath(path)) {
14
+ if (current == null) {
15
+ return undefined;
16
+ }
17
+ current = current[segment];
18
+ }
19
+ return current;
20
+ };
21
+ const setFieldValue = (value, path, fieldValue) => {
22
+ const segments = asPath(path);
23
+ let current = value;
24
+ for (let i = 0; i < segments.length - 1; i++) {
25
+ const segment = segments[i];
26
+ const next = current[segment];
27
+ if (!next || typeof next !== "object") {
28
+ const created = {};
29
+ current[segment] = created;
30
+ current = created;
31
+ }
32
+ else {
33
+ current = next;
34
+ }
35
+ }
36
+ current[segments[segments.length - 1]] = fieldValue;
37
+ };
38
+ const sourceDescriptor = (source) => typeof source === "object" && !Array.isArray(source) && "kind" in source
39
+ ? source
40
+ : { kind: "field", path: freezePath(source) };
41
+ const readSource = (document, context, facts, source) => {
42
+ switch (source.kind) {
43
+ case "field":
44
+ return getFieldValue(document, source.path);
45
+ case "context":
46
+ return context[source.field];
47
+ case "entryFirstSignerPublicKey": {
48
+ const signer = facts?.entryPublicKeys?.[0];
49
+ return signer ? copyBytes(signer.bytes) : undefined;
50
+ }
51
+ }
52
+ };
53
+ const attachDocumentTransformDescriptor = (fn, descriptor) => {
54
+ Object.defineProperty(fn, NATIVE_DOCUMENT_TRANSFORM, {
55
+ value: Object.freeze(descriptor),
56
+ enumerable: false,
57
+ writable: false,
58
+ configurable: false,
59
+ });
60
+ return fn;
61
+ };
62
+ export const getDocumentTransformDescriptor = (transformer) => transformer?.[NATIVE_DOCUMENT_TRANSFORM];
63
+ export const canPrepareDocumentTransformBeforeAppend = (descriptor) => {
64
+ if (!descriptor) {
65
+ return false;
66
+ }
67
+ switch (descriptor.kind) {
68
+ case "identity":
69
+ case "pick":
70
+ return true;
71
+ case "project":
72
+ return descriptor.fields.every((field) => field.source.kind !== "context");
73
+ }
74
+ };
75
+ export const canPrepareDocumentTransformWithAppendFacts = (descriptor) => {
76
+ if (!descriptor) {
77
+ return false;
78
+ }
79
+ switch (descriptor.kind) {
80
+ case "identity":
81
+ case "pick":
82
+ return true;
83
+ case "project":
84
+ return descriptor.fields.every((field) => field.source.kind !== "context" || field.source.field !== "head");
85
+ }
86
+ };
87
+ export const documentTransformPreservesFieldPath = (descriptor, path) => {
88
+ if (!descriptor) {
89
+ return false;
90
+ }
91
+ switch (descriptor.kind) {
92
+ case "identity":
93
+ return true;
94
+ case "pick":
95
+ return descriptor.fields.some((field) => pathsEqual(field, path));
96
+ case "project":
97
+ return descriptor.fields.some((field) => pathsEqual(field.target, path) &&
98
+ field.source.kind === "field" &&
99
+ pathsEqual(field.source.path, path));
100
+ }
101
+ };
102
+ export const transform = {
103
+ identity: () => attachDocumentTransformDescriptor((obj) => obj, { kind: "identity" }),
104
+ pick: (fields) => {
105
+ const frozenFields = Object.freeze(fields.map(freezePath));
106
+ return attachDocumentTransformDescriptor((document) => {
107
+ const out = {};
108
+ for (const path of frozenFields) {
109
+ setFieldValue(out, path, getFieldValue(document, path));
110
+ }
111
+ return out;
112
+ }, { kind: "pick", fields: frozenFields });
113
+ },
114
+ field: (path) => ({
115
+ kind: "field",
116
+ path: freezePath(path),
117
+ }),
118
+ context: (field) => ({ kind: "context", field }),
119
+ entryFirstSignerPublicKey: () => ({
120
+ kind: "entryFirstSignerPublicKey",
121
+ }),
122
+ project: (fields) => {
123
+ const entries = Object.freeze(Object.entries(fields).map(([target, source]) => Object.freeze({
124
+ target,
125
+ source: Object.freeze(sourceDescriptor(source)),
126
+ })));
127
+ return attachDocumentTransformDescriptor((document, context, facts) => {
128
+ const out = {};
129
+ for (const entry of entries) {
130
+ setFieldValue(out, entry.target, readSource(document, context, facts, entry.source));
131
+ }
132
+ return out;
133
+ }, { kind: "project", fields: entries });
134
+ },
135
+ };
136
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/transform.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peerbit/document",
3
- "version": "13.0.44",
3
+ "version": "13.1.1",
4
4
  "description": "Document store implementation",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -59,20 +59,23 @@
59
59
  "@multiformats/multiaddr": "^13.0.1",
60
60
  "p-defer": "^4.0.0",
61
61
  "uint8arrays": "^5.1.0",
62
- "@peerbit/crypto": "3.1.1",
63
- "@peerbit/document-interface": "3.2.42",
64
- "@peerbit/indexer-cache": "0.2.7",
65
- "@peerbit/cache": "3.0.0",
66
- "@peerbit/indexer-interface": "3.0.4",
67
- "@peerbit/indexer-sqlite3": "3.0.7",
68
- "@peerbit/indexer-simple": "1.2.7",
69
- "@peerbit/pubsub": "5.2.11",
70
- "@peerbit/log": "6.1.1",
62
+ "@peerbit/crypto": "3.1.2",
63
+ "@peerbit/document-interface": "3.2.44",
64
+ "@peerbit/cache": "3.1.0",
65
+ "@peerbit/indexer-interface": "3.0.5",
66
+ "@peerbit/indexer-cache": "0.2.8",
67
+ "@peerbit/indexer-simple": "1.2.8",
68
+ "@peerbit/indexer-sqlite3": "3.0.8",
69
+ "@peerbit/log": "6.2.1",
71
70
  "@peerbit/logger": "2.0.1",
72
- "@peerbit/rpc": "6.0.35",
73
- "@peerbit/shared-log": "13.1.18",
74
- "@peerbit/program": "6.0.31",
75
- "@peerbit/stream-interface": "6.0.10"
71
+ "@peerbit/program": "6.0.32",
72
+ "@peerbit/pubsub": "5.3.0",
73
+ "@peerbit/stream-interface": "6.0.11",
74
+ "@peerbit/rpc": "6.1.0",
75
+ "@peerbit/shared-log": "13.2.1"
76
+ },
77
+ "optionalDependencies": {
78
+ "@peerbit/document-rust": "0.1.0"
76
79
  },
77
80
  "devDependencies": {
78
81
  "@chainsafe/libp2p-noise": "^17.0.0",
@@ -80,9 +83,11 @@
80
83
  "@types/pidusage": "^2.0.5",
81
84
  "pidusage": "^4.0.1",
82
85
  "uuid": "^10.0.0",
83
- "@peerbit/test-utils": "3.0.35",
86
+ "@peerbit/native-backbone": "0.1.1",
87
+ "@peerbit/test-utils": "3.1.1",
88
+ "@peerbit/log-rust": "1.1.1",
84
89
  "@peerbit/time": "3.0.0",
85
- "peerbit": "5.2.20"
90
+ "peerbit": "5.3.1"
86
91
  },
87
92
  "repository": {
88
93
  "type": "git",
package/src/index.ts CHANGED
@@ -33,6 +33,8 @@ export type {
33
33
  } from "./search.js";
34
34
  export { coerceWithContext, coerceWithIndexed } from "./search.js";
35
35
  export * from "./operation.js";
36
+ export { policy } from "./policy.js";
37
+ export { transform } from "./transform.js";
36
38
  export { MAX_BATCH_SIZE as MAX_DOCUMENT_SIZE } from "./constants.js";
37
39
  export { ClosedError } from "@peerbit/program";
38
40
  export {
@@ -0,0 +1,152 @@
1
+ type DocumentCommitContextInput = {
2
+ existingCreated?: bigint | number | string | null;
3
+ modified: bigint | number | string;
4
+ head: string;
5
+ gid: string;
6
+ size: number;
7
+ };
8
+
9
+ type DocumentCommitContextPlan = {
10
+ created: bigint;
11
+ modified: bigint;
12
+ head: string;
13
+ gid: string;
14
+ size: number;
15
+ contextBytes: Uint8Array;
16
+ };
17
+
18
+ export type SimpleDocumentProjectionPlan = {
19
+ documentVariantType?: "u8" | "string";
20
+ documentVariantValue?: string;
21
+ documentFieldNames: string[];
22
+ documentFieldTypes: string[];
23
+ outputVariantType?: "u8" | "string";
24
+ outputVariantValue?: string;
25
+ outputFieldTypes: string[];
26
+ sourceKinds: string[];
27
+ sourceValues: string[];
28
+ };
29
+
30
+ export type SimpleDocumentFieldExtractionPlan = {
31
+ documentVariantType?: "u8" | "string";
32
+ documentVariantValue?: string;
33
+ documentFieldNames: string[];
34
+ documentFieldTypes: string[];
35
+ fieldName: string;
36
+ };
37
+
38
+ export type SimpleDocumentProjectionContext = {
39
+ created: bigint | number | string;
40
+ modified: bigint | number | string;
41
+ head?: string;
42
+ gid: string;
43
+ size: number;
44
+ signer?: Uint8Array;
45
+ };
46
+
47
+ type DocumentRustModule = {
48
+ initializeDocumentRust: () => Promise<void>;
49
+ tryPlanDocumentContext: (
50
+ input: DocumentCommitContextInput,
51
+ ) => DocumentCommitContextPlan | undefined;
52
+ tryPlanDocumentContextBatch: (
53
+ inputs: DocumentCommitContextInput[],
54
+ ) => DocumentCommitContextPlan[] | undefined;
55
+ planDocumentContext: (
56
+ input: DocumentCommitContextInput,
57
+ ) => Promise<DocumentCommitContextPlan>;
58
+ planDocumentContextBatch: (
59
+ inputs: DocumentCommitContextInput[],
60
+ ) => Promise<DocumentCommitContextPlan[]>;
61
+ tryProjectDocumentIndexSimple: (
62
+ encodedDocument: Uint8Array,
63
+ plan: SimpleDocumentProjectionPlan,
64
+ context: SimpleDocumentProjectionContext,
65
+ ) => Uint8Array | undefined;
66
+ extractDocumentFieldSimple: (
67
+ encodedDocument: Uint8Array,
68
+ plan: SimpleDocumentFieldExtractionPlan,
69
+ ) => Promise<string | number | bigint | Uint8Array | undefined>;
70
+ };
71
+
72
+ let documentRustPromise: Promise<DocumentRustModule> | undefined;
73
+ let documentRustModule: DocumentRustModule | undefined;
74
+
75
+ const canUseOptionalDocumentNativeImports = (): boolean => {
76
+ const scope = globalThis as {
77
+ ServiceWorkerGlobalScope?: unknown;
78
+ clients?: unknown;
79
+ registration?: unknown;
80
+ skipWaiting?: unknown;
81
+ };
82
+ const serviceWorkerGlobalScope = scope.ServiceWorkerGlobalScope;
83
+ return !(
84
+ (typeof serviceWorkerGlobalScope === "function" &&
85
+ globalThis instanceof serviceWorkerGlobalScope) ||
86
+ (!!scope.clients &&
87
+ !!scope.registration &&
88
+ typeof scope.skipWaiting === "function")
89
+ );
90
+ };
91
+
92
+ const loadDocumentRust = async (): Promise<DocumentRustModule | undefined> => {
93
+ if (!canUseOptionalDocumentNativeImports()) {
94
+ return undefined;
95
+ }
96
+ if (!documentRustPromise) {
97
+ documentRustPromise = import(
98
+ /* @vite-ignore */ "@peerbit/document-rust",
99
+ ).then((module) => {
100
+ documentRustModule = module as DocumentRustModule;
101
+ return documentRustModule;
102
+ });
103
+ }
104
+ return documentRustPromise;
105
+ };
106
+
107
+ export const initializeDocumentRust = async (): Promise<void> => {
108
+ const module = await loadDocumentRust();
109
+ if (!module) {
110
+ throw new Error(
111
+ "Document native module is unavailable in service worker contexts",
112
+ );
113
+ }
114
+ await module.initializeDocumentRust();
115
+ };
116
+
117
+ export const tryPlanDocumentContext = (
118
+ input: DocumentCommitContextInput,
119
+ ): DocumentCommitContextPlan | undefined =>
120
+ documentRustModule?.tryPlanDocumentContext(input);
121
+
122
+ export const tryPlanDocumentContextBatch = (
123
+ inputs: DocumentCommitContextInput[],
124
+ ): DocumentCommitContextPlan[] | undefined =>
125
+ documentRustModule?.tryPlanDocumentContextBatch(inputs);
126
+
127
+ export const planDocumentContext = async (
128
+ input: DocumentCommitContextInput,
129
+ ): Promise<DocumentCommitContextPlan | undefined> =>
130
+ (await loadDocumentRust())?.planDocumentContext(input);
131
+
132
+ export const planDocumentContextBatch = async (
133
+ inputs: DocumentCommitContextInput[],
134
+ ): Promise<DocumentCommitContextPlan[] | undefined> =>
135
+ (await loadDocumentRust())?.planDocumentContextBatch(inputs);
136
+
137
+ export const tryProjectDocumentIndexSimple = (
138
+ encodedDocument: Uint8Array,
139
+ plan: SimpleDocumentProjectionPlan,
140
+ context: SimpleDocumentProjectionContext,
141
+ ): Uint8Array | undefined =>
142
+ documentRustModule?.tryProjectDocumentIndexSimple(
143
+ encodedDocument,
144
+ plan,
145
+ context,
146
+ );
147
+
148
+ export const extractDocumentFieldSimple = async (
149
+ encodedDocument: Uint8Array,
150
+ plan: SimpleDocumentFieldExtractionPlan,
151
+ ): Promise<string | number | bigint | Uint8Array | undefined> =>
152
+ (await loadDocumentRust())?.extractDocumentFieldSimple(encodedDocument, plan);