velocious 1.0.474 → 1.0.475
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 +7 -2
- package/build/configuration-types.js +38 -1
- package/build/configuration.js +41 -1
- package/build/database/drivers/base.js +51 -3
- package/build/database/drivers/mysql/index.js +74 -7
- package/build/database/drivers/sqlite/connection-sql-js.js +16 -5
- package/build/database/drivers/sqlite/index.web.js +29 -15
- package/build/database/drivers/sqlite/web-persistence.js +521 -0
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +63 -0
- package/build/frontend-model-controller.js +127 -4
- package/build/frontend-model-resource/base-resource.js +5 -1
- package/build/frontend-models/base.js +146 -2
- package/build/frontend-models/query.js +3 -3
- package/build/frontend-models/resource-definition.js +304 -2
- package/build/routes/hooks/frontend-model-command-route-hook.js +8 -0
- package/build/src/configuration-types.d.ts +113 -2
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +35 -2
- package/build/src/configuration.d.ts +18 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +37 -2
- package/build/src/database/drivers/base.d.ts +30 -0
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +47 -4
- package/build/src/database/drivers/mysql/index.d.ts +32 -3
- package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.js +65 -7
- package/build/src/database/drivers/sqlite/connection-sql-js.d.ts +8 -1
- package/build/src/database/drivers/sqlite/connection-sql-js.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/connection-sql-js.js +15 -6
- package/build/src/database/drivers/sqlite/index.web.d.ts +5 -5
- package/build/src/database/drivers/sqlite/index.web.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.web.js +27 -13
- package/build/src/database/drivers/sqlite/web-persistence.d.ts +77 -0
- package/build/src/database/drivers/sqlite/web-persistence.d.ts.map +1 -0
- package/build/src/database/drivers/sqlite/web-persistence.js +464 -0
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +30 -0
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +53 -1
- package/build/src/frontend-model-controller.d.ts +34 -0
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +113 -5
- package/build/src/frontend-model-resource/base-resource.d.ts +4 -2
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +7 -2
- package/build/src/frontend-models/base.d.ts +29 -0
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +131 -3
- package/build/src/frontend-models/query.js +4 -4
- package/build/src/frontend-models/resource-definition.d.ts +6 -0
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +272 -3
- package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts.map +1 -1
- package/build/src/routes/hooks/frontend-model-command-route-hook.js +8 -1
- package/build/src/sync/device-identity.d.ts +240 -0
- package/build/src/sync/device-identity.d.ts.map +1 -0
- package/build/src/sync/device-identity.js +454 -0
- package/build/src/sync/local-mutation-log.d.ts +212 -0
- package/build/src/sync/local-mutation-log.d.ts.map +1 -0
- package/build/src/sync/local-mutation-log.js +404 -0
- package/build/src/sync/offline-grant.d.ts +157 -0
- package/build/src/sync/offline-grant.d.ts.map +1 -0
- package/build/src/sync/offline-grant.js +292 -0
- package/build/sync/device-identity.js +503 -0
- package/build/sync/local-mutation-log.js +448 -0
- package/build/sync/offline-grant.js +327 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/configuration-types.js +38 -1
- package/src/configuration.js +41 -1
- package/src/database/drivers/base.js +51 -3
- package/src/database/drivers/mysql/index.js +74 -7
- package/src/database/drivers/sqlite/connection-sql-js.js +16 -5
- package/src/database/drivers/sqlite/index.web.js +29 -15
- package/src/database/drivers/sqlite/web-persistence.js +521 -0
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +63 -0
- package/src/frontend-model-controller.js +127 -4
- package/src/frontend-model-resource/base-resource.js +5 -1
- package/src/frontend-models/base.js +146 -2
- package/src/frontend-models/query.js +3 -3
- package/src/frontend-models/resource-definition.js +304 -2
- package/src/routes/hooks/frontend-model-command-route-hook.js +8 -0
- package/src/sync/device-identity.js +503 -0
- package/src/sync/local-mutation-log.js +448 -0
- package/src/sync/offline-grant.js +327 -0
|
@@ -13,6 +13,13 @@ const FRONTEND_MODEL_CONTROLLER_PATH = new URL("../../frontend-model-controller.
|
|
|
13
13
|
*/
|
|
14
14
|
export default async function frontendModelCommandRouteHook({ configuration, currentPath, hasMatchingCustomRoute }) {
|
|
15
15
|
const normalizedCurrentPath = normalizePath(currentPath);
|
|
16
|
+
if (normalizedCurrentPath === "/frontend-models/sync/bootstrap") {
|
|
17
|
+
return {
|
|
18
|
+
action: "frontend-sync-bootstrap",
|
|
19
|
+
controller: "velocious/api",
|
|
20
|
+
controllerPath: FRONTEND_MODEL_CONTROLLER_PATH
|
|
21
|
+
};
|
|
22
|
+
}
|
|
16
23
|
if (normalizedCurrentPath === SHARED_FRONTEND_MODEL_API_PATH) {
|
|
17
24
|
return {
|
|
18
25
|
action: "frontend-api",
|
|
@@ -84,4 +91,4 @@ function normalizePath(path) {
|
|
|
84
91
|
}
|
|
85
92
|
return withLeadingSlash;
|
|
86
93
|
}
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWwtY29tbWFuZC1yb3V0ZS1ob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JvdXRlcy9ob29rcy9mcm9udGVuZC1tb2RlbC1jb21tYW5kLXJvdXRlLWhvb2suanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxtREFBbUQsRUFBQyxNQUFNLDZDQUE2QyxDQUFBO0FBQy9HLE9BQU8sRUFBQyw2QkFBNkIsRUFBRSxpQ0FBaUMsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLDhDQUE4QyxDQUFBO0FBRXhKLE1BQU0sOEJBQThCLEdBQUcsa0JBQWtCLENBQUE7QUFDekQsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxvQ0FBb0MsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUUxRzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsNkJBQTZCLENBQUMsRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFDO0lBQzlHLE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRXhELElBQUkscUJBQXFCLEtBQUssaUNBQWlDLEVBQUUsQ0FBQztRQUNoRSxPQUFPO1lBQ0wsTUFBTSxFQUFFLHlCQUF5QjtZQUNqQyxVQUFVLEVBQUUsZUFBZTtZQUMzQixjQUFjLEVBQUUsOEJBQThCO1NBQy9DLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxxQkFBcUIsS0FBSyw4QkFBOEIsRUFBRSxDQUFDO1FBQzdELE9BQU87WUFDTCxNQUFNLEVBQUUsY0FBYztZQUN0QixVQUFVLEVBQUUsZUFBZTtZQUMzQixjQUFjLEVBQUUsOEJBQThCO1NBQy9DLENBQUE7SUFDSCxDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLElBQUksc0JBQXNCO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFdkMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixFQUFFLENBQUE7SUFDMUQsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztRQUMzRCxlQUFlO1FBQ2YsV0FBVyxFQUFFLHFCQUFxQjtLQUNuQyxDQUFDLENBQUE7SUFFRixJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDdkI7O3VDQUUrQjtRQUMvQixNQUFNLE1BQU0sR0FBRztZQUNiLG9DQUFvQyxFQUFFLGtCQUFrQixDQUFDLFVBQVU7WUFDbkUsK0JBQStCLEVBQUUsa0JBQWtCLENBQUMsS0FBSztZQUN6RCxLQUFLLEVBQUUsa0JBQWtCLENBQUMsU0FBUztTQUNwQyxDQUFBO1FBRUQsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsRUFBRSxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQTtRQUN6QyxDQUFDO1FBRUQsT0FBTztZQUNMLE1BQU0sRUFBRSx5QkFBeUI7WUFDakMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUMvRCxjQUFjLEVBQUUsOEJBQThCO1lBQzlDLE1BQU07U0FDUCxDQUFBO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxjQUFjLElBQUksZUFBZSxFQUFFLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsbURBQW1ELENBQUMsY0FBYyxDQUFDLENBQUE7UUFFckYsS0FBSyxNQUFNLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNsQyxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMvQyxNQUFNLFlBQVksR0FBRyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtZQUM3RSxNQUFNLHNCQUFzQixHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUMxRCxNQUFNLGNBQWMsR0FBRyxHQUFHLHNCQUFzQixHQUFHLENBQUE7WUFFbkQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUM7Z0JBQUUsU0FBUTtZQUUvRCxNQUFNLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ3RFLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUTtZQUV2QyxNQUFNLE1BQU0sR0FBRyw2QkFBNkIsQ0FBQyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUMsQ0FBQyxDQUFBO1lBQzFGLElBQUksQ0FBQyxNQUFNO2dCQUFFLFNBQVE7WUFDckIsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUU3RCxPQUFPO2dCQUNMLE1BQU0sRUFBRSxZQUFZLE1BQU0sRUFBRTtnQkFDNUIsVUFBVTtnQkFDVixjQUFjLEVBQUUsOEJBQThCO2FBQy9DLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFJO0lBQ3pCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO0lBRWpFLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRUQsT0FBTyxnQkFBZ0IsQ0FBQTtBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZnJvbnRlbmRNb2RlbFJlc291cmNlc1dpdGhCdWlsdEluc0ZvckJhY2tlbmRQcm9qZWN0fSBmcm9tIFwiLi4vLi4vZnJvbnRlbmQtbW9kZWxzL2J1aWx0LWluLXJlc291cmNlcy5qc1wiXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxBY3Rpb25Gb3JDb21tYW5kLCBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZEZvclBhdGgsIGZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGh9IGZyb20gXCIuLi8uLi9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qc1wiXG5cbmNvbnN0IFNIQVJFRF9GUk9OVEVORF9NT0RFTF9BUElfUEFUSCA9IFwiL2Zyb250ZW5kLW1vZGVsc1wiXG5jb25zdCBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEggPSBuZXcgVVJMKFwiLi4vLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiLCBpbXBvcnQubWV0YS51cmwpLmhyZWZcblxuLyoqXG4gKiBSdW5zIGZyb250ZW5kIG1vZGVsIGNvbW1hbmQgcm91dGUgaG9vay5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gSG9vayBhcmdzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jdXJyZW50UGF0aCAtIFJlcXVlc3QgcGF0aCB3aXRob3V0IHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5oYXNNYXRjaGluZ0N1c3RvbVJvdXRlXSAtIFNldCB3aGVuIHRoZSByZXF1ZXN0IHBhdGggbWF0Y2hlcyBhbiBleHBsaWNpdCBjdXN0b20gcm91dGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlJvdXRlUmVzb2x2ZXJIb29rUmVzdWx0IHwgbnVsbD59IC0gUm91dGUgb3ZlcnJpZGUgb3IgbnVsbC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbENvbW1hbmRSb3V0ZUhvb2soe2NvbmZpZ3VyYXRpb24sIGN1cnJlbnRQYXRoLCBoYXNNYXRjaGluZ0N1c3RvbVJvdXRlfSkge1xuICBjb25zdCBub3JtYWxpemVkQ3VycmVudFBhdGggPSBub3JtYWxpemVQYXRoKGN1cnJlbnRQYXRoKVxuXG4gIGlmIChub3JtYWxpemVkQ3VycmVudFBhdGggPT09IFwiL2Zyb250ZW5kLW1vZGVscy9zeW5jL2Jvb3RzdHJhcFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJmcm9udGVuZC1zeW5jLWJvb3RzdHJhcFwiLFxuICAgICAgY29udHJvbGxlcjogXCJ2ZWxvY2lvdXMvYXBpXCIsXG4gICAgICBjb250cm9sbGVyUGF0aDogRlJPTlRFTkRfTU9ERUxfQ09OVFJPTExFUl9QQVRIXG4gICAgfVxuICB9XG5cbiAgaWYgKG5vcm1hbGl6ZWRDdXJyZW50UGF0aCA9PT0gU0hBUkVEX0ZST05URU5EX01PREVMX0FQSV9QQVRIKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJmcm9udGVuZC1hcGlcIixcbiAgICAgIGNvbnRyb2xsZXI6IFwidmVsb2Npb3VzL2FwaVwiLFxuICAgICAgY29udHJvbGxlclBhdGg6IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSFxuICAgIH1cbiAgfVxuXG4gIC8vIERvbid0IGludGVyY2VwdCBwYXRocyB0aGF0IG1hdGNoIGV4cGxpY2l0bHkgZGVmaW5lZCBjdXN0b20gcm91dGVzXG4gIGlmIChoYXNNYXRjaGluZ0N1c3RvbVJvdXRlKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGJhY2tlbmRQcm9qZWN0cyA9IGNvbmZpZ3VyYXRpb24uZ2V0QmFja2VuZFByb2plY3RzKClcbiAgY29uc3QgY3VzdG9tQ29tbWFuZE1hdGNoID0gZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRGb3JQYXRoKHtcbiAgICBiYWNrZW5kUHJvamVjdHMsXG4gICAgY3VycmVudFBhdGg6IG5vcm1hbGl6ZWRDdXJyZW50UGF0aFxuICB9KVxuXG4gIGlmIChjdXN0b21Db21tYW5kTWF0Y2gpIHtcbiAgICAvKipcbiAgICAgKiBQYXJhbXMuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kTWV0aG9kTmFtZTogY3VzdG9tQ29tbWFuZE1hdGNoLm1ldGhvZE5hbWUsXG4gICAgICBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZFNjb3BlOiBjdXN0b21Db21tYW5kTWF0Y2guc2NvcGUsXG4gICAgICBtb2RlbDogY3VzdG9tQ29tbWFuZE1hdGNoLm1vZGVsTmFtZVxuICAgIH1cblxuICAgIGlmIChjdXN0b21Db21tYW5kTWF0Y2gubWVtYmVySWQpIHtcbiAgICAgIHBhcmFtcy5pZCA9IGN1c3RvbUNvbW1hbmRNYXRjaC5tZW1iZXJJZFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZnJvbnRlbmQtY3VzdG9tLWNvbW1hbmRcIixcbiAgICAgIGNvbnRyb2xsZXI6IGN1c3RvbUNvbW1hbmRNYXRjaC5yZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLysvLCBcIlwiKSxcbiAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEgsXG4gICAgICBwYXJhbXNcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIGJhY2tlbmRQcm9qZWN0cykge1xuICAgIGNvbnN0IHJlc291cmNlcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZXNXaXRoQnVpbHRJbnNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcblxuICAgIGZvciAoY29uc3QgbW9kZWxOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgY29uc3QgcmVzb3VyY2VEZWZpbml0aW9uID0gcmVzb3VyY2VzW21vZGVsTmFtZV1cbiAgICAgIGNvbnN0IHJlc291cmNlUGF0aCA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGgobW9kZWxOYW1lLCByZXNvdXJjZURlZmluaXRpb24pXG4gICAgICBjb25zdCBub3JtYWxpemVkUmVzb3VyY2VQYXRoID0gbm9ybWFsaXplUGF0aChyZXNvdXJjZVBhdGgpXG4gICAgICBjb25zdCBleHBlY3RlZFByZWZpeCA9IGAke25vcm1hbGl6ZWRSZXNvdXJjZVBhdGh9L2BcblxuICAgICAgaWYgKCFub3JtYWxpemVkQ3VycmVudFBhdGguc3RhcnRzV2l0aChleHBlY3RlZFByZWZpeCkpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGNvbW1hbmROYW1lID0gbm9ybWFsaXplZEN1cnJlbnRQYXRoLnNsaWNlKGV4cGVjdGVkUHJlZml4Lmxlbmd0aClcbiAgICAgIGlmIChjb21tYW5kTmFtZS5pbmNsdWRlcyhcIi9cIikpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGFjdGlvbiA9IGZyb250ZW5kTW9kZWxBY3Rpb25Gb3JDb21tYW5kKHtjb21tYW5kTmFtZSwgbW9kZWxOYW1lLCByZXNvdXJjZURlZmluaXRpb259KVxuICAgICAgaWYgKCFhY3Rpb24pIGNvbnRpbnVlXG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbm9ybWFsaXplZFJlc291cmNlUGF0aC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdGlvbjogYGZyb250ZW5kLSR7YWN0aW9ufWAsXG4gICAgICAgIGNvbnRyb2xsZXIsXG4gICAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEhcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGggdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgcGF0aCB3aXRoIGxlYWRpbmcgc2xhc2ggYW5kIG5vIHRyYWlsaW5nIHNsYXNoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgY29uc3Qgd2l0aExlYWRpbmdTbGFzaCA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YFxuXG4gIGlmICh3aXRoTGVhZGluZ1NsYXNoLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gd2l0aExlYWRpbmdTbGFzaC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gIH1cblxuICByZXR1cm4gd2l0aExlYWRpbmdTbGFzaFxufVxuIl19
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Web Key used by the sync signing helpers.
|
|
3
|
+
* @typedef {JsonWebKey} SyncJsonWebKey
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Backend-signed device certificate payload.
|
|
7
|
+
* @typedef {object} DeviceCertificatePayload
|
|
8
|
+
* @property {string} actorDeviceId - Device id allowed to sign mutations.
|
|
9
|
+
* @property {string} actorUserId - User id represented by the device.
|
|
10
|
+
* @property {string} certificateId - Certificate id.
|
|
11
|
+
* @property {SyncJsonWebKey} devicePublicKey - Device public key peers/backends use to verify mutations.
|
|
12
|
+
* @property {string} expiresAt - ISO timestamp after which the certificate is invalid.
|
|
13
|
+
* @property {string} issuedAt - ISO timestamp when the backend issued the certificate.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Backend-signed device certificate envelope.
|
|
17
|
+
* @typedef {object} DeviceCertificate
|
|
18
|
+
* @property {"ECDSA-P256-SHA256"} algorithm - Signature algorithm.
|
|
19
|
+
* @property {DeviceCertificatePayload} certificate - Certificate payload.
|
|
20
|
+
* @property {string} signature - Backend signature over the certificate payload.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Sync mutation payload signed by a device.
|
|
24
|
+
* @typedef {object} SyncMutation
|
|
25
|
+
* @property {string} actorDeviceId - Device that signed the mutation.
|
|
26
|
+
* @property {string} actorUserId - User represented by the signing device.
|
|
27
|
+
* @property {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} [attributes] - Model attributes for CRUD mutations.
|
|
28
|
+
* @property {string | number | null} [baseVersion] - Base server/client version.
|
|
29
|
+
* @property {string} clientMutationId - Device-local idempotency id.
|
|
30
|
+
* @property {string} [command] - Domain command name for command mutations.
|
|
31
|
+
* @property {string} model - Sync model/resource name.
|
|
32
|
+
* @property {string} occurredAt - ISO timestamp when the mutation occurred.
|
|
33
|
+
* @property {string} offlineGrantId - Offline grant id authorizing the mutation.
|
|
34
|
+
* @property {string} operation - CRUD operation or command operation.
|
|
35
|
+
* @property {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} [payload] - Domain command payload.
|
|
36
|
+
* @property {string} policyHash - Sync policy hash the mutation was checked against.
|
|
37
|
+
*/
|
|
38
|
+
/**
|
|
39
|
+
* Device-signed mutation envelope.
|
|
40
|
+
* @typedef {object} SignedSyncMutation
|
|
41
|
+
* @property {"ECDSA-P256-SHA256"} algorithm - Signature algorithm.
|
|
42
|
+
* @property {DeviceCertificate} deviceCertificate - Backend-signed device certificate.
|
|
43
|
+
* @property {SyncMutation} mutation - Mutation payload.
|
|
44
|
+
* @property {string} signature - Device signature over the mutation envelope.
|
|
45
|
+
*/
|
|
46
|
+
/**
|
|
47
|
+
* Generates an ECDSA P-256 keypair exported as JWKs.
|
|
48
|
+
* @returns {Promise<{privateKey: SyncJsonWebKey, publicKey: SyncJsonWebKey}>} - Exported keypair.
|
|
49
|
+
*/
|
|
50
|
+
export function generateSyncSigningKeyPair(): Promise<{
|
|
51
|
+
privateKey: SyncJsonWebKey;
|
|
52
|
+
publicKey: SyncJsonWebKey;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Creates a backend-signed device certificate.
|
|
56
|
+
* @param {object} args - Arguments.
|
|
57
|
+
* @param {SyncJsonWebKey} args.backendPrivateKey - Backend private signing key.
|
|
58
|
+
* @param {DeviceCertificatePayload} args.certificate - Certificate payload.
|
|
59
|
+
* @returns {Promise<DeviceCertificate>} - Signed certificate.
|
|
60
|
+
*/
|
|
61
|
+
export function createDeviceCertificate({ backendPrivateKey, certificate }: {
|
|
62
|
+
backendPrivateKey: SyncJsonWebKey;
|
|
63
|
+
certificate: DeviceCertificatePayload;
|
|
64
|
+
}): Promise<DeviceCertificate>;
|
|
65
|
+
/**
|
|
66
|
+
* Verifies a backend-signed device certificate.
|
|
67
|
+
* @param {object} args - Arguments.
|
|
68
|
+
* @param {SyncJsonWebKey} args.backendPublicKey - Backend public key.
|
|
69
|
+
* @param {DeviceCertificate} args.certificate - Signed certificate.
|
|
70
|
+
* @param {Date} [args.now] - Verification time. Defaults to current time.
|
|
71
|
+
* @returns {Promise<DeviceCertificatePayload>} - Verified certificate payload.
|
|
72
|
+
*/
|
|
73
|
+
export function verifyDeviceCertificate({ backendPublicKey, certificate, now }: {
|
|
74
|
+
backendPublicKey: SyncJsonWebKey;
|
|
75
|
+
certificate: DeviceCertificate;
|
|
76
|
+
now?: Date | undefined;
|
|
77
|
+
}): Promise<DeviceCertificatePayload>;
|
|
78
|
+
/**
|
|
79
|
+
* Creates a device-signed mutation envelope.
|
|
80
|
+
* @param {object} args - Arguments.
|
|
81
|
+
* @param {DeviceCertificate} args.deviceCertificate - Backend-signed device certificate.
|
|
82
|
+
* @param {SyncJsonWebKey} args.devicePrivateKey - Device private signing key.
|
|
83
|
+
* @param {SyncMutation} args.mutation - Mutation payload.
|
|
84
|
+
* @returns {Promise<SignedSyncMutation>} - Signed mutation.
|
|
85
|
+
*/
|
|
86
|
+
export function createSignedMutation({ deviceCertificate, devicePrivateKey, mutation }: {
|
|
87
|
+
deviceCertificate: DeviceCertificate;
|
|
88
|
+
devicePrivateKey: SyncJsonWebKey;
|
|
89
|
+
mutation: SyncMutation;
|
|
90
|
+
}): Promise<SignedSyncMutation>;
|
|
91
|
+
/**
|
|
92
|
+
* Verifies a signed sync mutation and its device certificate.
|
|
93
|
+
* @param {object} args - Arguments.
|
|
94
|
+
* @param {SyncJsonWebKey} args.backendPublicKey - Backend public key used to verify the device certificate.
|
|
95
|
+
* @param {Date} [args.now] - Verification time. Defaults to current time.
|
|
96
|
+
* @param {SignedSyncMutation} args.signedMutation - Signed mutation envelope.
|
|
97
|
+
* @returns {Promise<SyncMutation>} - Verified mutation payload.
|
|
98
|
+
*/
|
|
99
|
+
export function verifySignedMutation({ backendPublicKey, now, signedMutation }: {
|
|
100
|
+
backendPublicKey: SyncJsonWebKey;
|
|
101
|
+
now?: Date | undefined;
|
|
102
|
+
signedMutation: SignedSyncMutation;
|
|
103
|
+
}): Promise<SyncMutation>;
|
|
104
|
+
/**
|
|
105
|
+
* Returns the replay/idempotency key for a signed mutation.
|
|
106
|
+
* @param {{mutation: {actorDeviceId?: unknown, actorUserId?: unknown, clientMutationId?: unknown}}} signedMutation - Signed mutation-like object.
|
|
107
|
+
* @returns {string} - Idempotency key.
|
|
108
|
+
*/
|
|
109
|
+
export function mutationIdempotencyKey(signedMutation: {
|
|
110
|
+
mutation: {
|
|
111
|
+
actorDeviceId?: unknown;
|
|
112
|
+
actorUserId?: unknown;
|
|
113
|
+
clientMutationId?: unknown;
|
|
114
|
+
};
|
|
115
|
+
}): string;
|
|
116
|
+
/**
|
|
117
|
+
* JSON Web Key used by the sync signing helpers.
|
|
118
|
+
*/
|
|
119
|
+
export type SyncJsonWebKey = JsonWebKey;
|
|
120
|
+
/**
|
|
121
|
+
* Backend-signed device certificate payload.
|
|
122
|
+
*/
|
|
123
|
+
export type DeviceCertificatePayload = {
|
|
124
|
+
/**
|
|
125
|
+
* - Device id allowed to sign mutations.
|
|
126
|
+
*/
|
|
127
|
+
actorDeviceId: string;
|
|
128
|
+
/**
|
|
129
|
+
* - User id represented by the device.
|
|
130
|
+
*/
|
|
131
|
+
actorUserId: string;
|
|
132
|
+
/**
|
|
133
|
+
* - Certificate id.
|
|
134
|
+
*/
|
|
135
|
+
certificateId: string;
|
|
136
|
+
/**
|
|
137
|
+
* - Device public key peers/backends use to verify mutations.
|
|
138
|
+
*/
|
|
139
|
+
devicePublicKey: SyncJsonWebKey;
|
|
140
|
+
/**
|
|
141
|
+
* - ISO timestamp after which the certificate is invalid.
|
|
142
|
+
*/
|
|
143
|
+
expiresAt: string;
|
|
144
|
+
/**
|
|
145
|
+
* - ISO timestamp when the backend issued the certificate.
|
|
146
|
+
*/
|
|
147
|
+
issuedAt: string;
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Backend-signed device certificate envelope.
|
|
151
|
+
*/
|
|
152
|
+
export type DeviceCertificate = {
|
|
153
|
+
/**
|
|
154
|
+
* - Signature algorithm.
|
|
155
|
+
*/
|
|
156
|
+
algorithm: "ECDSA-P256-SHA256";
|
|
157
|
+
/**
|
|
158
|
+
* - Certificate payload.
|
|
159
|
+
*/
|
|
160
|
+
certificate: DeviceCertificatePayload;
|
|
161
|
+
/**
|
|
162
|
+
* - Backend signature over the certificate payload.
|
|
163
|
+
*/
|
|
164
|
+
signature: string;
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Sync mutation payload signed by a device.
|
|
168
|
+
*/
|
|
169
|
+
export type SyncMutation = {
|
|
170
|
+
/**
|
|
171
|
+
* - Device that signed the mutation.
|
|
172
|
+
*/
|
|
173
|
+
actorDeviceId: string;
|
|
174
|
+
/**
|
|
175
|
+
* - User represented by the signing device.
|
|
176
|
+
*/
|
|
177
|
+
actorUserId: string;
|
|
178
|
+
/**
|
|
179
|
+
* - Model attributes for CRUD mutations.
|
|
180
|
+
*/
|
|
181
|
+
attributes?: Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue> | undefined;
|
|
182
|
+
/**
|
|
183
|
+
* - Base server/client version.
|
|
184
|
+
*/
|
|
185
|
+
baseVersion?: string | number | null | undefined;
|
|
186
|
+
/**
|
|
187
|
+
* - Device-local idempotency id.
|
|
188
|
+
*/
|
|
189
|
+
clientMutationId: string;
|
|
190
|
+
/**
|
|
191
|
+
* - Domain command name for command mutations.
|
|
192
|
+
*/
|
|
193
|
+
command?: string | undefined;
|
|
194
|
+
/**
|
|
195
|
+
* - Sync model/resource name.
|
|
196
|
+
*/
|
|
197
|
+
model: string;
|
|
198
|
+
/**
|
|
199
|
+
* - ISO timestamp when the mutation occurred.
|
|
200
|
+
*/
|
|
201
|
+
occurredAt: string;
|
|
202
|
+
/**
|
|
203
|
+
* - Offline grant id authorizing the mutation.
|
|
204
|
+
*/
|
|
205
|
+
offlineGrantId: string;
|
|
206
|
+
/**
|
|
207
|
+
* - CRUD operation or command operation.
|
|
208
|
+
*/
|
|
209
|
+
operation: string;
|
|
210
|
+
/**
|
|
211
|
+
* - Domain command payload.
|
|
212
|
+
*/
|
|
213
|
+
payload?: Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue> | undefined;
|
|
214
|
+
/**
|
|
215
|
+
* - Sync policy hash the mutation was checked against.
|
|
216
|
+
*/
|
|
217
|
+
policyHash: string;
|
|
218
|
+
};
|
|
219
|
+
/**
|
|
220
|
+
* Device-signed mutation envelope.
|
|
221
|
+
*/
|
|
222
|
+
export type SignedSyncMutation = {
|
|
223
|
+
/**
|
|
224
|
+
* - Signature algorithm.
|
|
225
|
+
*/
|
|
226
|
+
algorithm: "ECDSA-P256-SHA256";
|
|
227
|
+
/**
|
|
228
|
+
* - Backend-signed device certificate.
|
|
229
|
+
*/
|
|
230
|
+
deviceCertificate: DeviceCertificate;
|
|
231
|
+
/**
|
|
232
|
+
* - Mutation payload.
|
|
233
|
+
*/
|
|
234
|
+
mutation: SyncMutation;
|
|
235
|
+
/**
|
|
236
|
+
* - Device signature over the mutation envelope.
|
|
237
|
+
*/
|
|
238
|
+
signature: string;
|
|
239
|
+
};
|
|
240
|
+
//# sourceMappingURL=device-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-identity.d.ts","sourceRoot":"","sources":["../../../src/sync/device-identity.js"],"names":[],"mappings":"AAKA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;GAOG;AAEH;;;GAGG;AACH,8CAFa,OAAO,CAAC;IAAC,UAAU,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAC,CAAC,CAa5E;AAED;;;;;;GAMG;AACH,4EAJG;IAA6B,iBAAiB,EAAtC,cAAc;IACiB,WAAW,EAA1C,wBAAwB;CAChC,GAAU,OAAO,CAAC,iBAAiB,CAAC,CAatC;AAED;;;;;;;GAOG;AACH,gFALG;IAA6B,gBAAgB,EAArC,cAAc;IACU,WAAW,EAAnC,iBAAiB;IACL,GAAG;CACvB,GAAU,OAAO,CAAC,wBAAwB,CAAC,CAc7C;AAED;;;;;;;GAOG;AACH,wFALG;IAAgC,iBAAiB,EAAzC,iBAAiB;IACI,gBAAgB,EAArC,cAAc;IACK,QAAQ,EAA3B,YAAY;CACpB,GAAU,OAAO,CAAC,kBAAkB,CAAC,CAoBvC;AAED;;;;;;;GAOG;AACH,gFALG;IAA6B,gBAAgB,EAArC,cAAc;IACF,GAAG;IACU,cAAc,EAAvC,kBAAkB;CAC1B,GAAU,OAAO,CAAC,YAAY,CAAC,CAwBjC;AAED;;;;GAIG;AACH,uDAHW;IAAC,QAAQ,EAAE;QAAC,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAC,CAAA;CAAC,GACtF,MAAM,CAUlB;;;;6BApLY,UAAU;;;;;;;;mBAMT,MAAM;;;;iBACN,MAAM;;;;mBACN,MAAM;;;;qBACN,cAAc;;;;eACd,MAAM;;;;cACN,MAAM;;;;;;;;;eAMN,mBAAmB;;;;iBACnB,wBAAwB;;;;eACxB,MAAM;;;;;;;;;mBAMN,MAAM;;;;iBACN,MAAM;;;;;;;;;;;;sBAGN,MAAM;;;;;;;;WAEN,MAAM;;;;gBACN,MAAM;;;;oBACN,MAAM;;;;eACN,MAAM;;;;;;;;gBAEN,MAAM;;;;;;;;;eAMN,mBAAmB;;;;uBACnB,iBAAiB;;;;cACjB,YAAY;;;;eACZ,MAAM"}
|