@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.
Files changed (91) hide show
  1. package/README.md +395 -146
  2. package/dist/client/index.d.ts +311 -19
  3. package/dist/client/index.js +4027 -0
  4. package/dist/component/_generated/api.d.ts +13 -17
  5. package/dist/component/_generated/api.js +24 -4
  6. package/dist/component/_generated/component.d.ts +79 -77
  7. package/dist/component/_generated/component.js +1 -0
  8. package/dist/component/_generated/dataModel.d.ts +12 -15
  9. package/dist/component/_generated/dataModel.js +1 -0
  10. package/dist/component/_generated/server.d.ts +19 -22
  11. package/dist/component/_generated/server.js +65 -1
  12. package/dist/component/_virtual/rolldown_runtime.js +18 -0
  13. package/dist/component/convex.config.d.ts +6 -2
  14. package/dist/component/convex.config.js +7 -3
  15. package/dist/component/logger.d.ts +10 -6
  16. package/dist/component/logger.js +25 -28
  17. package/dist/component/public.d.ts +70 -61
  18. package/dist/component/public.js +311 -295
  19. package/dist/component/schema.d.ts +53 -45
  20. package/dist/component/schema.js +26 -32
  21. package/dist/component/shared/types.d.ts +9 -0
  22. package/dist/component/shared/types.js +15 -0
  23. package/dist/server/index.d.ts +134 -13
  24. package/dist/server/index.js +368 -0
  25. package/dist/shared/index.d.ts +27 -3
  26. package/dist/shared/index.js +1 -2
  27. package/package.json +34 -29
  28. package/src/client/collection.ts +339 -306
  29. package/src/client/errors.ts +9 -9
  30. package/src/client/index.ts +13 -32
  31. package/src/client/logger.ts +2 -2
  32. package/src/client/merge.ts +37 -34
  33. package/src/client/persistence/custom.ts +84 -0
  34. package/src/client/persistence/index.ts +9 -46
  35. package/src/client/persistence/indexeddb.ts +111 -84
  36. package/src/client/persistence/memory.ts +3 -3
  37. package/src/client/persistence/sqlite/browser.ts +168 -0
  38. package/src/client/persistence/sqlite/native.ts +29 -0
  39. package/src/client/persistence/sqlite/schema.ts +124 -0
  40. package/src/client/persistence/types.ts +32 -28
  41. package/src/client/prose-schema.ts +55 -0
  42. package/src/client/prose.ts +28 -25
  43. package/src/client/replicate.ts +5 -5
  44. package/src/client/services/cursor.ts +109 -0
  45. package/src/component/_generated/component.ts +31 -29
  46. package/src/component/convex.config.ts +2 -2
  47. package/src/component/logger.ts +7 -7
  48. package/src/component/public.ts +225 -237
  49. package/src/component/schema.ts +18 -15
  50. package/src/server/builder.ts +20 -7
  51. package/src/server/index.ts +3 -5
  52. package/src/server/schema.ts +5 -5
  53. package/src/server/storage.ts +113 -59
  54. package/src/shared/index.ts +5 -5
  55. package/src/shared/types.ts +51 -14
  56. package/dist/client/collection.d.ts +0 -96
  57. package/dist/client/errors.d.ts +0 -59
  58. package/dist/client/logger.d.ts +0 -2
  59. package/dist/client/merge.d.ts +0 -77
  60. package/dist/client/persistence/adapters/index.d.ts +0 -8
  61. package/dist/client/persistence/adapters/opsqlite.d.ts +0 -46
  62. package/dist/client/persistence/adapters/sqljs.d.ts +0 -83
  63. package/dist/client/persistence/index.d.ts +0 -49
  64. package/dist/client/persistence/indexeddb.d.ts +0 -17
  65. package/dist/client/persistence/memory.d.ts +0 -16
  66. package/dist/client/persistence/sqlite-browser.d.ts +0 -51
  67. package/dist/client/persistence/sqlite-level.d.ts +0 -63
  68. package/dist/client/persistence/sqlite-rn.d.ts +0 -36
  69. package/dist/client/persistence/sqlite.d.ts +0 -47
  70. package/dist/client/persistence/types.d.ts +0 -42
  71. package/dist/client/prose.d.ts +0 -56
  72. package/dist/client/replicate.d.ts +0 -40
  73. package/dist/client/services/checkpoint.d.ts +0 -18
  74. package/dist/client/services/reconciliation.d.ts +0 -24
  75. package/dist/index.js +0 -1618
  76. package/dist/server/builder.d.ts +0 -94
  77. package/dist/server/schema.d.ts +0 -27
  78. package/dist/server/storage.d.ts +0 -80
  79. package/dist/server.js +0 -281
  80. package/dist/shared/types.d.ts +0 -50
  81. package/dist/shared/types.js +0 -6
  82. package/dist/shared.js +0 -6
  83. package/src/client/persistence/adapters/index.ts +0 -8
  84. package/src/client/persistence/adapters/opsqlite.ts +0 -54
  85. package/src/client/persistence/adapters/sqljs.ts +0 -128
  86. package/src/client/persistence/sqlite-browser.ts +0 -107
  87. package/src/client/persistence/sqlite-level.ts +0 -407
  88. package/src/client/persistence/sqlite-rn.ts +0 -44
  89. package/src/client/persistence/sqlite.ts +0 -160
  90. package/src/client/services/checkpoint.ts +0 -86
  91. package/src/client/services/reconciliation.ts +0 -108
