@prisma-idb/idb-client-generator 0.27.0 → 0.29.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/.release-it.json +4 -1
- package/dist/fileCreators/apply-pull/create.js +17 -9
- package/dist/fileCreators/apply-pull/create.js.map +1 -1
- package/dist/fileCreators/batch-processor/create.js +9 -9
- package/dist/fileCreators/batch-processor/createDAG.js +18 -0
- package/dist/fileCreators/batch-processor/createDAG.js.map +1 -1
- package/dist/fileCreators/idb-interface/create.js +25 -14
- package/dist/fileCreators/idb-interface/create.js.map +1 -1
- package/dist/fileCreators/prisma-idb-client/classes/BaseIDBModelClass.js +24 -37
- package/dist/fileCreators/prisma-idb-client/classes/BaseIDBModelClass.js.map +1 -1
- package/dist/fileCreators/prisma-idb-client/classes/OutboxEventIDBClass.js +54 -20
- package/dist/fileCreators/prisma-idb-client/classes/OutboxEventIDBClass.js.map +1 -1
- package/dist/fileCreators/prisma-idb-client/classes/PrismaIDBClient.js +99 -40
- package/dist/fileCreators/prisma-idb-client/classes/PrismaIDBClient.js.map +1 -1
- package/dist/fileCreators/prisma-idb-client/create.js +2 -2
- package/dist/fileCreators/prisma-idb-client/create.js.map +1 -1
- package/dist/fileCreators/validators/create.js +1 -0
- package/dist/fileCreators/validators/create.js.map +1 -1
- package/dist/helpers/parseGeneratorConfig.js +170 -5
- package/dist/helpers/parseGeneratorConfig.js.map +1 -1
- package/package.json +1 -1
package/.release-it.json
CHANGED
|
@@ -12,6 +12,14 @@ function createApplyPullFile(writer, models, versionMetaModelName) {
|
|
|
12
12
|
writer.writeLine(` logsWithRecords: LogWithRecord<typeof validators>[];`);
|
|
13
13
|
writer.writeLine(`};`);
|
|
14
14
|
writer.blankLine();
|
|
15
|
+
writer.writeLine(`export type ApplyPullResult =`);
|
|
16
|
+
writer.block(() => {
|
|
17
|
+
writer.writeLine(`validationErrors: { model: string; error: unknown }[];`);
|
|
18
|
+
writer.writeLine(`missingRecords: number;`);
|
|
19
|
+
writer.writeLine(`staleRecords: number;`);
|
|
20
|
+
writer.writeLine(`totalAppliedRecords: number;`);
|
|
21
|
+
});
|
|
22
|
+
writer.blankLine();
|
|
15
23
|
writer.writeLine(`/**`);
|
|
16
24
|
writer.writeLine(` * Apply pulled changes from remote server to local IndexedDB.`);
|
|
17
25
|
writer.writeLine(` * `);
|
|
@@ -23,7 +31,7 @@ function createApplyPullFile(writer, models, versionMetaModelName) {
|
|
|
23
31
|
writer.writeLine(` * @param props.logsWithRecords - Array of change logs with validated records from server`);
|
|
24
32
|
writer.writeLine(` * @returns Object with sync statistics including applied records, missing records, and validation errors`);
|
|
25
33
|
writer.writeLine(` */`);
|
|
26
|
-
writer.writeLine(`export async function applyPull(props: ApplyPullProps) `).block(() => {
|
|
34
|
+
writer.writeLine(`export async function applyPull(props: ApplyPullProps): Promise<ApplyPullResult> `).block(() => {
|
|
27
35
|
writer.writeLine(`const { idbClient, logsWithRecords } = props;`);
|
|
28
36
|
writer.blankLine();
|
|
29
37
|
writer.writeLine(`let staleRecords = 0;`);
|
|
@@ -50,13 +58,6 @@ function createApplyPullFile(writer, models, versionMetaModelName) {
|
|
|
50
58
|
writer.writeLine(`continue;`);
|
|
51
59
|
});
|
|
52
60
|
writer.blankLine();
|
|
53
|
-
writer.writeLine(`const versionMeta = await idbClient.$versionMeta.get(model, keyPath, tx);`);
|
|
54
|
-
writer.writeLine(`const lastAppliedChangeId = versionMeta?.lastAppliedChangeId ?? null;`);
|
|
55
|
-
writer.writeLine(`if (lastAppliedChangeId !== null && lastAppliedChangeId >= changelogId) {`);
|
|
56
|
-
writer.writeLine(` staleRecords++;`);
|
|
57
|
-
writer.writeLine(` continue;`);
|
|
58
|
-
writer.writeLine(`}`);
|
|
59
|
-
writer.blankLine();
|
|
60
61
|
writer.writeLine(`// Exit early if transaction was aborted during previous operations`);
|
|
61
62
|
writer.writeLine(`if (txAborted)`).block(() => {
|
|
62
63
|
writer.writeLine(`validationErrors.push({ model, error: new Error('Transaction was aborted') });`);
|
|
@@ -64,6 +65,13 @@ function createApplyPullFile(writer, models, versionMetaModelName) {
|
|
|
64
65
|
});
|
|
65
66
|
writer.blankLine();
|
|
66
67
|
writer.writeLine(`try `).block(() => {
|
|
68
|
+
writer.writeLine(`const versionMeta = await idbClient.$versionMeta.get(model, keyPath, tx);`);
|
|
69
|
+
writer.writeLine(`const lastAppliedChangeId = versionMeta?.lastAppliedChangeId ?? null;`);
|
|
70
|
+
writer.writeLine(`if (lastAppliedChangeId !== null && lastAppliedChangeId >= changelogId) {`);
|
|
71
|
+
writer.writeLine(` staleRecords++;`);
|
|
72
|
+
writer.writeLine(` continue;`);
|
|
73
|
+
writer.writeLine(`}`);
|
|
74
|
+
writer.blankLine();
|
|
67
75
|
models.forEach((model, index) => {
|
|
68
76
|
const modelName = model.name;
|
|
69
77
|
const camelCaseName = modelName.charAt(0).toLowerCase() + modelName.slice(1);
|
|
@@ -78,7 +86,7 @@ function createApplyPullFile(writer, models, versionMetaModelName) {
|
|
|
78
86
|
writer.writeLine(`${condition} (model === '${modelName}') `).block(() => {
|
|
79
87
|
writer.writeLine(`if (operation === 'delete') `).block(() => {
|
|
80
88
|
writer.writeLine(`const validatedKeyPath = keyPathValidators.${modelName}.parse(keyPath);`);
|
|
81
|
-
writer.writeLine(`await idbClient.${camelCaseName}.
|
|
89
|
+
writer.writeLine(`await idbClient.${camelCaseName}.deleteMany({ where: ${keyPathWhereClause} }, { silent: true, addToOutbox: false, tx });`);
|
|
82
90
|
writer.writeLine(`totalAppliedRecords++;`);
|
|
83
91
|
writer.writeLine(`// Mark as pulled with latest changelog ID`);
|
|
84
92
|
writer.writeLine(`await idbClient.$versionMeta.markPulled(model, keyPath, changelogId, { tx });`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/fileCreators/apply-pull/create.ts"],"names":[],"mappings":";;AAIA,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/fileCreators/apply-pull/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,7 +45,7 @@ function createBatchProcessorFile(writer, models, prismaClientImport, rootModel)
|
|
|
45
45
|
const modelNames = models.map((m) => m.name);
|
|
46
46
|
writer.writeLine(`import { z, type ZodTypeAny } from "zod";`);
|
|
47
47
|
writer.writeLine(`import type { OutboxEventRecord } from "../client/idb-interface";`);
|
|
48
|
-
writer.writeLine(`import type {
|
|
48
|
+
writer.writeLine(`import type { Changelog } from "${prismaClientImport}";`);
|
|
49
49
|
writer.writeLine(`import type { PrismaClient } from "${prismaClientImport}";`);
|
|
50
50
|
writer.writeLine(`import { validators, keyPathValidators } from "../validators";`);
|
|
51
51
|
writer.blankLine();
|
|
@@ -62,7 +62,7 @@ function createBatchProcessorFile(writer, models, prismaClientImport, rootModel)
|
|
|
62
62
|
writer.writeLine(`}[keyof V & string];`);
|
|
63
63
|
writer.blankLine();
|
|
64
64
|
writer.writeLine(`export type LogWithRecord<V extends Partial<Record<string, ZodTypeAny>>> = {`);
|
|
65
|
-
writer.writeLine(` [M in keyof V & string]: Omit<
|
|
65
|
+
writer.writeLine(` [M in keyof V & string]: Omit<Changelog, "model" | "keyPath"> & {`);
|
|
66
66
|
writer.writeLine(` model: M;`);
|
|
67
67
|
writer.writeLine(` keyPath: Array<string | number>;`);
|
|
68
68
|
writer.writeLine(` record?: z.infer<V[M]> | null;`);
|
|
@@ -170,7 +170,7 @@ function createBatchProcessorFile(writer, models, prismaClientImport, rootModel)
|
|
|
170
170
|
writer.writeLine(`}): Promise<Array<LogWithRecord<typeof validators>>>`);
|
|
171
171
|
writer.block(() => {
|
|
172
172
|
writer
|
|
173
|
-
.writeLine(`const logs = await prisma.
|
|
173
|
+
.writeLine(`const logs = await prisma.changelog.findMany(`)
|
|
174
174
|
.block(() => {
|
|
175
175
|
writer
|
|
176
176
|
.writeLine(`where: `)
|
|
@@ -289,7 +289,7 @@ function generateModelSyncHandler(writer, model, allModels, rootModel, dag) {
|
|
|
289
289
|
writer.writeLine(`switch (operation) {`);
|
|
290
290
|
writer.writeLine(` case "create": {`);
|
|
291
291
|
writer.writeLine(` const result = await prisma.$transaction(async (tx) => {`);
|
|
292
|
-
writer.writeLine(` const existingLog = await tx.
|
|
292
|
+
writer.writeLine(` const existingLog = await tx.changelog.findUnique({`);
|
|
293
293
|
writer.writeLine(` where: { outboxEventId: event.id },`);
|
|
294
294
|
writer.writeLine(` });`);
|
|
295
295
|
writer.writeLine(` if (existingLog) {`);
|
|
@@ -360,7 +360,7 @@ function generateModelSyncHandler(writer, model, allModels, rootModel, dag) {
|
|
|
360
360
|
writer.writeLine(` }`);
|
|
361
361
|
writer.blankLine();
|
|
362
362
|
}
|
|
363
|
-
writer.writeLine(` const newLog = await tx.
|
|
363
|
+
writer.writeLine(` const newLog = await tx.changelog.create({`);
|
|
364
364
|
writer.writeLine(` data: {`);
|
|
365
365
|
writer.writeLine(` model: "${model.name}",`);
|
|
366
366
|
writer.writeLine(` keyPath: validKeyPath,`);
|
|
@@ -377,7 +377,7 @@ function generateModelSyncHandler(writer, model, allModels, rootModel, dag) {
|
|
|
377
377
|
writer.blankLine();
|
|
378
378
|
writer.writeLine(` case "update": {`);
|
|
379
379
|
writer.writeLine(` const result = await prisma.$transaction(async (tx) => {`);
|
|
380
|
-
writer.writeLine(` const existingLog = await tx.
|
|
380
|
+
writer.writeLine(` const existingLog = await tx.changelog.findUnique({`);
|
|
381
381
|
writer.writeLine(` where: { outboxEventId: event.id },`);
|
|
382
382
|
writer.writeLine(` });`);
|
|
383
383
|
writer.writeLine(` if (existingLog) {`);
|
|
@@ -494,7 +494,7 @@ function generateModelSyncHandler(writer, model, allModels, rootModel, dag) {
|
|
|
494
494
|
writer.writeLine(` }`);
|
|
495
495
|
}
|
|
496
496
|
writer.blankLine();
|
|
497
|
-
writer.writeLine(` const newLog = await tx.
|
|
497
|
+
writer.writeLine(` const newLog = await tx.changelog.create({`);
|
|
498
498
|
writer.writeLine(` data: {`);
|
|
499
499
|
writer.writeLine(` model: "${model.name}",`);
|
|
500
500
|
writer.writeLine(` keyPath: validKeyPath,`);
|
|
@@ -515,7 +515,7 @@ function generateModelSyncHandler(writer, model, allModels, rootModel, dag) {
|
|
|
515
515
|
writer.blankLine();
|
|
516
516
|
writer.writeLine(` case "delete": {`);
|
|
517
517
|
writer.writeLine(` const result = await prisma.$transaction(async (tx) => {`);
|
|
518
|
-
writer.writeLine(` const existingLog = await tx.
|
|
518
|
+
writer.writeLine(` const existingLog = await tx.changelog.findUnique({`);
|
|
519
519
|
writer.writeLine(` where: { outboxEventId: event.id },`);
|
|
520
520
|
writer.writeLine(` });`);
|
|
521
521
|
writer.writeLine(` if (existingLog) {`);
|
|
@@ -552,7 +552,7 @@ function generateModelSyncHandler(writer, model, allModels, rootModel, dag) {
|
|
|
552
552
|
writer.writeLine(` }`);
|
|
553
553
|
}
|
|
554
554
|
writer.blankLine();
|
|
555
|
-
writer.writeLine(` const newLog = await tx.
|
|
555
|
+
writer.writeLine(` const newLog = await tx.changelog.create({`);
|
|
556
556
|
writer.writeLine(` data: {`);
|
|
557
557
|
writer.writeLine(` model: "${model.name}",`);
|
|
558
558
|
writer.writeLine(` keyPath: validKeyPath,`);
|
|
@@ -17,6 +17,7 @@ function createDAG(filteredModels, rootModel) {
|
|
|
17
17
|
}
|
|
18
18
|
validateRootAuthority(dag, rootModel);
|
|
19
19
|
checkForCycles(dag);
|
|
20
|
+
validateClientGeneratedIds(filteredModels);
|
|
20
21
|
return dag;
|
|
21
22
|
}
|
|
22
23
|
function validateRootAuthority(dag, rootModel) {
|
|
@@ -72,4 +73,21 @@ function checkForCycles(dag) {
|
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
}
|
|
76
|
+
function validateClientGeneratedIds(models) {
|
|
77
|
+
for (const model of models) {
|
|
78
|
+
const idField = model.fields.find((f) => f.isId);
|
|
79
|
+
if (!idField) {
|
|
80
|
+
throw new Error(`Model "${model.name}" is missing an @id field. All syncable models must have a primary key.`);
|
|
81
|
+
}
|
|
82
|
+
if (!idField.hasDefaultValue) {
|
|
83
|
+
throw new Error(`Model "${model.name}" has @id field "${idField.name}" without a default value. Required: Use random defaults like uuid() or cuid() for all models (except rootModel) included in sync.`);
|
|
84
|
+
}
|
|
85
|
+
const isValidClientGeneratedId = typeof idField.default === "object" &&
|
|
86
|
+
"name" in idField.default &&
|
|
87
|
+
(idField.default.name === "uuid" || idField.default.name === "cuid");
|
|
88
|
+
if (!isValidClientGeneratedId) {
|
|
89
|
+
throw new Error(`Model "${model.name}" has @id field "${idField.name}" with invalid default "${typeof idField.default === "object" && "name" in idField.default ? idField.default.name : idField.default}". Required: Use random defaults like uuid() or cuid() for all models (except rootModel) included in sync.`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
75
93
|
//# sourceMappingURL=createDAG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createDAG.js","sourceRoot":"","sources":["../../../src/fileCreators/batch-processor/createDAG.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"createDAG.js","sourceRoot":"","sources":["../../../src/fileCreators/batch-processor/createDAG.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ function createIDBInterfaceFile(writer, models, prismaClientImport, outboxSync,
|
|
|
7
7
|
writer.writeLine(`import type * as Prisma from "${prismaClientImport}";`);
|
|
8
8
|
if (outboxSync) {
|
|
9
9
|
writer.writeLine(`import type { PushResult } from "../server/batch-processor";`);
|
|
10
|
+
writer.writeLine(`import type { ApplyPullResult } from "./apply-pull";`);
|
|
10
11
|
}
|
|
11
12
|
writer.blankLine();
|
|
12
13
|
writer.writeLine(`export interface PrismaIDBSchema extends DBSchema`).block(() => {
|
|
@@ -57,6 +58,7 @@ function addOutboxEventTypeDefinition(writer) {
|
|
|
57
58
|
.writeLine(`lastError: string | null;`)
|
|
58
59
|
.writeLine(`synced: boolean;`)
|
|
59
60
|
.writeLine(`syncedAt: Date | null;`)
|
|
61
|
+
.writeLine(`lastAttemptedAt: Date | null;`)
|
|
60
62
|
.writeLine(`retryable: boolean;`);
|
|
61
63
|
});
|
|
62
64
|
writer.writeLine(`export interface ChangeMetaRecord`).block(() => {
|
|
@@ -106,30 +108,39 @@ function addSyncWorkerTypes(writer) {
|
|
|
106
108
|
.writeLine(` * Returns immediately if worker is stopped or a sync is already in progress.`)
|
|
107
109
|
.writeLine(` * Use syncNow() to trigger a one-off sync without starting the worker.`)
|
|
108
110
|
.writeLine(` */`)
|
|
109
|
-
.writeLine(`forceSync(): Promise<void>;`)
|
|
111
|
+
.writeLine(`forceSync(options?: { overrideBackoff?: boolean }): Promise<void>;`)
|
|
110
112
|
.writeLine(`/**`)
|
|
111
113
|
.writeLine(` * Execute a single sync cycle immediately without starting the worker.`)
|
|
112
114
|
.writeLine(` * Returns immediately if a sync is already in progress.`)
|
|
113
115
|
.writeLine(` * Does not require the worker to be running (started).`)
|
|
114
116
|
.writeLine(` */`)
|
|
115
|
-
.writeLine(`syncNow(): Promise<void>;`)
|
|
117
|
+
.writeLine(`syncNow(options?: { overrideBackoff?: boolean }): Promise<void>;`)
|
|
116
118
|
.writeLine(`/**`)
|
|
117
119
|
.writeLine(` * Get current sync worker status snapshot.`)
|
|
118
120
|
.writeLine(` * Listen to 'statuschange' events via .on() to get updates.`)
|
|
119
121
|
.writeLine(` */`)
|
|
120
122
|
.writeLine(`readonly status: SyncWorkerStatus;`)
|
|
121
|
-
.writeLine(
|
|
122
|
-
.writeLine(
|
|
123
|
-
.writeLine(
|
|
124
|
-
.writeLine(
|
|
125
|
-
.writeLine(
|
|
126
|
-
.writeLine(
|
|
127
|
-
.writeLine(
|
|
128
|
-
.writeLine(
|
|
129
|
-
.writeLine(
|
|
130
|
-
.writeLine(
|
|
131
|
-
.writeLine(
|
|
132
|
-
.writeLine(
|
|
123
|
+
.writeLine("/**")
|
|
124
|
+
.writeLine(" * Listen for status changes.")
|
|
125
|
+
.writeLine(" * @param event Event name ('statuschange', 'pullcompleted' or 'pushcompleted')")
|
|
126
|
+
.writeLine(" * @param callback Function called whenever the event fires")
|
|
127
|
+
.writeLine(" * @returns Unsubscribe function")
|
|
128
|
+
.writeLine(" * @example")
|
|
129
|
+
.writeLine(" * const unsubscribe = worker.on('statuschange', (e) => {")
|
|
130
|
+
.writeLine(" * console.log('Status:', worker.status);")
|
|
131
|
+
.writeLine(" * });")
|
|
132
|
+
.writeLine(" * // Later: unsubscribe()")
|
|
133
|
+
.writeLine(" */")
|
|
134
|
+
.writeLine("on<E extends 'statuschange' | 'pullcompleted' | 'pushcompleted'>(")
|
|
135
|
+
.writeLine(" event: E,")
|
|
136
|
+
.writeLine(" callback: (")
|
|
137
|
+
.writeLine(" e: E extends 'statuschange'")
|
|
138
|
+
.writeLine(" ? CustomEvent<{ status: 'STOPPED' | 'IDLE' | 'PUSHING' | 'PULLING'; isLooping: boolean; lastSyncTime: Date | null; lastError: Error | null }>")
|
|
139
|
+
.writeLine(" : E extends 'pullcompleted'")
|
|
140
|
+
.writeLine(" ? CustomEvent<ApplyPullResult>")
|
|
141
|
+
.writeLine(" : CustomEvent<{ results: PushResult[] }>")
|
|
142
|
+
.writeLine(" ) => void")
|
|
143
|
+
.writeLine("): () => void;");
|
|
133
144
|
});
|
|
134
145
|
}
|
|
135
146
|
//# sourceMappingURL=create.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/fileCreators/idb-interface/create.ts"],"names":[],"mappings":";;AAKA,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/fileCreators/idb-interface/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.addBaseModelClass = addBaseModelClass;
|
|
4
|
-
function addBaseModelClass(writer, outboxSync = false
|
|
4
|
+
function addBaseModelClass(writer, outboxSync = false) {
|
|
5
5
|
writer.writeLine(`class BaseIDBModelClass<T extends keyof PrismaIDBSchema>`).block(() => {
|
|
6
6
|
writer
|
|
7
7
|
.writeLine(`protected client: PrismaIDBClient;`)
|
|
@@ -16,31 +16,23 @@ function addBaseModelClass(writer, outboxSync = false, outboxModelName) {
|
|
|
16
16
|
.writeLine(`this.modelName = modelName;`)
|
|
17
17
|
.writeLine(`this.eventEmitter = new EventTarget();`);
|
|
18
18
|
});
|
|
19
|
-
addEventEmitters(writer, outboxSync
|
|
19
|
+
addEventEmitters(writer, outboxSync);
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
|
-
function addEventEmitters(writer, outboxSync
|
|
22
|
+
function addEventEmitters(writer, outboxSync) {
|
|
23
23
|
writer
|
|
24
|
-
.writeLine(`subscribe(event: "create" | "update" | "delete" | ("create" | "update" | "delete")[], callback: (e:
|
|
24
|
+
.writeLine(`subscribe(event: "create" | "update" | "delete" | ("create" | "update" | "delete")[], callback: (e: CustomEvent<{ keyPath: PrismaIDBSchema[T]["key"]; oldKeyPath?: PrismaIDBSchema[T]["key"] }>) => void): () => void`)
|
|
25
25
|
.block(() => {
|
|
26
|
-
writer
|
|
27
|
-
.writeLine(`
|
|
28
|
-
.block(() => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
.writeLine(`else`)
|
|
32
|
-
.block(() => {
|
|
33
|
-
writer.writeLine(`this.eventEmitter.addEventListener(event, callback);`);
|
|
26
|
+
writer.write(`if (Array.isArray(event))`).block(() => {
|
|
27
|
+
writer.writeLine(`event.forEach((evt) => this.eventEmitter.addEventListener(evt, callback as EventListener));`);
|
|
28
|
+
writer.write(`return () =>`).block(() => {
|
|
29
|
+
writer.writeLine(`event.forEach((evt) => this.eventEmitter.removeEventListener(evt, callback as EventListener));`);
|
|
30
|
+
});
|
|
34
31
|
});
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
.block(() => {
|
|
39
|
-
writer.writeLine(`if (Array.isArray(event))`).block(() => {
|
|
40
|
-
writer.writeLine(`event.forEach((event) => this.eventEmitter.removeEventListener(event, callback));`);
|
|
41
|
-
writer.writeLine(`return;`);
|
|
32
|
+
writer.writeLine(`this.eventEmitter.addEventListener(event, callback as EventListener);`);
|
|
33
|
+
writer.write(`return () =>`).block(() => {
|
|
34
|
+
writer.writeLine(`this.eventEmitter.removeEventListener(event, callback as EventListener);`);
|
|
42
35
|
});
|
|
43
|
-
writer.writeLine(`this.eventEmitter.removeEventListener(event, callback);`);
|
|
44
36
|
});
|
|
45
37
|
writer
|
|
46
38
|
.writeLine(`protected async emit(event: "create" | "update" | "delete", keyPath: PrismaIDBSchema[T]["key"], oldKeyPath?: PrismaIDBSchema[T]["key"], record?: unknown, opts?: { silent?: boolean; addToOutbox?: boolean; tx?: IDBUtils.ReadwriteTransactionType })`)
|
|
@@ -62,24 +54,19 @@ function addEventEmitters(writer, outboxSync, outboxModelName) {
|
|
|
62
54
|
writer.blankLine();
|
|
63
55
|
writer.writeLine(`if (opts?.addToOutbox !== false && this.client.shouldTrackModel(this.modelName))`).block(() => {
|
|
64
56
|
writer
|
|
65
|
-
.writeLine(`
|
|
66
|
-
.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
.writeLine(
|
|
75
|
-
.writeLine(`
|
|
76
|
-
.writeLine(`payload: record ?? keyPath,`)
|
|
77
|
-
.writeLine(`retryable: true,`)
|
|
78
|
-
.writeLine(`};`)
|
|
79
|
-
.writeLine(`await outboxStore.add(outboxEvent);`)
|
|
57
|
+
.writeLine(`await this.client.$outbox.create(`)
|
|
58
|
+
.block(() => {
|
|
59
|
+
writer
|
|
60
|
+
.writeLine(`data: {`)
|
|
61
|
+
.writeLine(`entityType: this.modelName,`)
|
|
62
|
+
.writeLine(`operation: event,`)
|
|
63
|
+
.writeLine(`payload: record ?? keyPath,`)
|
|
64
|
+
.writeLine(`},`);
|
|
65
|
+
})
|
|
66
|
+
.writeLine(`, { tx: opts?.tx }`)
|
|
67
|
+
.writeLine(`);`)
|
|
80
68
|
.blankLine()
|
|
81
|
-
.writeLine(`await this.client.$versionMeta.markLocalPending(this.modelName, keyPath, { tx: opts
|
|
82
|
-
.writeLine(`}`);
|
|
69
|
+
.writeLine(`await this.client.$versionMeta.markLocalPending(this.modelName, keyPath, { tx: opts?.tx });`);
|
|
83
70
|
});
|
|
84
71
|
});
|
|
85
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseIDBModelClass.js","sourceRoot":"","sources":["../../../../src/fileCreators/prisma-idb-client/classes/BaseIDBModelClass.ts"],"names":[],"mappings":";;AAEA,8CAmBC;AAnBD,SAAgB,iBAAiB,CAAC,MAAuB,EAAE,aAAsB,KAAK
|
|
1
|
+
{"version":3,"file":"BaseIDBModelClass.js","sourceRoot":"","sources":["../../../../src/fileCreators/prisma-idb-client/classes/BaseIDBModelClass.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,12 +6,35 @@ function addOutboxEventIDBClass(writer, outboxModelName) {
|
|
|
6
6
|
addConstructor(writer, outboxModelName);
|
|
7
7
|
addCreateMethod(writer, outboxModelName);
|
|
8
8
|
addGetNextBatchMethod(writer, outboxModelName);
|
|
9
|
+
addHasAnyRetryableUnsyncedMethod(writer, outboxModelName);
|
|
9
10
|
addMarkSyncedMethod(writer, outboxModelName);
|
|
10
11
|
addMarkFailedMethod(writer, outboxModelName);
|
|
11
12
|
addStatsMethod(writer, outboxModelName);
|
|
12
13
|
addClearSyncedMethod(writer, outboxModelName);
|
|
13
14
|
});
|
|
14
15
|
}
|
|
16
|
+
function addHasAnyRetryableUnsyncedMethod(writer, outboxModelName) {
|
|
17
|
+
writer
|
|
18
|
+
.writeLine(`/**`)
|
|
19
|
+
.writeLine(` * Returns true if any unsynced, retryable outbox event exists.`)
|
|
20
|
+
.writeLine(` * Used to gate pull phase in sync worker.`)
|
|
21
|
+
.writeLine(` */`)
|
|
22
|
+
.writeLine(`async hasAnyRetryableUnsynced(): Promise<boolean> `)
|
|
23
|
+
.block(() => {
|
|
24
|
+
writer
|
|
25
|
+
.writeLine(`const tx = this.client._db.transaction("${outboxModelName}", "readonly");`)
|
|
26
|
+
.writeLine(`const store = tx.objectStore("${outboxModelName}");`)
|
|
27
|
+
.writeLine(`let cursor = await store.openCursor();`)
|
|
28
|
+
.writeLine(`while (cursor) `)
|
|
29
|
+
.block(() => {
|
|
30
|
+
writer.writeLine(`const e = cursor.value;`);
|
|
31
|
+
writer.writeLine(`if (!e.synced && e.retryable) return true;`);
|
|
32
|
+
writer.writeLine(`cursor = await cursor.continue();`);
|
|
33
|
+
})
|
|
34
|
+
.writeLine(`return false;`);
|
|
35
|
+
})
|
|
36
|
+
.blankLine();
|
|
37
|
+
}
|
|
15
38
|
function addConstructor(writer, outboxModelName) {
|
|
16
39
|
writer
|
|
17
40
|
.writeLine(`constructor(client: PrismaIDBClient, keyPath: string[])`)
|
|
@@ -22,10 +45,12 @@ function addConstructor(writer, outboxModelName) {
|
|
|
22
45
|
}
|
|
23
46
|
function addCreateMethod(writer, outboxModelName) {
|
|
24
47
|
writer
|
|
25
|
-
.
|
|
48
|
+
.write(`async create(query: { data: Pick<OutboxEventRecord, `)
|
|
49
|
+
.write(`"entityType" | "operation" | "payload"`)
|
|
50
|
+
.write(`> }, options?: { tx?: IDBUtils.ReadwriteTransactionType, silent?: boolean }): Promise<OutboxEventRecord>`)
|
|
26
51
|
.block(() => {
|
|
27
52
|
writer
|
|
28
|
-
.writeLine(`const tx = this.client._db.transaction("${outboxModelName}", "readwrite");`)
|
|
53
|
+
.writeLine(`const tx = options?.tx ?? this.client._db.transaction(["${outboxModelName}"], "readwrite");`)
|
|
29
54
|
.writeLine(`const store = tx.objectStore("${outboxModelName}");`)
|
|
30
55
|
.blankLine()
|
|
31
56
|
.writeLine(`const event: OutboxEventRecord = {`)
|
|
@@ -33,14 +58,16 @@ function addCreateMethod(writer, outboxModelName) {
|
|
|
33
58
|
.writeLine(`createdAt: new Date(),`)
|
|
34
59
|
.writeLine(`synced: false,`)
|
|
35
60
|
.writeLine(`syncedAt: null,`)
|
|
61
|
+
.writeLine(`lastAttemptedAt: null,`)
|
|
36
62
|
.writeLine(`tries: 0,`)
|
|
37
63
|
.writeLine(`lastError: null,`)
|
|
38
64
|
.writeLine(`retryable: true,`)
|
|
39
65
|
.writeLine(`...query.data,`)
|
|
40
66
|
.writeLine(`};`)
|
|
41
|
-
.blankLine()
|
|
42
67
|
.writeLine(`await store.add(event);`)
|
|
43
|
-
.
|
|
68
|
+
.blankLine()
|
|
69
|
+
.writeLine(`this.emit("create", [event.id], undefined, event, { silent: options?.silent ?? false, addToOutbox: false, tx });`)
|
|
70
|
+
.writeLine(`if (!options?.tx) await tx.done;`)
|
|
44
71
|
.blankLine()
|
|
45
72
|
.writeLine(`return event;`);
|
|
46
73
|
})
|
|
@@ -52,7 +79,7 @@ function addGetNextBatchMethod(writer, outboxModelName) {
|
|
|
52
79
|
.block(() => {
|
|
53
80
|
writer
|
|
54
81
|
.writeLine(`const limit = options?.limit ?? 20;`)
|
|
55
|
-
.writeLine(`const tx = this.client._db.transaction("${outboxModelName}", "readonly");`)
|
|
82
|
+
.writeLine(`const tx = this.client._db.transaction(["${outboxModelName}"], "readonly");`)
|
|
56
83
|
.writeLine(`const store = tx.objectStore("${outboxModelName}");`)
|
|
57
84
|
.blankLine()
|
|
58
85
|
.writeLine(`// Get all unsynced events, ordered by createdAt`)
|
|
@@ -65,21 +92,24 @@ function addGetNextBatchMethod(writer, outboxModelName) {
|
|
|
65
92
|
}
|
|
66
93
|
function addMarkSyncedMethod(writer, outboxModelName) {
|
|
67
94
|
writer
|
|
68
|
-
.
|
|
95
|
+
.write(`async markSynced(appliedLogs: { id: string; lastAppliedChangeId: string | null }[], options?: { tx?: IDBUtils.ReadwriteTransactionType, silent?: boolean }): Promise<void>`)
|
|
69
96
|
.block(() => {
|
|
70
97
|
writer
|
|
71
98
|
.writeLine(`const syncedAt = new Date();`)
|
|
72
|
-
.writeLine(`const tx = this.client._db.transaction(["${outboxModelName}", "VersionMeta"], "readwrite");`)
|
|
99
|
+
.writeLine(`const tx = options?.tx ?? this.client._db.transaction(["${outboxModelName}", "VersionMeta"], "readwrite");`)
|
|
73
100
|
.writeLine(`const store = tx.objectStore("${outboxModelName}");`)
|
|
74
101
|
.blankLine()
|
|
75
102
|
.writeLine(`for (const log of appliedLogs) {`)
|
|
76
103
|
.writeLine(`const event = await store.get([log.id]);`)
|
|
77
104
|
.writeLine(`if (event) {`)
|
|
78
|
-
.writeLine(`
|
|
105
|
+
.writeLine(`const updatedEvent = {`)
|
|
79
106
|
.writeLine(`...event,`)
|
|
80
107
|
.writeLine(`synced: true,`)
|
|
81
108
|
.writeLine(`syncedAt,`)
|
|
82
|
-
.writeLine(`
|
|
109
|
+
.writeLine(`lastAttemptedAt: syncedAt,`)
|
|
110
|
+
.writeLine(`};`)
|
|
111
|
+
.writeLine(`await store.put(updatedEvent);`)
|
|
112
|
+
.writeLine(`this.emit("update", [event.id], undefined, updatedEvent, { silent: options?.silent ?? false, addToOutbox: false, tx });`)
|
|
83
113
|
.blankLine()
|
|
84
114
|
.writeLine(`if (!(event.entityType in modelRecordToKeyPath)) {`)
|
|
85
115
|
.writeLine(`throw new Error(\`Unknown model: \${event.entityType}\`);`)
|
|
@@ -97,29 +127,32 @@ function addMarkSyncedMethod(writer, outboxModelName) {
|
|
|
97
127
|
.writeLine(`}`)
|
|
98
128
|
.writeLine(`}`)
|
|
99
129
|
.blankLine()
|
|
100
|
-
.writeLine(`await tx.done;`);
|
|
130
|
+
.writeLine(`if (!options?.tx) await tx.done;`);
|
|
101
131
|
})
|
|
102
132
|
.blankLine();
|
|
103
133
|
}
|
|
104
134
|
function addMarkFailedMethod(writer, outboxModelName) {
|
|
105
135
|
writer
|
|
106
|
-
.writeLine(`async markFailed(eventId: string, error: NonNullable<PushResult['error']
|
|
136
|
+
.writeLine(`async markFailed(eventId: string, error: NonNullable<PushResult['error']>, options?: { tx?: IDBUtils.ReadwriteTransactionType, silent?: boolean }): Promise<void>`)
|
|
107
137
|
.block(() => {
|
|
108
138
|
writer
|
|
109
|
-
.writeLine(`const tx = this.client._db.transaction("${outboxModelName}", "readwrite");`)
|
|
139
|
+
.writeLine(`const tx = options?.tx ?? this.client._db.transaction(["${outboxModelName}"], "readwrite");`)
|
|
110
140
|
.writeLine(`const store = tx.objectStore("${outboxModelName}");`)
|
|
111
141
|
.blankLine()
|
|
112
142
|
.writeLine(`const event = await store.get([eventId]);`)
|
|
113
143
|
.writeLine(`if (event) {`)
|
|
114
|
-
.writeLine(`
|
|
144
|
+
.writeLine(`const updatedEvent = {`)
|
|
115
145
|
.writeLine(`...event,`)
|
|
116
146
|
.writeLine(`tries: (event.tries ?? 0) + 1,`)
|
|
117
|
-
.writeLine(`lastError: \`\${error.
|
|
147
|
+
.writeLine(`lastError: \`\${error.type ?? 'Error'}: \${error.message}\`,`)
|
|
148
|
+
.writeLine(`lastAttemptedAt: new Date(),`)
|
|
118
149
|
.writeLine(`retryable: error.retryable,`)
|
|
119
|
-
.writeLine(`}
|
|
150
|
+
.writeLine(`};`)
|
|
151
|
+
.writeLine(`await store.put(updatedEvent);`)
|
|
152
|
+
.writeLine(`this.emit("update", [event.id], undefined, updatedEvent, { silent: options?.silent ?? false, addToOutbox: false, tx });`)
|
|
120
153
|
.writeLine(`}`)
|
|
121
154
|
.blankLine()
|
|
122
|
-
.writeLine(`await tx.done;`);
|
|
155
|
+
.writeLine(`if (!options?.tx) await tx.done;`);
|
|
123
156
|
})
|
|
124
157
|
.blankLine();
|
|
125
158
|
}
|
|
@@ -128,7 +161,7 @@ function addStatsMethod(writer, outboxModelName) {
|
|
|
128
161
|
.writeLine(`async stats(): Promise<{ unsynced: number; failed: number; lastError?: string }>`)
|
|
129
162
|
.block(() => {
|
|
130
163
|
writer
|
|
131
|
-
.writeLine(`const tx = this.client._db.transaction("${outboxModelName}", "readonly");`)
|
|
164
|
+
.writeLine(`const tx = this.client._db.transaction(["${outboxModelName}"], "readonly");`)
|
|
132
165
|
.writeLine(`const store = tx.objectStore("${outboxModelName}");`)
|
|
133
166
|
.writeLine(`const allEvents = await store.getAll();`)
|
|
134
167
|
.blankLine()
|
|
@@ -142,14 +175,14 @@ function addStatsMethod(writer, outboxModelName) {
|
|
|
142
175
|
}
|
|
143
176
|
function addClearSyncedMethod(writer, outboxModelName) {
|
|
144
177
|
writer
|
|
145
|
-
.writeLine(`async clearSynced(options?: { olderThanDays?: number }): Promise<number>`)
|
|
178
|
+
.writeLine(`async clearSynced(options?: { olderThanDays?: number, tx?: IDBUtils.ReadwriteTransactionType, silent?: boolean }): Promise<number>`)
|
|
146
179
|
.block(() => {
|
|
147
180
|
writer
|
|
148
181
|
.writeLine(`const olderThanDays = options?.olderThanDays ?? 7;`)
|
|
149
182
|
.writeLine(`const cutoffDate = new Date();`)
|
|
150
183
|
.writeLine(`cutoffDate.setDate(cutoffDate.getDate() - olderThanDays);`)
|
|
151
184
|
.blankLine()
|
|
152
|
-
.writeLine(`const tx = this.client._db.transaction("${outboxModelName}", "readwrite");`)
|
|
185
|
+
.writeLine(`const tx = options?.tx ?? this.client._db.transaction(["${outboxModelName}"], "readwrite");`)
|
|
153
186
|
.writeLine(`const store = tx.objectStore("${outboxModelName}");`)
|
|
154
187
|
.writeLine(`const allEvents = await store.getAll();`)
|
|
155
188
|
.blankLine()
|
|
@@ -157,11 +190,12 @@ function addClearSyncedMethod(writer, outboxModelName) {
|
|
|
157
190
|
.writeLine(`for (const event of allEvents) {`)
|
|
158
191
|
.writeLine(`if (event.synced && new Date(event.createdAt) < cutoffDate) {`)
|
|
159
192
|
.writeLine(`await store.delete([event.id]);`)
|
|
193
|
+
.writeLine(`this.emit("delete", [event.id], undefined, event, { silent: options?.silent ?? false, addToOutbox: false, tx });`)
|
|
160
194
|
.writeLine(`deletedCount++;`)
|
|
161
195
|
.writeLine(`}`)
|
|
162
196
|
.writeLine(`}`)
|
|
163
197
|
.blankLine()
|
|
164
|
-
.writeLine(`await tx.done;`)
|
|
198
|
+
.writeLine(`if (!options?.tx) await tx.done;`)
|
|
165
199
|
.writeLine(`return deletedCount;`);
|
|
166
200
|
})
|
|
167
201
|
.blankLine();
|