velocious 1.0.486 → 1.0.488
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 +1 -0
- package/build/configuration-types.js +19 -1
- package/build/configuration.js +25 -2
- package/build/environment-handlers/base.js +9 -0
- package/build/environment-handlers/node.js +105 -19
- package/build/packages/velocious-package.js +115 -0
- package/build/src/configuration-types.d.ts +57 -2
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +18 -2
- package/build/src/configuration.d.ts +9 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +21 -3
- package/build/src/environment-handlers/base.d.ts +6 -0
- package/build/src/environment-handlers/base.d.ts.map +1 -1
- package/build/src/environment-handlers/base.js +9 -1
- package/build/src/environment-handlers/node.d.ts +18 -0
- package/build/src/environment-handlers/node.d.ts.map +1 -1
- package/build/src/environment-handlers/node.js +94 -19
- package/build/src/packages/velocious-package.d.ts +69 -0
- package/build/src/packages/velocious-package.d.ts.map +1 -0
- package/build/src/packages/velocious-package.js +101 -0
- package/build/src/sync/sync-api-client-types.d.ts +182 -0
- package/build/src/sync/sync-api-client-types.d.ts.map +1 -0
- package/build/src/sync/sync-api-client-types.js +3 -0
- package/build/src/sync/sync-api-client.d.ts +188 -0
- package/build/src/sync/sync-api-client.d.ts.map +1 -0
- package/build/src/sync/sync-api-client.js +307 -0
- package/build/src/sync/sync-api-controller.d.ts +78 -0
- package/build/src/sync/sync-api-controller.d.ts.map +1 -0
- package/build/src/sync/sync-api-controller.js +142 -0
- package/build/src/sync/sync-model-change-feed-service.d.ts +131 -0
- package/build/src/sync/sync-model-change-feed-service.d.ts.map +1 -0
- package/build/src/sync/sync-model-change-feed-service.js +212 -0
- package/build/sync/sync-api-client-types.js +77 -0
- package/build/sync/sync-api-client.js +342 -0
- package/build/sync/sync-api-controller.js +161 -0
- package/build/sync/sync-model-change-feed-service.js +244 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/configuration-types.js +19 -1
- package/src/configuration.js +25 -2
- package/src/environment-handlers/base.js +9 -0
- package/src/environment-handlers/node.js +105 -19
- package/src/packages/velocious-package.js +115 -0
- package/src/sync/sync-api-client-types.js +77 -0
- package/src/sync/sync-api-client.js +342 -0
- package/src/sync/sync-api-controller.js +161 -0
- package/src/sync/sync-model-change-feed-service.js +244 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import restArgsError from "../utils/rest-args-error.js";
|
|
3
|
+
/**
|
|
4
|
+
* A Velocious package (engine): an external npm package that contributes data
|
|
5
|
+
* models, frontend-model resources and migrations to a consuming app. The app
|
|
6
|
+
* lists packages in `Configuration({packages: [...]})`; the framework then loads
|
|
7
|
+
* the package's `src/models`, discovers its `src/resources`, runs its
|
|
8
|
+
* `src/database/migrations`, and generates its frontend models into the app.
|
|
9
|
+
*/
|
|
10
|
+
export default class VelociousPackage {
|
|
11
|
+
/**
|
|
12
|
+
* Wraps a plain descriptor as a VelociousPackage (or returns it unchanged when
|
|
13
|
+
* it already is one), so packages can be listed without importing this class.
|
|
14
|
+
* @param {VelociousPackage | import("../configuration-types.js").VelociousPackageDescriptor} descriptor - Package or plain descriptor.
|
|
15
|
+
* @returns {VelociousPackage} - The package instance.
|
|
16
|
+
*/
|
|
17
|
+
static from(descriptor) {
|
|
18
|
+
if (descriptor instanceof VelociousPackage) {
|
|
19
|
+
return descriptor;
|
|
20
|
+
}
|
|
21
|
+
return new VelociousPackage(descriptor);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Derives the containing directory of a module url without Node's `path`/`url`
|
|
25
|
+
* modules, so this class stays safe to import in browser/Expo bundles.
|
|
26
|
+
* @param {string} url - A module url (usually `import.meta.url`).
|
|
27
|
+
* @returns {string} - The directory path that contains the module.
|
|
28
|
+
*/
|
|
29
|
+
static _directoryFromUrl(url) {
|
|
30
|
+
const directoryUrl = new URL(".", url);
|
|
31
|
+
return decodeURIComponent(directoryUrl.pathname).replace(/\/$/, "");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Runs constructor.
|
|
35
|
+
* @param {import("../configuration-types.js").VelociousPackageDescriptor} args - Package descriptor.
|
|
36
|
+
*/
|
|
37
|
+
constructor({ name, url, path, modelsPath, resourcesPath, migrationsPath, ...restArgs }) {
|
|
38
|
+
restArgsError(restArgs);
|
|
39
|
+
if (!name) {
|
|
40
|
+
throw new Error("A velocious package requires a name.");
|
|
41
|
+
}
|
|
42
|
+
if (!path && !url) {
|
|
43
|
+
throw new Error(`Velocious package "${name}" requires a "path" or a "url" (usually import.meta.url).`);
|
|
44
|
+
}
|
|
45
|
+
this._name = name;
|
|
46
|
+
this._path = path || VelociousPackage._directoryFromUrl(/** @type {string} */ (url));
|
|
47
|
+
this._modelsPath = modelsPath;
|
|
48
|
+
this._resourcesPath = resourcesPath;
|
|
49
|
+
this._migrationsPath = migrationsPath;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Runs get name.
|
|
53
|
+
* @returns {string} - The package name.
|
|
54
|
+
*/
|
|
55
|
+
getName() {
|
|
56
|
+
return this._name;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Runs get path.
|
|
60
|
+
* @returns {string} - The package root directory (the one that contains `src`).
|
|
61
|
+
*/
|
|
62
|
+
getPath() {
|
|
63
|
+
return this._path;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Runs get models path.
|
|
67
|
+
* @returns {string} - The package's models directory.
|
|
68
|
+
*/
|
|
69
|
+
getModelsPath() {
|
|
70
|
+
return this._modelsPath || `${this._path}/src/models`;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Runs get resources path.
|
|
74
|
+
* @returns {string} - The package's frontend-model resources directory.
|
|
75
|
+
*/
|
|
76
|
+
getResourcesPath() {
|
|
77
|
+
return this._resourcesPath || `${this._path}/src/resources`;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Runs get migrations path.
|
|
81
|
+
* @returns {string} - The package's migrations directory.
|
|
82
|
+
*/
|
|
83
|
+
getMigrationsPath() {
|
|
84
|
+
return this._migrationsPath || `${this._path}/src/database/migrations`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Derives the internal backend-project entry the framework appends so the
|
|
88
|
+
* existing resource-discovery + frontend-model generation machinery picks up
|
|
89
|
+
* this package. Generated frontend models are written to the app's output.
|
|
90
|
+
* @param {{frontendModelsOutputPath: string | undefined}} args - The app's frontend-models output path.
|
|
91
|
+
* @returns {import("../configuration-types.js").BackendProjectConfiguration} - The derived backend project.
|
|
92
|
+
*/
|
|
93
|
+
toBackendProjectConfiguration({ frontendModelsOutputPath }) {
|
|
94
|
+
return {
|
|
95
|
+
frontendModelsOutputPath,
|
|
96
|
+
path: this.getPath(),
|
|
97
|
+
resourcesPath: this.getResourcesPath()
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVsb2Npb3VzLXBhY2thZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGFja2FnZXMvdmVsb2Npb3VzLXBhY2thZ2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBRXZEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sZ0JBQWdCO0lBQ25DOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVO1FBQ3BCLElBQUksVUFBVSxZQUFZLGdCQUFnQixFQUFFLENBQUM7WUFDM0MsT0FBTyxVQUFVLENBQUE7UUFDbkIsQ0FBQztRQUVELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRztRQUMxQixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFFdEMsT0FBTyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNyRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxFQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQ25GLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7UUFDekQsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixJQUFJLDJEQUEyRCxDQUFDLENBQUE7UUFDeEcsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFBO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNwRixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQTtRQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQTtRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQTtJQUN2QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQTtJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQTtJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLGFBQWEsQ0FBQTtJQUN2RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssZ0JBQWdCLENBQUE7SUFDN0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLDBCQUEwQixDQUFBO0lBQ3hFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCw2QkFBNkIsQ0FBQyxFQUFDLHdCQUF3QixFQUFDO1FBQ3RELE9BQU87WUFDTCx3QkFBd0I7WUFDeEIsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtTQUN2QyxDQUFBO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuXG4vKipcbiAqIEEgVmVsb2Npb3VzIHBhY2thZ2UgKGVuZ2luZSk6IGFuIGV4dGVybmFsIG5wbSBwYWNrYWdlIHRoYXQgY29udHJpYnV0ZXMgZGF0YVxuICogbW9kZWxzLCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMgYW5kIG1pZ3JhdGlvbnMgdG8gYSBjb25zdW1pbmcgYXBwLiBUaGUgYXBwXG4gKiBsaXN0cyBwYWNrYWdlcyBpbiBgQ29uZmlndXJhdGlvbih7cGFja2FnZXM6IFsuLi5dfSlgOyB0aGUgZnJhbWV3b3JrIHRoZW4gbG9hZHNcbiAqIHRoZSBwYWNrYWdlJ3MgYHNyYy9tb2RlbHNgLCBkaXNjb3ZlcnMgaXRzIGBzcmMvcmVzb3VyY2VzYCwgcnVucyBpdHNcbiAqIGBzcmMvZGF0YWJhc2UvbWlncmF0aW9uc2AsIGFuZCBnZW5lcmF0ZXMgaXRzIGZyb250ZW5kIG1vZGVscyBpbnRvIHRoZSBhcHAuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c1BhY2thZ2Uge1xuICAvKipcbiAgICogV3JhcHMgYSBwbGFpbiBkZXNjcmlwdG9yIGFzIGEgVmVsb2Npb3VzUGFja2FnZSAob3IgcmV0dXJucyBpdCB1bmNoYW5nZWQgd2hlblxuICAgKiBpdCBhbHJlYWR5IGlzIG9uZSksIHNvIHBhY2thZ2VzIGNhbiBiZSBsaXN0ZWQgd2l0aG91dCBpbXBvcnRpbmcgdGhpcyBjbGFzcy5cbiAgICogQHBhcmFtIHtWZWxvY2lvdXNQYWNrYWdlIHwgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5WZWxvY2lvdXNQYWNrYWdlRGVzY3JpcHRvcn0gZGVzY3JpcHRvciAtIFBhY2thZ2Ugb3IgcGxhaW4gZGVzY3JpcHRvci5cbiAgICogQHJldHVybnMge1ZlbG9jaW91c1BhY2thZ2V9IC0gVGhlIHBhY2thZ2UgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgZnJvbShkZXNjcmlwdG9yKSB7XG4gICAgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBWZWxvY2lvdXNQYWNrYWdlKSB7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvclxuICAgIH1cblxuICAgIHJldHVybiBuZXcgVmVsb2Npb3VzUGFja2FnZShkZXNjcmlwdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZXMgdGhlIGNvbnRhaW5pbmcgZGlyZWN0b3J5IG9mIGEgbW9kdWxlIHVybCB3aXRob3V0IE5vZGUncyBgcGF0aGAvYHVybGBcbiAgICogbW9kdWxlcywgc28gdGhpcyBjbGFzcyBzdGF5cyBzYWZlIHRvIGltcG9ydCBpbiBicm93c2VyL0V4cG8gYnVuZGxlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIEEgbW9kdWxlIHVybCAodXN1YWxseSBgaW1wb3J0Lm1ldGEudXJsYCkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGRpcmVjdG9yeSBwYXRoIHRoYXQgY29udGFpbnMgdGhlIG1vZHVsZS5cbiAgICovXG4gIHN0YXRpYyBfZGlyZWN0b3J5RnJvbVVybCh1cmwpIHtcbiAgICBjb25zdCBkaXJlY3RvcnlVcmwgPSBuZXcgVVJMKFwiLlwiLCB1cmwpXG5cbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGRpcmVjdG9yeVVybC5wYXRobmFtZSkucmVwbGFjZSgvXFwvJC8sIFwiXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlZlbG9jaW91c1BhY2thZ2VEZXNjcmlwdG9yfSBhcmdzIC0gUGFja2FnZSBkZXNjcmlwdG9yLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe25hbWUsIHVybCwgcGF0aCwgbW9kZWxzUGF0aCwgcmVzb3VyY2VzUGF0aCwgbWlncmF0aW9uc1BhdGgsIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgdmVsb2Npb3VzIHBhY2thZ2UgcmVxdWlyZXMgYSBuYW1lLlwiKVxuICAgIH1cblxuICAgIGlmICghcGF0aCAmJiAhdXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZlbG9jaW91cyBwYWNrYWdlIFwiJHtuYW1lfVwiIHJlcXVpcmVzIGEgXCJwYXRoXCIgb3IgYSBcInVybFwiICh1c3VhbGx5IGltcG9ydC5tZXRhLnVybCkuYClcbiAgICB9XG5cbiAgICB0aGlzLl9uYW1lID0gbmFtZVxuICAgIHRoaXMuX3BhdGggPSBwYXRoIHx8IFZlbG9jaW91c1BhY2thZ2UuX2RpcmVjdG9yeUZyb21VcmwoLyoqIEB0eXBlIHtzdHJpbmd9ICovICh1cmwpKVxuICAgIHRoaXMuX21vZGVsc1BhdGggPSBtb2RlbHNQYXRoXG4gICAgdGhpcy5fcmVzb3VyY2VzUGF0aCA9IHJlc291cmNlc1BhdGhcbiAgICB0aGlzLl9taWdyYXRpb25zUGF0aCA9IG1pZ3JhdGlvbnNQYXRoXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcGFja2FnZSBuYW1lLlxuICAgKi9cbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHBhdGguXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHBhY2thZ2Ugcm9vdCBkaXJlY3RvcnkgKHRoZSBvbmUgdGhhdCBjb250YWlucyBgc3JjYCkuXG4gICAqL1xuICBnZXRQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXRoXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgbW9kZWxzIHBhdGguXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHBhY2thZ2UncyBtb2RlbHMgZGlyZWN0b3J5LlxuICAgKi9cbiAgZ2V0TW9kZWxzUGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZWxzUGF0aCB8fCBgJHt0aGlzLl9wYXRofS9zcmMvbW9kZWxzYFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHJlc291cmNlcyBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBwYWNrYWdlJ3MgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzIGRpcmVjdG9yeS5cbiAgICovXG4gIGdldFJlc291cmNlc1BhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlc1BhdGggfHwgYCR7dGhpcy5fcGF0aH0vc3JjL3Jlc291cmNlc2BcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBtaWdyYXRpb25zIHBhdGguXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHBhY2thZ2UncyBtaWdyYXRpb25zIGRpcmVjdG9yeS5cbiAgICovXG4gIGdldE1pZ3JhdGlvbnNQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLl9taWdyYXRpb25zUGF0aCB8fCBgJHt0aGlzLl9wYXRofS9zcmMvZGF0YWJhc2UvbWlncmF0aW9uc2BcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmVzIHRoZSBpbnRlcm5hbCBiYWNrZW5kLXByb2plY3QgZW50cnkgdGhlIGZyYW1ld29yayBhcHBlbmRzIHNvIHRoZVxuICAgKiBleGlzdGluZyByZXNvdXJjZS1kaXNjb3ZlcnkgKyBmcm9udGVuZC1tb2RlbCBnZW5lcmF0aW9uIG1hY2hpbmVyeSBwaWNrcyB1cFxuICAgKiB0aGlzIHBhY2thZ2UuIEdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbHMgYXJlIHdyaXR0ZW4gdG8gdGhlIGFwcCdzIG91dHB1dC5cbiAgICogQHBhcmFtIHt7ZnJvbnRlbmRNb2RlbHNPdXRwdXRQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWR9fSBhcmdzIC0gVGhlIGFwcCdzIGZyb250ZW5kLW1vZGVscyBvdXRwdXQgcGF0aC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9ufSAtIFRoZSBkZXJpdmVkIGJhY2tlbmQgcHJvamVjdC5cbiAgICovXG4gIHRvQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uKHtmcm9udGVuZE1vZGVsc091dHB1dFBhdGh9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb250ZW5kTW9kZWxzT3V0cHV0UGF0aCxcbiAgICAgIHBhdGg6IHRoaXMuZ2V0UGF0aCgpLFxuICAgICAgcmVzb3VyY2VzUGF0aDogdGhpcy5nZXRSZXNvdXJjZXNQYXRoKClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
export type SyncCursor = {
|
|
2
|
+
id: string | null;
|
|
3
|
+
serverSequence: number | null;
|
|
4
|
+
updatedAt: string;
|
|
5
|
+
} | null;
|
|
6
|
+
export type SyncChangeEnvelope = {
|
|
7
|
+
/**
|
|
8
|
+
* - Sync data payload.
|
|
9
|
+
*/
|
|
10
|
+
data: () => unknown;
|
|
11
|
+
/**
|
|
12
|
+
* - Sync row identifier.
|
|
13
|
+
*/
|
|
14
|
+
id: () => unknown;
|
|
15
|
+
/**
|
|
16
|
+
* - Resource identifier.
|
|
17
|
+
*/
|
|
18
|
+
resourceId: () => unknown;
|
|
19
|
+
/**
|
|
20
|
+
* - Resource type name.
|
|
21
|
+
*/
|
|
22
|
+
resourceType: () => string | null;
|
|
23
|
+
/**
|
|
24
|
+
* - Sync operation type.
|
|
25
|
+
*/
|
|
26
|
+
syncType: () => string;
|
|
27
|
+
};
|
|
28
|
+
export type SyncChangeApplyResult = {
|
|
29
|
+
/**
|
|
30
|
+
* - Whether the local store changed.
|
|
31
|
+
*/
|
|
32
|
+
changed: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* - Applied resource type override.
|
|
35
|
+
*/
|
|
36
|
+
resourceType?: string | null | undefined;
|
|
37
|
+
};
|
|
38
|
+
export type SyncResourceConfig = {
|
|
39
|
+
/**
|
|
40
|
+
* - Optional post-save hook.
|
|
41
|
+
*/
|
|
42
|
+
afterApply?: ((args: {
|
|
43
|
+
attributes: Record<string, unknown>;
|
|
44
|
+
data: Record<string, unknown>;
|
|
45
|
+
record: unknown;
|
|
46
|
+
sync: SyncChangeEnvelope;
|
|
47
|
+
}) => Promise<boolean | void> | boolean | void) | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* - Allowed attributes builder.
|
|
50
|
+
*/
|
|
51
|
+
attributes: (args: {
|
|
52
|
+
data: Record<string, unknown>;
|
|
53
|
+
record: unknown;
|
|
54
|
+
sync: SyncChangeEnvelope;
|
|
55
|
+
}) => Promise<Record<string, unknown>> | Record<string, unknown>;
|
|
56
|
+
/**
|
|
57
|
+
* - Whether this resource is sync-enabled.
|
|
58
|
+
*/
|
|
59
|
+
enabled: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* - Optional upsert finder.
|
|
62
|
+
*/
|
|
63
|
+
findRecord?: ((args: {
|
|
64
|
+
data: Record<string, unknown>;
|
|
65
|
+
resourceId: unknown;
|
|
66
|
+
sync: SyncChangeEnvelope;
|
|
67
|
+
}) => Promise<unknown> | unknown) | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* - Optional destroy finder.
|
|
70
|
+
*/
|
|
71
|
+
findRecordForDelete?: ((args: {
|
|
72
|
+
resourceId: unknown;
|
|
73
|
+
sync: SyncChangeEnvelope;
|
|
74
|
+
}) => Promise<unknown> | unknown) | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* - Velocious model class.
|
|
77
|
+
*/
|
|
78
|
+
modelClass: unknown;
|
|
79
|
+
};
|
|
80
|
+
export type SyncChangesRequest = {
|
|
81
|
+
/**
|
|
82
|
+
* - Auth token.
|
|
83
|
+
*/
|
|
84
|
+
authenticationToken: string;
|
|
85
|
+
/**
|
|
86
|
+
* - Last seen row id.
|
|
87
|
+
*/
|
|
88
|
+
afterId?: string | null | undefined;
|
|
89
|
+
/**
|
|
90
|
+
* - Last seen server sequence.
|
|
91
|
+
*/
|
|
92
|
+
afterServerSequence?: number | undefined;
|
|
93
|
+
/**
|
|
94
|
+
* - Last seen timestamp.
|
|
95
|
+
*/
|
|
96
|
+
afterUpdatedAt?: string | undefined;
|
|
97
|
+
/**
|
|
98
|
+
* - Page size.
|
|
99
|
+
*/
|
|
100
|
+
limit: number;
|
|
101
|
+
/**
|
|
102
|
+
* - Snapshot upper-bound row id.
|
|
103
|
+
*/
|
|
104
|
+
upToId?: string | null | undefined;
|
|
105
|
+
/**
|
|
106
|
+
* - Snapshot upper-bound server sequence.
|
|
107
|
+
*/
|
|
108
|
+
upToServerSequence?: number | undefined;
|
|
109
|
+
/**
|
|
110
|
+
* - Snapshot upper-bound timestamp.
|
|
111
|
+
*/
|
|
112
|
+
upToUpdatedAt?: string | undefined;
|
|
113
|
+
};
|
|
114
|
+
export type SyncChangesResponse = {
|
|
115
|
+
/**
|
|
116
|
+
* - Error message.
|
|
117
|
+
*/
|
|
118
|
+
errorMessage?: string | undefined;
|
|
119
|
+
/**
|
|
120
|
+
* - Next cursor.
|
|
121
|
+
*/
|
|
122
|
+
nextCursor?: Record<string, any> | SyncCursor | undefined;
|
|
123
|
+
/**
|
|
124
|
+
* - Response status.
|
|
125
|
+
*/
|
|
126
|
+
status?: string | undefined;
|
|
127
|
+
/**
|
|
128
|
+
* - Sync rows.
|
|
129
|
+
*/
|
|
130
|
+
syncs?: unknown[] | undefined;
|
|
131
|
+
/**
|
|
132
|
+
* - Snapshot upper-bound cursor.
|
|
133
|
+
*/
|
|
134
|
+
upToCursor?: Record<string, any> | SyncCursor | undefined;
|
|
135
|
+
};
|
|
136
|
+
export type SyncChangesResult = {
|
|
137
|
+
/**
|
|
138
|
+
* - Whether any local record changed.
|
|
139
|
+
*/
|
|
140
|
+
changed: boolean;
|
|
141
|
+
/**
|
|
142
|
+
* - Applied page count.
|
|
143
|
+
*/
|
|
144
|
+
pages: number;
|
|
145
|
+
/**
|
|
146
|
+
* - Changed flags by resource type.
|
|
147
|
+
*/
|
|
148
|
+
resourceChanged: Record<string, boolean>;
|
|
149
|
+
/**
|
|
150
|
+
* - Applied counts by resource type.
|
|
151
|
+
*/
|
|
152
|
+
resourceCounts: Record<string, number>;
|
|
153
|
+
/**
|
|
154
|
+
* - Applied row count.
|
|
155
|
+
*/
|
|
156
|
+
syncedCount: number;
|
|
157
|
+
};
|
|
158
|
+
export type SyncReplayItem = {
|
|
159
|
+
/**
|
|
160
|
+
* - Sync id.
|
|
161
|
+
*/
|
|
162
|
+
id: string | number;
|
|
163
|
+
/**
|
|
164
|
+
* - Replay state.
|
|
165
|
+
*/
|
|
166
|
+
syncState: string;
|
|
167
|
+
};
|
|
168
|
+
export type SyncReplayResponse = {
|
|
169
|
+
/**
|
|
170
|
+
* - Error message.
|
|
171
|
+
*/
|
|
172
|
+
errorMessage?: string | undefined;
|
|
173
|
+
/**
|
|
174
|
+
* - Response status.
|
|
175
|
+
*/
|
|
176
|
+
status?: string | undefined;
|
|
177
|
+
/**
|
|
178
|
+
* - Replay results.
|
|
179
|
+
*/
|
|
180
|
+
syncs?: SyncReplayItem[] | undefined;
|
|
181
|
+
};
|
|
182
|
+
//# sourceMappingURL=sync-api-client-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-api-client-types.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-api-client-types.js"],"names":[],"mappings":"yBAMc;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAC,GAAG,IAAI;;;;;UAI5E,MAAM,OAAO;;;;QACb,MAAM,OAAO;;;;gBACb,MAAM,OAAO;;;;kBACb,MAAM,MAAM,GAAG,IAAI;;;;cACnB,MAAM,MAAM;;;;;;aAKZ,OAAO;;;;;;;;;;yBAMA;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,MAAM,EAAE,OAAC,CAAC;QAAC,IAAI,EAAE,kBAAkB,CAAA;KAAC,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,IAAI;;;;gBAC7J,CAAC,IAAI,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,MAAM,EAAE,OAAC,CAAC;QAAC,IAAI,EAAE,kBAAkB,CAAA;KAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;aAC1I,OAAO;;;;yBACA;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,kBAAkB,CAAA;KAAC,KAAK,OAAO,CAAC,OAAC,CAAC,GAAG,OAAC;;;;kCACjG;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,kBAAkB,CAAA;KAAC,KAAK,OAAO,CAAC,OAAC,CAAC,GAAG,OAAC;;;;gBACzE,OAAC;;;;;;yBAKD,MAAM;;;;;;;;;;;;;;;;WAIN,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAiBN,OAAO;;;;WACP,MAAM;;;;qBACN,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;oBACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;;iBACtB,MAAM;;;;;;QAKN,MAAM,GAAG,MAAM;;;;eACf,MAAM"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
export {};
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1hcGktY2xpZW50LXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1hcGktY2xpZW50LXR5cGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAbW9kdWxlIHN5bmMtYXBpLWNsaWVudC10eXBlc1xuICovXG5cbi8qKiBAdHlwZWRlZiB7e2lkOiBzdHJpbmcgfCBudWxsLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbH0gU3luY0N1cnNvciAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDaGFuZ2VFbnZlbG9wZVxuICogQHByb3BlcnR5IHsoKSA9PiB1bmtub3dufSBkYXRhIC0gU3luYyBkYXRhIHBheWxvYWQuXG4gKiBAcHJvcGVydHkgeygpID0+IHVua25vd259IGlkIC0gU3luYyByb3cgaWRlbnRpZmllci5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdW5rbm93bn0gcmVzb3VyY2VJZCAtIFJlc291cmNlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZyB8IG51bGx9IHJlc291cmNlVHlwZSAtIFJlc291cmNlIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBzeW5jVHlwZSAtIFN5bmMgb3BlcmF0aW9uIHR5cGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jQ2hhbmdlQXBwbHlSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2hhbmdlZCAtIFdoZXRoZXIgdGhlIGxvY2FsIHN0b3JlIGNoYW5nZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IFtyZXNvdXJjZVR5cGVdIC0gQXBwbGllZCByZXNvdXJjZSB0eXBlIG92ZXJyaWRlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1Jlc291cmNlQ29uZmlnXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7YXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByZWNvcmQ6ID8sIHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZX0pID0+IFByb21pc2U8Ym9vbGVhbiB8IHZvaWQ+IHwgYm9vbGVhbiB8IHZvaWR9IFthZnRlckFwcGx5XSAtIE9wdGlvbmFsIHBvc3Qtc2F2ZSBob29rLlxuICogQHByb3BlcnR5IHsoYXJnczoge2RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByZWNvcmQ6ID8sIHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZX0pID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IGF0dHJpYnV0ZXMgLSBBbGxvd2VkIGF0dHJpYnV0ZXMgYnVpbGRlci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhpcyByZXNvdXJjZSBpcyBzeW5jLWVuYWJsZWQuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7ZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJlc291cmNlSWQ6IHVua25vd24sIHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZX0pID0+IFByb21pc2U8Pz4gfCA/fSBbZmluZFJlY29yZF0gLSBPcHRpb25hbCB1cHNlcnQgZmluZGVyLlxuICogQHByb3BlcnR5IHsoYXJnczoge3Jlc291cmNlSWQ6IHVua25vd24sIHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZX0pID0+IFByb21pc2U8Pz4gfCA/fSBbZmluZFJlY29yZEZvckRlbGV0ZV0gLSBPcHRpb25hbCBkZXN0cm95IGZpbmRlci5cbiAqIEBwcm9wZXJ0eSB7P30gbW9kZWxDbGFzcyAtIFZlbG9jaW91cyBtb2RlbCBjbGFzcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDaGFuZ2VzUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF1dGhlbnRpY2F0aW9uVG9rZW4gLSBBdXRoIHRva2VuLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBbYWZ0ZXJJZF0gLSBMYXN0IHNlZW4gcm93IGlkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFthZnRlclNlcnZlclNlcXVlbmNlXSAtIExhc3Qgc2VlbiBzZXJ2ZXIgc2VxdWVuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FmdGVyVXBkYXRlZEF0XSAtIExhc3Qgc2VlbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGltaXQgLSBQYWdlIHNpemUuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IFt1cFRvSWRdIC0gU25hcHNob3QgdXBwZXItYm91bmQgcm93IGlkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt1cFRvU2VydmVyU2VxdWVuY2VdIC0gU25hcHNob3QgdXBwZXItYm91bmQgc2VydmVyIHNlcXVlbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1cFRvVXBkYXRlZEF0XSAtIFNuYXBzaG90IHVwcGVyLWJvdW5kIHRpbWVzdGFtcC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDaGFuZ2VzUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXJyb3JNZXNzYWdlXSAtIEVycm9yIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge1N5bmNDdXJzb3IgfCBSZWNvcmQ8c3RyaW5nLCA/Pn0gW25leHRDdXJzb3JdIC0gTmV4dCBjdXJzb3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N0YXR1c10gLSBSZXNwb25zZSBzdGF0dXMuXG4gKiBAcHJvcGVydHkge0FycmF5PHVua25vd24+fSBbc3luY3NdIC0gU3luYyByb3dzLlxuICogQHByb3BlcnR5IHtTeW5jQ3Vyc29yIHwgUmVjb3JkPHN0cmluZywgPz59IFt1cFRvQ3Vyc29yXSAtIFNuYXBzaG90IHVwcGVyLWJvdW5kIGN1cnNvci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDaGFuZ2VzUmVzdWx0XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNoYW5nZWQgLSBXaGV0aGVyIGFueSBsb2NhbCByZWNvcmQgY2hhbmdlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwYWdlcyAtIEFwcGxpZWQgcGFnZSBjb3VudC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYm9vbGVhbj59IHJlc291cmNlQ2hhbmdlZCAtIENoYW5nZWQgZmxhZ3MgYnkgcmVzb3VyY2UgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gcmVzb3VyY2VDb3VudHMgLSBBcHBsaWVkIGNvdW50cyBieSByZXNvdXJjZSB0eXBlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN5bmNlZENvdW50IC0gQXBwbGllZCByb3cgY291bnQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUmVwbGF5SXRlbVxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gU3luYyBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzeW5jU3RhdGUgLSBSZXBsYXkgc3RhdGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUmVwbGF5UmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXJyb3JNZXNzYWdlXSAtIEVycm9yIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N0YXR1c10gLSBSZXNwb25zZSBzdGF0dXMuXG4gKiBAcHJvcGVydHkge0FycmF5PFN5bmNSZXBsYXlJdGVtPn0gW3N5bmNzXSAtIFJlcGxheSByZXN1bHRzLlxuICovXG5cbmV4cG9ydCB7fVxuIl19
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/** @typedef {import("./sync-api-client-types.js").SyncChangeApplyResult} SyncChangeApplyResult */
|
|
2
|
+
/** @typedef {import("./sync-api-client-types.js").SyncChangeEnvelope} SyncChangeEnvelope */
|
|
3
|
+
/** @typedef {import("./sync-api-client-types.js").SyncChangesRequest} SyncChangesRequest */
|
|
4
|
+
/** @typedef {import("./sync-api-client-types.js").SyncChangesResponse} SyncChangesResponse */
|
|
5
|
+
/** @typedef {import("./sync-api-client-types.js").SyncChangesResult} SyncChangesResult */
|
|
6
|
+
/** @typedef {import("./sync-api-client-types.js").SyncCursor} SyncCursor */
|
|
7
|
+
/** @typedef {import("./sync-api-client-types.js").SyncReplayItem} SyncReplayItem */
|
|
8
|
+
/** @typedef {import("./sync-api-client-types.js").SyncReplayResponse} SyncReplayResponse */
|
|
9
|
+
/** @typedef {import("./sync-api-client-types.js").SyncResourceConfig} SyncResourceConfig */
|
|
10
|
+
/**
|
|
11
|
+
* Generic client-side helper for replaying pending sync envelopes through the
|
|
12
|
+
* framework-owned `/velocious/sync/replay` endpoint. Apps provide only local
|
|
13
|
+
* persistence/auth hooks.
|
|
14
|
+
*/
|
|
15
|
+
export default class SyncApiClient {
|
|
16
|
+
/**
|
|
17
|
+
* Pulls backend sync changes in stable pages, applies them locally, and stores
|
|
18
|
+
* the acknowledged cursor. Apps provide only auth, persistence, transport, and
|
|
19
|
+
* resource policy hooks.
|
|
20
|
+
* @param {object} args - Pull args.
|
|
21
|
+
* @param {string} args.authenticationToken - Auth token to send with change requests.
|
|
22
|
+
* @param {number} [args.batchSize] - Max syncs per request. Defaults to 100.
|
|
23
|
+
* @param {() => Promise<SyncCursor | string | null | undefined>} args.loadCursor - Loads the persisted local cursor.
|
|
24
|
+
* @param {(cursor: SyncCursor) => Promise<void>} args.saveCursor - Persists the final acknowledged cursor.
|
|
25
|
+
* @param {(payload: SyncChangesRequest) => Promise<SyncChangesResponse>} args.postChanges - Posts one changes request.
|
|
26
|
+
* @param {(sync: SyncChangeEnvelope) => Promise<SyncChangeApplyResult>} args.applySync - Applies one normalized sync row locally.
|
|
27
|
+
* @param {(progress: {pages: number, syncedCount: number}) => void} [args.onProgress] - Progress callback.
|
|
28
|
+
* @returns {Promise<SyncChangesResult>} Pull result.
|
|
29
|
+
*/
|
|
30
|
+
static pullChanges(args: {
|
|
31
|
+
authenticationToken: string;
|
|
32
|
+
batchSize?: number | undefined;
|
|
33
|
+
loadCursor: () => Promise<SyncCursor | string | null | undefined>;
|
|
34
|
+
saveCursor: (cursor: SyncCursor) => Promise<void>;
|
|
35
|
+
postChanges: (payload: SyncChangesRequest) => Promise<SyncChangesResponse>;
|
|
36
|
+
applySync: (sync: SyncChangeEnvelope) => Promise<SyncChangeApplyResult>;
|
|
37
|
+
onProgress?: ((progress: {
|
|
38
|
+
pages: number;
|
|
39
|
+
syncedCount: number;
|
|
40
|
+
}) => void) | undefined;
|
|
41
|
+
}): Promise<SyncChangesResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Fetches and validates one backend sync changes page.
|
|
44
|
+
* @param {object} args - Page args.
|
|
45
|
+
* @param {SyncCursor} args.afterCursor - Last acknowledged cursor.
|
|
46
|
+
* @param {string} args.authenticationToken - Auth token.
|
|
47
|
+
* @param {number} args.batchSize - Page size.
|
|
48
|
+
* @param {(payload: SyncChangesRequest) => Promise<SyncChangesResponse>} args.postChanges - Changes poster.
|
|
49
|
+
* @param {SyncCursor} args.upToCursor - Snapshot upper-bound cursor.
|
|
50
|
+
* @returns {Promise<{nextCursor: SyncCursor, syncs: SyncChangeEnvelope[], upToCursor: SyncCursor}>} Normalized changes page.
|
|
51
|
+
*/
|
|
52
|
+
static changesPage({ afterCursor, authenticationToken, batchSize, postChanges, upToCursor }: {
|
|
53
|
+
afterCursor: SyncCursor;
|
|
54
|
+
authenticationToken: string;
|
|
55
|
+
batchSize: number;
|
|
56
|
+
postChanges: (payload: SyncChangesRequest) => Promise<SyncChangesResponse>;
|
|
57
|
+
upToCursor: SyncCursor;
|
|
58
|
+
}): Promise<{
|
|
59
|
+
nextCursor: SyncCursor;
|
|
60
|
+
syncs: SyncChangeEnvelope[];
|
|
61
|
+
upToCursor: SyncCursor;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Checks API response status and shape for change-feed pulls.
|
|
65
|
+
* @param {SyncChangesResponse} response - Changes response.
|
|
66
|
+
* @returns {void}
|
|
67
|
+
*/
|
|
68
|
+
static ensureSuccessfulChangesResponse(response: SyncChangesResponse): void;
|
|
69
|
+
/**
|
|
70
|
+
* Converts a cursor into request params with the given prefix.
|
|
71
|
+
* @param {"after" | "upTo"} prefix - Request field prefix.
|
|
72
|
+
* @param {SyncCursor} cursor - Cursor to serialize.
|
|
73
|
+
* @returns {Record<string, string | number | null>} Request params.
|
|
74
|
+
*/
|
|
75
|
+
static cursorPayload(prefix: "after" | "upTo", cursor: SyncCursor): Record<string, string | number | null>;
|
|
76
|
+
/**
|
|
77
|
+
* Parses a persisted or response cursor payload.
|
|
78
|
+
* @param {SyncCursor | string | Record<string, ?> | null | undefined} payload - Cursor payload.
|
|
79
|
+
* @returns {SyncCursor} Parsed cursor.
|
|
80
|
+
*/
|
|
81
|
+
static syncCursorFromPayload(payload: SyncCursor | string | Record<string, unknown> | null | undefined): SyncCursor;
|
|
82
|
+
/**
|
|
83
|
+
* Builds a normalized sync row adapter.
|
|
84
|
+
* @param {?} payload - Raw sync payload.
|
|
85
|
+
* @returns {SyncChangeEnvelope} Sync row adapter.
|
|
86
|
+
*/
|
|
87
|
+
static syncEnvelopeFromPayload(payload: unknown): SyncChangeEnvelope;
|
|
88
|
+
/**
|
|
89
|
+
* Builds an app-configured resource applier for pulled sync rows. The sync
|
|
90
|
+
* mechanics stay here; apps only declare which models/attributes/hooks are
|
|
91
|
+
* allowed for each resource type.
|
|
92
|
+
* @param {Record<string, SyncResourceConfig>} resources - Resource policy map.
|
|
93
|
+
* @returns {(sync: SyncChangeEnvelope) => Promise<SyncChangeApplyResult>} Sync apply callback.
|
|
94
|
+
*/
|
|
95
|
+
static resourceApplier(resources: Record<string, SyncResourceConfig>): (sync: SyncChangeEnvelope) => Promise<SyncChangeApplyResult>;
|
|
96
|
+
/**
|
|
97
|
+
* Applies one sync row using declarative resource policy.
|
|
98
|
+
* @param {{resources: Record<string, SyncResourceConfig>, sync: SyncChangeEnvelope}} args - Apply args.
|
|
99
|
+
* @returns {Promise<SyncChangeApplyResult>} Apply result.
|
|
100
|
+
*/
|
|
101
|
+
static applyResourceSync({ resources, sync }: {
|
|
102
|
+
resources: Record<string, SyncResourceConfig>;
|
|
103
|
+
sync: SyncChangeEnvelope;
|
|
104
|
+
}): Promise<SyncChangeApplyResult>;
|
|
105
|
+
/**
|
|
106
|
+
* Destroys a synced resource via its declared model policy.
|
|
107
|
+
* @param {{resource: SyncResourceConfig, sync: SyncChangeEnvelope}} args - Destroy args.
|
|
108
|
+
* @returns {Promise<boolean>} Whether a local row was destroyed.
|
|
109
|
+
*/
|
|
110
|
+
static destroySyncedResource({ resource, sync }: {
|
|
111
|
+
resource: SyncResourceConfig;
|
|
112
|
+
sync: SyncChangeEnvelope;
|
|
113
|
+
}): Promise<boolean>;
|
|
114
|
+
/**
|
|
115
|
+
* Parses the embedded sync data JSON/object.
|
|
116
|
+
* @param {SyncChangeEnvelope} sync - Sync row.
|
|
117
|
+
* @returns {Record<string, unknown>} Sync data object.
|
|
118
|
+
*/
|
|
119
|
+
static syncData(sync: SyncChangeEnvelope): Record<string, unknown>;
|
|
120
|
+
/**
|
|
121
|
+
* Drains pending sync records in stable order and marks acknowledged rows.
|
|
122
|
+
* @param {object} args - Replay args.
|
|
123
|
+
* @param {string} args.authenticationToken - Auth token to send with replay requests.
|
|
124
|
+
* @param {number} [args.batchSize] - Max syncs per request. Defaults to 100.
|
|
125
|
+
* @param {() => Promise<Array<unknown>>} args.pendingSyncs - Loads pending local sync rows in replay order.
|
|
126
|
+
* @param {(sync: unknown) => string | number | null | undefined} args.syncId - Returns the local sync id.
|
|
127
|
+
* @param {(sync: unknown) => Record<string, ?>} args.syncPayload - Builds the API sync envelope.
|
|
128
|
+
* @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ?>>}) => Promise<SyncReplayResponse>} args.postReplay - Posts one replay request.
|
|
129
|
+
* @param {(sync: unknown, response: SyncReplayItem) => Promise<void>} args.markSuccessful - Marks one sync as successful locally.
|
|
130
|
+
* @returns {Promise<void>} Resolves after all batches are replayed.
|
|
131
|
+
*/
|
|
132
|
+
static replayPending(args: {
|
|
133
|
+
authenticationToken: string;
|
|
134
|
+
batchSize?: number | undefined;
|
|
135
|
+
pendingSyncs: () => Promise<Array<unknown>>;
|
|
136
|
+
syncId: (sync: unknown) => string | number | null | undefined;
|
|
137
|
+
syncPayload: (sync: unknown) => Record<string, unknown>;
|
|
138
|
+
postReplay: (payload: {
|
|
139
|
+
authenticationToken: string;
|
|
140
|
+
syncs: Array<Record<string, unknown>>;
|
|
141
|
+
}) => Promise<SyncReplayResponse>;
|
|
142
|
+
markSuccessful: (sync: unknown, response: SyncReplayItem) => Promise<void>;
|
|
143
|
+
}): Promise<void>;
|
|
144
|
+
/**
|
|
145
|
+
* Replays one batch of syncs.
|
|
146
|
+
* @param {object} args - Replay args.
|
|
147
|
+
* @param {string} args.authenticationToken - Auth token.
|
|
148
|
+
* @param {Array<unknown>} args.pendingSyncs - Batch syncs.
|
|
149
|
+
* @param {(sync: unknown) => string | number | null | undefined} args.syncId - Sync id getter.
|
|
150
|
+
* @param {(sync: unknown) => Record<string, ?>} args.syncPayload - Payload builder.
|
|
151
|
+
* @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ?>>}) => Promise<SyncReplayResponse>} args.postReplay - Replay poster.
|
|
152
|
+
* @param {(sync: unknown, response: SyncReplayItem) => Promise<void>} args.markSuccessful - Success hook.
|
|
153
|
+
* @returns {Promise<void>} Resolves after the batch is acknowledged.
|
|
154
|
+
*/
|
|
155
|
+
static replayBatch(args: {
|
|
156
|
+
authenticationToken: string;
|
|
157
|
+
pendingSyncs: Array<unknown>;
|
|
158
|
+
syncId: (sync: unknown) => string | number | null | undefined;
|
|
159
|
+
syncPayload: (sync: unknown) => Record<string, unknown>;
|
|
160
|
+
postReplay: (payload: {
|
|
161
|
+
authenticationToken: string;
|
|
162
|
+
syncs: Array<Record<string, unknown>>;
|
|
163
|
+
}) => Promise<SyncReplayResponse>;
|
|
164
|
+
markSuccessful: (sync: unknown, response: SyncReplayItem) => Promise<void>;
|
|
165
|
+
}): Promise<void>;
|
|
166
|
+
/**
|
|
167
|
+
* Checks API response status and shape.
|
|
168
|
+
* @param {SyncReplayResponse} response - Replay response.
|
|
169
|
+
* @returns {void}
|
|
170
|
+
*/
|
|
171
|
+
static ensureSuccessfulResponse(response: SyncReplayResponse): void;
|
|
172
|
+
/**
|
|
173
|
+
* Normalizes a positive batch size.
|
|
174
|
+
* @param {number | undefined} batchSize - Batch size.
|
|
175
|
+
* @returns {number} Positive batch size.
|
|
176
|
+
*/
|
|
177
|
+
static normalizedBatchSize(batchSize: number | undefined): number;
|
|
178
|
+
}
|
|
179
|
+
export type SyncChangeApplyResult = import("./sync-api-client-types.js").SyncChangeApplyResult;
|
|
180
|
+
export type SyncChangeEnvelope = import("./sync-api-client-types.js").SyncChangeEnvelope;
|
|
181
|
+
export type SyncChangesRequest = import("./sync-api-client-types.js").SyncChangesRequest;
|
|
182
|
+
export type SyncChangesResponse = import("./sync-api-client-types.js").SyncChangesResponse;
|
|
183
|
+
export type SyncChangesResult = import("./sync-api-client-types.js").SyncChangesResult;
|
|
184
|
+
export type SyncCursor = import("./sync-api-client-types.js").SyncCursor;
|
|
185
|
+
export type SyncReplayItem = import("./sync-api-client-types.js").SyncReplayItem;
|
|
186
|
+
export type SyncReplayResponse = import("./sync-api-client-types.js").SyncReplayResponse;
|
|
187
|
+
export type SyncResourceConfig = import("./sync-api-client-types.js").SyncResourceConfig;
|
|
188
|
+
//# sourceMappingURL=sync-api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-api-client.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-api-client.js"],"names":[],"mappings":"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"}
|