@@ -1,46 +1,54 @@
1
- declare const _default: import("convex/server").SchemaDefinition<{
2
- documents: import("convex/server").TableDefinition<import("convex/values").VObject<{
3
- collection: string;
4
- documentId: string;
5
- crdtBytes: ArrayBuffer;
6
- version: number;
7
- timestamp: number;
8
- }, {
9
- collection: import("convex/values").VString<string, "required">;
10
- documentId: import("convex/values").VString<string, "required">;
11
- crdtBytes: import("convex/values").VBytes<ArrayBuffer, "required">;
12
- version: import("convex/values").VFloat64<number, "required">;
13
- timestamp: import("convex/values").VFloat64<number, "required">;
14
- }, "required", "collection" | "documentId" | "crdtBytes" | "version" | "timestamp">, {
15
- by_collection: ["collection", "_creationTime"];
16
- by_collection_document_version: ["collection", "documentId", "version", "_creationTime"];
17
- by_timestamp: ["collection", "timestamp", "_creationTime"];
18
- }, {}, {}>;
19
- snapshots: import("convex/server").TableDefinition<import("convex/values").VObject<{
20
- metadata?: {
21
- deltaCount: number;
22
- totalSize: number;
23
- } | undefined;
24
- collection: string;
25
- documentId: string;
26
- createdAt: number;
27
- snapshotBytes: ArrayBuffer;
28
- latestCompactionTimestamp: number;
29
- }, {
30
- collection: import("convex/values").VString<string, "required">;
31
- documentId: import("convex/values").VString<string, "required">;
32
- snapshotBytes: import("convex/values").VBytes<ArrayBuffer, "required">;
33
- latestCompactionTimestamp: import("convex/values").VFloat64<number, "required">;
34
- createdAt: import("convex/values").VFloat64<number, "required">;
35
- metadata: import("convex/values").VObject<{
36
- deltaCount: number;
37
- totalSize: number;
38
- } | undefined, {
39
- deltaCount: import("convex/values").VFloat64<number, "required">;
40
- totalSize: import("convex/values").VFloat64<number, "required">;
41
- }, "optional", "deltaCount" | "totalSize">;
42
- }, "required", "collection" | "documentId" | "createdAt" | "metadata" | "snapshotBytes" | "latestCompactionTimestamp" | "metadata.deltaCount" | "metadata.totalSize">, {
43
- by_document: ["collection", "documentId", "_creationTime"];
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
- export default _default;
53
+ //#endregion
54
+ export { _default as default };
@@ -1,35 +1,29 @@
1
1
  import { defineSchema, defineTable } from "convex/server";
2
2
  import { v } from "convex/values";
3
- const schema = defineSchema({
4
- documents: defineTable({
5
- collection: v.string(),
6
- documentId: v.string(),
7
- crdtBytes: v.bytes(),
8
- version: v.number(),
9
- timestamp: v.number()
10
- }).index('by_collection', [
11
- 'collection'
12
- ]).index('by_collection_document_version', [
13
- 'collection',
14
- 'documentId',
15
- 'version'
16
- ]).index('by_timestamp', [
17
- 'collection',
18
- 'timestamp'
19
- ]),
20
- snapshots: defineTable({
21
- collection: v.string(),
22
- documentId: v.string(),
23
- snapshotBytes: v.bytes(),
24
- latestCompactionTimestamp: v.number(),
25
- createdAt: v.number(),
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
- export { schema as default };
27
+
28
+ //#endregion
29
+ export { schema_default as default };
@@ -0,0 +1,9 @@
1
+ //#region src/shared/types.d.ts
2
+
3
+ /** Operation type for streaming changes */
4
+ declare enum OperationType {
5
+ Delta = "delta",
6
+ Snapshot = "snapshot",
7
+ }
8
+ //#endregion
9
+ export { OperationType };
@@ -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 };
@@ -1,14 +1,135 @@
1
- export { replicate } from '$/server/builder.js';
2
- export type { ReplicateConfig } from '$/server/builder.js';
3
- import { table } from '$/server/schema.js';
4
- export declare const schema: {
5
- readonly table: typeof table;
6
- readonly prose: () => import("convex/values").VObject<{
7
- content?: any[] | undefined;
8
- type: "doc";
9
- }, {
10
- type: import("convex/values").VLiteral<"doc", "required">;
11
- content: import("convex/values").VArray<any[] | undefined, import("convex/values").VAny<any, "required", string>, "optional">;
12
- }, "required", "type" | "content">;
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
- export type { ReplicationFields } from '$/server/schema.js';
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 };