@trestleinc/replicate 1.1.1 → 1.1.2-preview.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.
- package/README.md +395 -146
- package/dist/client/index.d.ts +311 -19
- package/dist/client/index.js +4027 -0
- package/dist/component/_generated/api.d.ts +13 -17
- package/dist/component/_generated/api.js +24 -4
- package/dist/component/_generated/component.d.ts +79 -77
- package/dist/component/_generated/component.js +1 -0
- package/dist/component/_generated/dataModel.d.ts +12 -15
- package/dist/component/_generated/dataModel.js +1 -0
- package/dist/component/_generated/server.d.ts +19 -22
- package/dist/component/_generated/server.js +65 -1
- package/dist/component/_virtual/rolldown_runtime.js +18 -0
- package/dist/component/convex.config.d.ts +6 -2
- package/dist/component/convex.config.js +7 -3
- package/dist/component/logger.d.ts +10 -6
- package/dist/component/logger.js +25 -28
- package/dist/component/public.d.ts +70 -61
- package/dist/component/public.js +311 -295
- package/dist/component/schema.d.ts +53 -45
- package/dist/component/schema.js +26 -32
- package/dist/component/shared/types.d.ts +9 -0
- package/dist/component/shared/types.js +15 -0
- package/dist/server/index.d.ts +134 -13
- package/dist/server/index.js +368 -0
- package/dist/shared/index.d.ts +27 -3
- package/dist/shared/index.js +1 -2
- package/package.json +34 -29
- package/src/client/collection.ts +339 -306
- package/src/client/errors.ts +9 -9
- package/src/client/index.ts +13 -32
- package/src/client/logger.ts +2 -2
- package/src/client/merge.ts +37 -34
- package/src/client/persistence/custom.ts +84 -0
- package/src/client/persistence/index.ts +9 -46
- package/src/client/persistence/indexeddb.ts +111 -84
- package/src/client/persistence/memory.ts +3 -3
- package/src/client/persistence/sqlite/browser.ts +168 -0
- package/src/client/persistence/sqlite/native.ts +29 -0
- package/src/client/persistence/sqlite/schema.ts +124 -0
- package/src/client/persistence/types.ts +32 -28
- package/src/client/prose-schema.ts +55 -0
- package/src/client/prose.ts +28 -25
- package/src/client/replicate.ts +5 -5
- package/src/client/services/cursor.ts +109 -0
- package/src/component/_generated/component.ts +31 -29
- package/src/component/convex.config.ts +2 -2
- package/src/component/logger.ts +7 -7
- package/src/component/public.ts +225 -237
- package/src/component/schema.ts +18 -15
- package/src/server/builder.ts +20 -7
- package/src/server/index.ts +3 -5
- package/src/server/schema.ts +5 -5
- package/src/server/storage.ts +113 -59
- package/src/shared/index.ts +5 -5
- package/src/shared/types.ts +51 -14
- package/dist/client/collection.d.ts +0 -96
- package/dist/client/errors.d.ts +0 -59
- package/dist/client/logger.d.ts +0 -2
- package/dist/client/merge.d.ts +0 -77
- package/dist/client/persistence/adapters/index.d.ts +0 -8
- package/dist/client/persistence/adapters/opsqlite.d.ts +0 -46
- package/dist/client/persistence/adapters/sqljs.d.ts +0 -83
- package/dist/client/persistence/index.d.ts +0 -49
- package/dist/client/persistence/indexeddb.d.ts +0 -17
- package/dist/client/persistence/memory.d.ts +0 -16
- package/dist/client/persistence/sqlite-browser.d.ts +0 -51
- package/dist/client/persistence/sqlite-level.d.ts +0 -63
- package/dist/client/persistence/sqlite-rn.d.ts +0 -36
- package/dist/client/persistence/sqlite.d.ts +0 -47
- package/dist/client/persistence/types.d.ts +0 -42
- package/dist/client/prose.d.ts +0 -56
- package/dist/client/replicate.d.ts +0 -40
- package/dist/client/services/checkpoint.d.ts +0 -18
- package/dist/client/services/reconciliation.d.ts +0 -24
- package/dist/index.js +0 -1618
- package/dist/server/builder.d.ts +0 -94
- package/dist/server/schema.d.ts +0 -27
- package/dist/server/storage.d.ts +0 -80
- package/dist/server.js +0 -281
- package/dist/shared/types.d.ts +0 -50
- package/dist/shared/types.js +0 -6
- package/dist/shared.js +0 -6
- package/src/client/persistence/adapters/index.ts +0 -8
- package/src/client/persistence/adapters/opsqlite.ts +0 -54
- package/src/client/persistence/adapters/sqljs.ts +0 -128
- package/src/client/persistence/sqlite-browser.ts +0 -107
- package/src/client/persistence/sqlite-level.ts +0 -407
- package/src/client/persistence/sqlite-rn.ts +0 -44
- package/src/client/persistence/sqlite.ts +0 -160
- package/src/client/services/checkpoint.ts +0 -86
- package/src/client/services/reconciliation.ts +0 -108
|
@@ -1,46 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
1
|
+
import * as convex_server0 from "convex/server";
|
|
2
|
+
import * as convex_values0 from "convex/values";
|
|
3
|
+
|
|
4
|
+
//#region src/component/schema.d.ts
|
|
5
|
+
declare const _default: convex_server0.SchemaDefinition<{
|
|
6
|
+
documents: convex_server0.TableDefinition<convex_values0.VObject<{
|
|
7
|
+
collection: string;
|
|
8
|
+
documentId: string;
|
|
9
|
+
crdtBytes: ArrayBuffer;
|
|
10
|
+
seq: number;
|
|
11
|
+
}, {
|
|
12
|
+
collection: convex_values0.VString<string, "required">;
|
|
13
|
+
documentId: convex_values0.VString<string, "required">;
|
|
14
|
+
crdtBytes: convex_values0.VBytes<ArrayBuffer, "required">;
|
|
15
|
+
seq: convex_values0.VFloat64<number, "required">;
|
|
16
|
+
}, "required", "collection" | "documentId" | "crdtBytes" | "seq">, {
|
|
17
|
+
by_collection: ["collection", "_creationTime"];
|
|
18
|
+
by_collection_document: ["collection", "documentId", "_creationTime"];
|
|
19
|
+
by_seq: ["collection", "seq", "_creationTime"];
|
|
20
|
+
}, {}, {}>;
|
|
21
|
+
snapshots: convex_server0.TableDefinition<convex_values0.VObject<{
|
|
22
|
+
collection: string;
|
|
23
|
+
documentId: string;
|
|
24
|
+
snapshotBytes: ArrayBuffer;
|
|
25
|
+
stateVector: ArrayBuffer;
|
|
26
|
+
snapshotSeq: number;
|
|
27
|
+
createdAt: number;
|
|
28
|
+
}, {
|
|
29
|
+
collection: convex_values0.VString<string, "required">;
|
|
30
|
+
documentId: convex_values0.VString<string, "required">;
|
|
31
|
+
snapshotBytes: convex_values0.VBytes<ArrayBuffer, "required">;
|
|
32
|
+
stateVector: convex_values0.VBytes<ArrayBuffer, "required">;
|
|
33
|
+
snapshotSeq: convex_values0.VFloat64<number, "required">;
|
|
34
|
+
createdAt: convex_values0.VFloat64<number, "required">;
|
|
35
|
+
}, "required", "collection" | "documentId" | "snapshotBytes" | "stateVector" | "snapshotSeq" | "createdAt">, {
|
|
36
|
+
by_document: ["collection", "documentId", "_creationTime"];
|
|
37
|
+
}, {}, {}>;
|
|
38
|
+
peers: convex_server0.TableDefinition<convex_values0.VObject<{
|
|
39
|
+
collection: string;
|
|
40
|
+
peerId: string;
|
|
41
|
+
lastSyncedSeq: number;
|
|
42
|
+
lastSeenAt: number;
|
|
43
|
+
}, {
|
|
44
|
+
collection: convex_values0.VString<string, "required">;
|
|
45
|
+
peerId: convex_values0.VString<string, "required">;
|
|
46
|
+
lastSyncedSeq: convex_values0.VFloat64<number, "required">;
|
|
47
|
+
lastSeenAt: convex_values0.VFloat64<number, "required">;
|
|
48
|
+
}, "required", "collection" | "peerId" | "lastSyncedSeq" | "lastSeenAt">, {
|
|
49
|
+
by_collection: ["collection", "_creationTime"];
|
|
50
|
+
by_collection_peer: ["collection", "peerId", "_creationTime"];
|
|
51
|
+
}, {}, {}>;
|
|
45
52
|
}, true>;
|
|
46
|
-
|
|
53
|
+
//#endregion
|
|
54
|
+
export { _default as default };
|
package/dist/component/schema.js
CHANGED
|
@@ -1,35 +1,29 @@
|
|
|
1
1
|
import { defineSchema, defineTable } from "convex/server";
|
|
2
2
|
import { v } from "convex/values";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
metadata: v.optional(v.object({
|
|
27
|
-
deltaCount: v.number(),
|
|
28
|
-
totalSize: v.number()
|
|
29
|
-
}))
|
|
30
|
-
}).index('by_document', [
|
|
31
|
-
'collection',
|
|
32
|
-
'documentId'
|
|
33
|
-
])
|
|
3
|
+
|
|
4
|
+
//#region src/component/schema.ts
|
|
5
|
+
var schema_default = defineSchema({
|
|
6
|
+
documents: defineTable({
|
|
7
|
+
collection: v.string(),
|
|
8
|
+
documentId: v.string(),
|
|
9
|
+
crdtBytes: v.bytes(),
|
|
10
|
+
seq: v.number()
|
|
11
|
+
}).index("by_collection", ["collection"]).index("by_collection_document", ["collection", "documentId"]).index("by_seq", ["collection", "seq"]),
|
|
12
|
+
snapshots: defineTable({
|
|
13
|
+
collection: v.string(),
|
|
14
|
+
documentId: v.string(),
|
|
15
|
+
snapshotBytes: v.bytes(),
|
|
16
|
+
stateVector: v.bytes(),
|
|
17
|
+
snapshotSeq: v.number(),
|
|
18
|
+
createdAt: v.number()
|
|
19
|
+
}).index("by_document", ["collection", "documentId"]),
|
|
20
|
+
peers: defineTable({
|
|
21
|
+
collection: v.string(),
|
|
22
|
+
peerId: v.string(),
|
|
23
|
+
lastSyncedSeq: v.number(),
|
|
24
|
+
lastSeenAt: v.number()
|
|
25
|
+
}).index("by_collection", ["collection"]).index("by_collection_peer", ["collection", "peerId"])
|
|
34
26
|
});
|
|
35
|
-
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
export { schema_default as default };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/shared/types.ts
|
|
2
|
+
/** Operation type for streaming changes */
|
|
3
|
+
let OperationType = /* @__PURE__ */ function(OperationType$1) {
|
|
4
|
+
OperationType$1["Delta"] = "delta";
|
|
5
|
+
OperationType$1["Snapshot"] = "snapshot";
|
|
6
|
+
return OperationType$1;
|
|
7
|
+
}({});
|
|
8
|
+
const SIZE_MULTIPLIERS = {
|
|
9
|
+
kb: 1024,
|
|
10
|
+
mb: 1024 ** 2,
|
|
11
|
+
gb: 1024 ** 3
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { OperationType };
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,14 +1,135 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import * as convex_values0 from "convex/values";
|
|
2
|
+
import * as convex_server0 from "convex/server";
|
|
3
|
+
import { GenericDataModel, GenericMutationCtx, GenericQueryCtx } from "convex/server";
|
|
4
|
+
|
|
5
|
+
//#region src/shared/types.d.ts
|
|
6
|
+
|
|
7
|
+
type SizeUnit = "kb" | "mb" | "gb";
|
|
8
|
+
type Size = `${number}${SizeUnit}`;
|
|
9
|
+
type DurationUnit = "m" | "h" | "d";
|
|
10
|
+
type Duration = `${number}${DurationUnit}`;
|
|
11
|
+
interface CompactionConfig {
|
|
12
|
+
sizeThreshold: Size;
|
|
13
|
+
peerTimeout: Duration;
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/server/builder.d.ts
|
|
17
|
+
/**
|
|
18
|
+
* Configuration for replicate handlers (without component - used with factory pattern).
|
|
19
|
+
*/
|
|
20
|
+
interface ReplicateConfig<T extends object> {
|
|
21
|
+
collection: string;
|
|
22
|
+
compaction?: Partial<CompactionConfig>;
|
|
23
|
+
hooks?: {
|
|
24
|
+
evalRead?: (ctx: GenericQueryCtx<GenericDataModel>, collection: string) => void | Promise<void>;
|
|
25
|
+
evalWrite?: (ctx: GenericMutationCtx<GenericDataModel>, doc: T) => void | Promise<void>;
|
|
26
|
+
evalRemove?: (ctx: GenericMutationCtx<GenericDataModel>, docId: string) => void | Promise<void>;
|
|
27
|
+
evalMark?: (ctx: GenericMutationCtx<GenericDataModel>, peerId: string) => void | Promise<void>;
|
|
28
|
+
evalCompact?: (ctx: GenericMutationCtx<GenericDataModel>, documentId: string) => void | Promise<void>;
|
|
29
|
+
onStream?: (ctx: GenericQueryCtx<GenericDataModel>, result: any) => void | Promise<void>;
|
|
30
|
+
onInsert?: (ctx: GenericMutationCtx<GenericDataModel>, doc: T) => void | Promise<void>;
|
|
31
|
+
onUpdate?: (ctx: GenericMutationCtx<GenericDataModel>, doc: T) => void | Promise<void>;
|
|
32
|
+
onRemove?: (ctx: GenericMutationCtx<GenericDataModel>, docId: string) => void | Promise<void>;
|
|
33
|
+
transform?: (docs: T[]) => T[] | Promise<T[]>;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a replicate function bound to your component. Call this once in your
|
|
38
|
+
* convex/replicate.ts file, then use the returned function for all collections.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* // convex/replicate.ts (create once)
|
|
43
|
+
* import { replicate } from '@trestleinc/replicate/server';
|
|
44
|
+
* import { components } from './_generated/api';
|
|
45
|
+
*
|
|
46
|
+
* export const tasks = replicate(components.replicate)<Task>({ collection: 'tasks' });
|
|
47
|
+
*
|
|
48
|
+
* // Or bind once and reuse:
|
|
49
|
+
* const r = replicate(components.replicate);
|
|
50
|
+
* export const tasks = r<Task>({ collection: 'tasks' });
|
|
51
|
+
* export const notebooks = r<Notebook>({ collection: 'notebooks' });
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
declare function replicate(component: any): <T extends object>(config: ReplicateConfig<T>) => {
|
|
55
|
+
__collection: string;
|
|
56
|
+
stream: convex_server0.RegisteredQuery<"public", {
|
|
57
|
+
limit?: number | undefined;
|
|
58
|
+
sizeThreshold?: number | undefined;
|
|
59
|
+
cursor: number;
|
|
60
|
+
}, Promise<any>>;
|
|
61
|
+
material: convex_server0.RegisteredQuery<"public", {}, Promise<{
|
|
62
|
+
documents: T[];
|
|
63
|
+
cursor?: number;
|
|
64
|
+
count: number;
|
|
65
|
+
crdtBytes?: ArrayBuffer;
|
|
66
|
+
}>>;
|
|
67
|
+
recovery: convex_server0.RegisteredQuery<"public", {
|
|
68
|
+
clientStateVector: ArrayBuffer;
|
|
69
|
+
}, Promise<any>>;
|
|
70
|
+
insert: convex_server0.RegisteredMutation<"public", {
|
|
71
|
+
documentId: string;
|
|
72
|
+
crdtBytes: ArrayBuffer;
|
|
73
|
+
materializedDoc: any;
|
|
74
|
+
}, Promise<{
|
|
75
|
+
success: boolean;
|
|
76
|
+
seq: any;
|
|
77
|
+
}>>;
|
|
78
|
+
update: convex_server0.RegisteredMutation<"public", {
|
|
79
|
+
documentId: string;
|
|
80
|
+
crdtBytes: ArrayBuffer;
|
|
81
|
+
materializedDoc: any;
|
|
82
|
+
}, Promise<{
|
|
83
|
+
success: boolean;
|
|
84
|
+
seq: any;
|
|
85
|
+
}>>;
|
|
86
|
+
remove: convex_server0.RegisteredMutation<"public", {
|
|
87
|
+
documentId: string;
|
|
88
|
+
crdtBytes: ArrayBuffer;
|
|
89
|
+
}, Promise<{
|
|
90
|
+
success: boolean;
|
|
91
|
+
seq: any;
|
|
92
|
+
}>>;
|
|
93
|
+
mark: convex_server0.RegisteredMutation<"public", {
|
|
94
|
+
peerId: string;
|
|
95
|
+
syncedSeq: number;
|
|
96
|
+
}, Promise<null>>;
|
|
97
|
+
compact: convex_server0.RegisteredMutation<"public", {
|
|
98
|
+
peerTimeout?: number | undefined;
|
|
99
|
+
documentId: string;
|
|
100
|
+
snapshotBytes: ArrayBuffer;
|
|
101
|
+
stateVector: ArrayBuffer;
|
|
102
|
+
}, Promise<any>>;
|
|
13
103
|
};
|
|
14
|
-
|
|
104
|
+
//#endregion
|
|
105
|
+
//#region src/server/schema.d.ts
|
|
106
|
+
/**
|
|
107
|
+
* Define a table with automatic timestamp field for replication.
|
|
108
|
+
* All replicated tables must have an `id` field and define a `by_doc_id` index.
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* // convex/schema.ts
|
|
113
|
+
* export default defineSchema({
|
|
114
|
+
* tasks: table(
|
|
115
|
+
* { id: v.string(), text: v.string(), isCompleted: v.boolean() },
|
|
116
|
+
* (t) => t.index('by_doc_id', ['id']).index('by_completed', ['isCompleted'])
|
|
117
|
+
* ),
|
|
118
|
+
* });
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
declare function table(userFields: Record<string, any>, applyIndexes?: (table: any) => any): any;
|
|
122
|
+
//#endregion
|
|
123
|
+
//#region src/server/index.d.ts
|
|
124
|
+
declare const schema: {
|
|
125
|
+
readonly table: typeof table;
|
|
126
|
+
readonly prose: () => convex_values0.VObject<{
|
|
127
|
+
content?: any[] | undefined;
|
|
128
|
+
type: "doc";
|
|
129
|
+
}, {
|
|
130
|
+
type: convex_values0.VLiteral<"doc", "required">;
|
|
131
|
+
content: convex_values0.VArray<any[] | undefined, convex_values0.VAny<any, "required", string>, "optional">;
|
|
132
|
+
}, "required", "type" | "content">;
|
|
133
|
+
};
|
|
134
|
+
//#endregion
|
|
135
|
+
export { type ReplicateConfig, replicate, schema };
|