velocious 1.0.476 → 1.0.477
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/build/configuration-types.js +3 -0
- package/build/configuration.js +24 -0
- package/build/frontend-model-controller.js +368 -11
- package/build/frontend-models/base.js +5 -1
- package/build/frontend-models/resource-definition.js +20 -3
- package/build/http-server/client/websocket-session.js +93 -0
- package/build/routes/hooks/frontend-model-command-route-hook.js +16 -0
- package/build/src/configuration-types.d.ts +15 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +4 -1
- package/build/src/configuration.d.ts +13 -0
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +23 -1
- package/build/src/frontend-model-controller.d.ts +96 -2
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +319 -12
- package/build/src/frontend-models/base.d.ts +5 -0
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +6 -2
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +20 -4
- package/build/src/http-server/client/websocket-session.d.ts +39 -0
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +85 -1
- 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 +15 -1
- package/build/src/sync/conflict-strategy.d.ts +83 -0
- package/build/src/sync/conflict-strategy.d.ts.map +1 -0
- package/build/src/sync/conflict-strategy.js +215 -0
- package/build/src/sync/peer-mutation-bundle.d.ts +97 -0
- package/build/src/sync/peer-mutation-bundle.d.ts.map +1 -0
- package/build/src/sync/peer-mutation-bundle.js +215 -0
- package/build/src/sync/server-change-feed.d.ts +265 -0
- package/build/src/sync/server-change-feed.d.ts.map +1 -0
- package/build/src/sync/server-change-feed.js +475 -0
- package/build/sync/conflict-strategy.js +225 -0
- package/build/sync/peer-mutation-bundle.js +232 -0
- package/build/sync/server-change-feed.js +524 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/configuration-types.js +3 -0
- package/src/configuration.js +24 -0
- package/src/frontend-model-controller.js +368 -11
- package/src/frontend-models/base.js +5 -1
- package/src/frontend-models/resource-definition.js +20 -3
- package/src/http-server/client/websocket-session.js +93 -0
- package/src/routes/hooks/frontend-model-command-route-hook.js +16 -0
- package/src/sync/conflict-strategy.js +225 -0
- package/src/sync/peer-mutation-bundle.js +232 -0
- package/src/sync/server-change-feed.js +524 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontend-model-command-route-hook.d.ts","sourceRoot":"","sources":["../../../../src/routes/hooks/frontend-model-command-route-hook.js"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,8GALG;IAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;IAC3B,WAAW,EAAxB,MAAM;IACS,sBAAsB;CAC7C,GAAU,OAAO,CAAC,OAAO,8BAA8B,EAAE,uBAAuB,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"frontend-model-command-route-hook.d.ts","sourceRoot":"","sources":["../../../../src/routes/hooks/frontend-model-command-route-hook.js"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,8GALG;IAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;IAC3B,WAAW,EAAxB,MAAM;IACS,sBAAsB;CAC7C,GAAU,OAAO,CAAC,OAAO,8BAA8B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAuG1F"}
|
|
@@ -27,6 +27,20 @@ export default async function frontendModelCommandRouteHook({ configuration, cur
|
|
|
27
27
|
controllerPath: FRONTEND_MODEL_CONTROLLER_PATH
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
|
+
if (["/frontend-models/sync/change-feed", "/frontend-models/sync/changes", "/sync/changes"].includes(normalizedCurrentPath)) {
|
|
31
|
+
return {
|
|
32
|
+
action: "frontend-sync-change-feed",
|
|
33
|
+
controller: "velocious/api",
|
|
34
|
+
controllerPath: FRONTEND_MODEL_CONTROLLER_PATH
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (["/frontend-models/sync/snapshot", "/sync/snapshot"].includes(normalizedCurrentPath)) {
|
|
38
|
+
return {
|
|
39
|
+
action: "frontend-sync-snapshot",
|
|
40
|
+
controller: "velocious/api",
|
|
41
|
+
controllerPath: FRONTEND_MODEL_CONTROLLER_PATH
|
|
42
|
+
};
|
|
43
|
+
}
|
|
30
44
|
if (normalizedCurrentPath === SHARED_FRONTEND_MODEL_API_PATH) {
|
|
31
45
|
return {
|
|
32
46
|
action: "frontend-api",
|
|
@@ -98,4 +112,4 @@ function normalizePath(path) {
|
|
|
98
112
|
}
|
|
99
113
|
return withLeadingSlash;
|
|
100
114
|
}
|
|
101
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWwtY29tbWFuZC1yb3V0ZS1ob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JvdXRlcy9ob29rcy9mcm9udGVuZC1tb2RlbC1jb21tYW5kLXJvdXRlLWhvb2suanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxtREFBbUQsRUFBQyxNQUFNLDZDQUE2QyxDQUFBO0FBQy9HLE9BQU8sRUFBQyw2QkFBNkIsRUFBRSxpQ0FBaUMsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLDhDQUE4QyxDQUFBO0FBRXhKLE1BQU0sOEJBQThCLEdBQUcsa0JBQWtCLENBQUE7QUFDekQsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxvQ0FBb0MsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUUxRzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsNkJBQTZCLENBQUMsRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFDO0lBQzlHLE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRXhELElBQUkscUJBQXFCLEtBQUssaUNBQWlDLEVBQUUsQ0FBQztRQUNoRSxPQUFPO1lBQ0wsTUFBTSxFQUFFLHlCQUF5QjtZQUNqQyxVQUFVLEVBQUUsZUFBZTtZQUMzQixjQUFjLEVBQUUsOEJBQThCO1NBQy9DLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxxQkFBcUIsS0FBSyw4QkFBOEIsRUFBRSxDQUFDO1FBQzdELE9BQU87WUFDTCxNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLFVBQVUsRUFBRSxlQUFlO1lBQzNCLGNBQWMsRUFBRSw4QkFBOEI7U0FDL0MsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLHFCQUFxQixLQUFLLDhCQUE4QixFQUFFLENBQUM7UUFDN0Qs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QixDQUFBO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtmcm9udGVuZE1vZGVsUmVzb3VyY2VzV2l0aEJ1aWx0SW5zRm9yQmFja2VuZFByb2plY3R9IGZyb20gXCIuLi8uLi9mcm9udGVuZC1tb2RlbHMvYnVpbHQtaW4tcmVzb3VyY2VzLmpzXCJcbmltcG9ydCB7ZnJvbnRlbmRNb2RlbEFjdGlvbkZvckNvbW1hbmQsIGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kRm9yUGF0aCwgZnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aH0gZnJvbSBcIi4uLy4uL2Zyb250ZW5kLW1vZGVscy9yZXNvdXJjZS1kZWZpbml0aW9uLmpzXCJcblxuY29uc3QgU0hBUkVEX0ZST05URU5EX01PREVMX0FQSV9QQVRIID0gXCIvZnJvbnRlbmQtbW9kZWxzXCJcbmNvbnN0IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSCA9IG5ldyBVUkwoXCIuLi8uLi9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzXCIsIGltcG9ydC5tZXRhLnVybCkuaHJlZlxuXG4vKipcbiAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY29tbWFuZCByb3V0ZSBob29rLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBIb29rIGFyZ3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmhhc01hdGNoaW5nQ3VzdG9tUm91dGVdIC0gU2V0IHdoZW4gdGhlIHJlcXVlc3QgcGF0aCBtYXRjaGVzIGFuIGV4cGxpY2l0IGN1c3RvbSByb3V0ZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuUm91dGVSZXNvbHZlckhvb2tSZXN1bHQgfCBudWxsPn0gLSBSb3V0ZSBvdmVycmlkZSBvciBudWxsLlxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmcm9udGVuZE1vZGVsQ29tbWFuZFJvdXRlSG9vayh7Y29uZmlndXJhdGlvbiwgY3VycmVudFBhdGgsIGhhc01hdGNoaW5nQ3VzdG9tUm91dGV9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDdXJyZW50UGF0aCA9IG5vcm1hbGl6ZVBhdGgoY3VycmVudFBhdGgpXG5cbiAgaWYgKG5vcm1hbGl6ZWRDdXJyZW50UGF0aCA9PT0gXCIvZnJvbnRlbmQtbW9kZWxzL3N5bmMvYm9vdHN0cmFwXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImZyb250ZW5kLXN5bmMtYm9vdHN0cmFwXCIsXG4gICAgICBjb250cm9sbGVyOiBcInZlbG9jaW91cy9hcGlcIixcbiAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEhcbiAgICB9XG4gIH1cblxuICBpZiAobm9ybWFsaXplZEN1cnJlbnRQYXRoID09PSBcIi9mcm9udGVuZC1tb2RlbHMvc3luYy9yZXBsYXlcIikge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZnJvbnRlbmQtc3luYy1yZXBsYXlcIixcbiAgICAgIGNvbnRyb2xsZXI6IFwidmVsb2Npb3VzL2FwaVwiLFxuICAgICAgY29udHJvbGxlclBhdGg6IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSFxuICAgIH1cbiAgfVxuXG4gIGlmIChub3JtYWxpemVkQ3VycmVudFBhdGggPT09IFNIQVJFRF9GUk9OVEVORF9NT0RFTF9BUElfUEFUSCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZnJvbnRlbmQtYXBpXCIsXG4gICAgICBjb250cm9sbGVyOiBcInZlbG9jaW91cy9hcGlcIixcbiAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEhcbiAgICB9XG4gIH1cblxuICAvLyBEb24ndCBpbnRlcmNlcHQgcGF0aHMgdGhhdCBtYXRjaCBleHBsaWNpdGx5IGRlZmluZWQgY3VzdG9tIHJvdXRlc1xuICBpZiAoaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSkgcmV0dXJuIG51bGxcblxuICBjb25zdCBiYWNrZW5kUHJvamVjdHMgPSBjb25maWd1cmF0aW9uLmdldEJhY2tlbmRQcm9qZWN0cygpXG4gIGNvbnN0IGN1c3RvbUNvbW1hbmRNYXRjaCA9IGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kRm9yUGF0aCh7XG4gICAgYmFja2VuZFByb2plY3RzLFxuICAgIGN1cnJlbnRQYXRoOiBub3JtYWxpemVkQ3VycmVudFBhdGhcbiAgfSlcblxuICBpZiAoY3VzdG9tQ29tbWFuZE1hdGNoKSB7XG4gICAgLyoqXG4gICAgICogUGFyYW1zLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZE1ldGhvZE5hbWU6IGN1c3RvbUNvbW1hbmRNYXRjaC5tZXRob2ROYW1lLFxuICAgICAgZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRTY29wZTogY3VzdG9tQ29tbWFuZE1hdGNoLnNjb3BlLFxuICAgICAgbW9kZWw6IGN1c3RvbUNvbW1hbmRNYXRjaC5tb2RlbE5hbWVcbiAgICB9XG5cbiAgICBpZiAoY3VzdG9tQ29tbWFuZE1hdGNoLm1lbWJlcklkKSB7XG4gICAgICBwYXJhbXMuaWQgPSBjdXN0b21Db21tYW5kTWF0Y2gubWVtYmVySWRcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImZyb250ZW5kLWN1c3RvbS1jb21tYW5kXCIsXG4gICAgICBjb250cm9sbGVyOiBjdXN0b21Db21tYW5kTWF0Y2gucmVzb3VyY2VQYXRoLnJlcGxhY2UoL15cXC8rLywgXCJcIiksXG4gICAgICBjb250cm9sbGVyUGF0aDogRlJPTlRFTkRfTU9ERUxfQ09OVFJPTExFUl9QQVRILFxuICAgICAgcGFyYW1zXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzV2l0aEJ1aWx0SW5zRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsTmFtZSBpbiByZXNvdXJjZXMpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IHJlc291cmNlc1ttb2RlbE5hbWVdXG4gICAgICBjb25zdCByZXNvdXJjZVBhdGggPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoKG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9uKVxuICAgICAgY29uc3Qgbm9ybWFsaXplZFJlc291cmNlUGF0aCA9IG5vcm1hbGl6ZVBhdGgocmVzb3VyY2VQYXRoKVxuICAgICAgY29uc3QgZXhwZWN0ZWRQcmVmaXggPSBgJHtub3JtYWxpemVkUmVzb3VyY2VQYXRofS9gXG5cbiAgICAgIGlmICghbm9ybWFsaXplZEN1cnJlbnRQYXRoLnN0YXJ0c1dpdGgoZXhwZWN0ZWRQcmVmaXgpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBjb21tYW5kTmFtZSA9IG5vcm1hbGl6ZWRDdXJyZW50UGF0aC5zbGljZShleHBlY3RlZFByZWZpeC5sZW5ndGgpXG4gICAgICBpZiAoY29tbWFuZE5hbWUuaW5jbHVkZXMoXCIvXCIpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBhY3Rpb24gPSBmcm9udGVuZE1vZGVsQWN0aW9uRm9yQ29tbWFuZCh7Y29tbWFuZE5hbWUsIG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9ufSlcbiAgICAgIGlmICghYWN0aW9uKSBjb250aW51ZVxuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5vcm1hbGl6ZWRSZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLysvLCBcIlwiKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpb246IGBmcm9udGVuZC0ke2FjdGlvbn1gLFxuICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICBjb250cm9sbGVyUGF0aDogRlJPTlRFTkRfTU9ERUxfQ09OVFJPTExFUl9QQVRIXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoIHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIHBhdGggd2l0aCBsZWFkaW5nIHNsYXNoIGFuZCBubyB0cmFpbGluZyBzbGFzaC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gIGNvbnN0IHdpdGhMZWFkaW5nU2xhc2ggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWBcblxuICBpZiAod2l0aExlYWRpbmdTbGFzaC5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2gucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICB9XG5cbiAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2hcbn1cbiJdfQ==
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWwtY29tbWFuZC1yb3V0ZS1ob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JvdXRlcy9ob29rcy9mcm9udGVuZC1tb2RlbC1jb21tYW5kLXJvdXRlLWhvb2suanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxtREFBbUQsRUFBQyxNQUFNLDZDQUE2QyxDQUFBO0FBQy9HLE9BQU8sRUFBQyw2QkFBNkIsRUFBRSxpQ0FBaUMsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLDhDQUE4QyxDQUFBO0FBRXhKLE1BQU0sOEJBQThCLEdBQUcsa0JBQWtCLENBQUE7QUFDekQsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxvQ0FBb0MsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUUxRzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsNkJBQTZCLENBQUMsRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFDO0lBQzlHLE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRXhELElBQUkscUJBQXFCLEtBQUssaUNBQWlDLEVBQUUsQ0FBQztRQUNoRSxPQUFPO1lBQ0wsTUFBTSxFQUFFLHlCQUF5QjtZQUNqQyxVQUFVLEVBQUUsZUFBZTtZQUMzQixjQUFjLEVBQUUsOEJBQThCO1NBQy9DLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxxQkFBcUIsS0FBSyw4QkFBOEIsRUFBRSxDQUFDO1FBQzdELE9BQU87WUFDTCxNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLFVBQVUsRUFBRSxlQUFlO1lBQzNCLGNBQWMsRUFBRSw4QkFBOEI7U0FDL0MsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsbUNBQW1DLEVBQUUsK0JBQStCLEVBQUUsZUFBZSxD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VixjQUFjLEVBQUUsOEJBQThCO2FBQy9DLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFJO0lBQ3pCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO0lBRWpFLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRUQsT0FBTyxnQkFBZ0IsQ0FBQTtBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZnJvbnRlbmRNb2RlbFJlc291cmNlc1dpdGhCdWlsdEluc0ZvckJhY2tlbmRQcm9qZWN0fSBmcm9tIFwiLi4vLi4vZnJvbnRlbmQtbW9kZWxzL2J1aWx0LWluLXJlc291cmNlcy5qc1wiXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxBY3Rpb25Gb3JDb21tYW5kLCBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZEZvclBhdGgsIGZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGh9IGZyb20gXCIuLi8uLi9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qc1wiXG5cbmNvbnN0IFNIQVJFRF9GUk9OVEVORF9NT0RFTF9BUElfUEFUSCA9IFwiL2Zyb250ZW5kLW1vZGVsc1wiXG5jb25zdCBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEggPSBuZXcgVVJMKFwiLi4vLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiLCBpbXBvcnQubWV0YS51cmwpLmhyZWZcblxuLyoqXG4gKiBSdW5zIGZyb250ZW5kIG1vZGVsIGNvbW1hbmQgcm91dGUgaG9vay5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gSG9vayBhcmdzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jdXJyZW50UGF0aCAtIFJlcXVlc3QgcGF0aCB3aXRob3V0IHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5oYXNNYXRjaGluZ0N1c3RvbVJvdXRlXSAtIFNldCB3aGVuIHRoZSByZXF1ZXN0IHBhdGggbWF0Y2hlcyBhbiBleHBsaWNpdCBjdXN0b20gcm91dGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlJvdXRlUmVzb2x2ZXJIb29rUmVzdWx0IHwgbnVsbD59IC0gUm91dGUgb3ZlcnJpZGUgb3IgbnVsbC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbENvbW1hbmRSb3V0ZUhvb2soe2NvbmZpZ3VyYXRpb24sIGN1cnJlbnRQYXRoLCBoYXNNYXRjaGluZ0N1c3RvbVJvdXRlfSkge1xuICBjb25zdCBub3JtYWxpemVkQ3VycmVudFBhdGggPSBub3JtYWxpemVQYXRoKGN1cnJlbnRQYXRoKVxuXG4gIGlmIChub3JtYWxpemVkQ3VycmVudFBhdGggPT09IFwiL2Zyb250ZW5kLW1vZGVscy9zeW5jL2Jvb3RzdHJhcFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJmcm9udGVuZC1zeW5jLWJvb3RzdHJhcFwiLFxuICAgICAgY29udHJvbGxlcjogXCJ2ZWxvY2lvdXMvYXBpXCIsXG4gICAgICBjb250cm9sbGVyUGF0aDogRlJPTlRFTkRfTU9ERUxfQ09OVFJPTExFUl9QQVRIXG4gICAgfVxuICB9XG5cbiAgaWYgKG5vcm1hbGl6ZWRDdXJyZW50UGF0aCA9PT0gXCIvZnJvbnRlbmQtbW9kZWxzL3N5bmMvcmVwbGF5XCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImZyb250ZW5kLXN5bmMtcmVwbGF5XCIsXG4gICAgICBjb250cm9sbGVyOiBcInZlbG9jaW91cy9hcGlcIixcbiAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEhcbiAgICB9XG4gIH1cblxuICBpZiAoW1wiL2Zyb250ZW5kLW1vZGVscy9zeW5jL2NoYW5nZS1mZWVkXCIsIFwiL2Zyb250ZW5kLW1vZGVscy9zeW5jL2NoYW5nZXNcIiwgXCIvc3luYy9jaGFuZ2VzXCJdLmluY2x1ZGVzKG5vcm1hbGl6ZWRDdXJyZW50UGF0aCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImZyb250ZW5kLXN5bmMtY2hhbmdlLWZlZWRcIixcbiAgICAgIGNvbnRyb2xsZXI6IFwidmVsb2Npb3VzL2FwaVwiLFxuICAgICAgY29udHJvbGxlclBhdGg6IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSFxuICAgIH1cbiAgfVxuXG4gIGlmIChbXCIvZnJvbnRlbmQtbW9kZWxzL3N5bmMvc25hcHNob3RcIiwgXCIvc3luYy9zbmFwc2hvdFwiXS5pbmNsdWRlcyhub3JtYWxpemVkQ3VycmVudFBhdGgpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJmcm9udGVuZC1zeW5jLXNuYXBzaG90XCIsXG4gICAgICBjb250cm9sbGVyOiBcInZlbG9jaW91cy9hcGlcIixcbiAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEhcbiAgICB9XG4gIH1cblxuICBpZiAobm9ybWFsaXplZEN1cnJlbnRQYXRoID09PSBTSEFSRURfRlJPTlRFTkRfTU9ERUxfQVBJX1BBVEgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImZyb250ZW5kLWFwaVwiLFxuICAgICAgY29udHJvbGxlcjogXCJ2ZWxvY2lvdXMvYXBpXCIsXG4gICAgICBjb250cm9sbGVyUGF0aDogRlJPTlRFTkRfTU9ERUxfQ09OVFJPTExFUl9QQVRIXG4gICAgfVxuICB9XG5cbiAgLy8gRG9uJ3QgaW50ZXJjZXB0IHBhdGhzIHRoYXQgbWF0Y2ggZXhwbGljaXRseSBkZWZpbmVkIGN1c3RvbSByb3V0ZXNcbiAgaWYgKGhhc01hdGNoaW5nQ3VzdG9tUm91dGUpIHJldHVybiBudWxsXG5cbiAgY29uc3QgYmFja2VuZFByb2plY3RzID0gY29uZmlndXJhdGlvbi5nZXRCYWNrZW5kUHJvamVjdHMoKVxuICBjb25zdCBjdXN0b21Db21tYW5kTWF0Y2ggPSBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZEZvclBhdGgoe1xuICAgIGJhY2tlbmRQcm9qZWN0cyxcbiAgICBjdXJyZW50UGF0aDogbm9ybWFsaXplZEN1cnJlbnRQYXRoXG4gIH0pXG5cbiAgaWYgKGN1c3RvbUNvbW1hbmRNYXRjaCkge1xuICAgIC8qKlxuICAgICAqIFBhcmFtcy5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRNZXRob2ROYW1lOiBjdXN0b21Db21tYW5kTWF0Y2gubWV0aG9kTmFtZSxcbiAgICAgIGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kU2NvcGU6IGN1c3RvbUNvbW1hbmRNYXRjaC5zY29wZSxcbiAgICAgIG1vZGVsOiBjdXN0b21Db21tYW5kTWF0Y2gubW9kZWxOYW1lXG4gICAgfVxuXG4gICAgaWYgKGN1c3RvbUNvbW1hbmRNYXRjaC5tZW1iZXJJZCkge1xuICAgICAgcGFyYW1zLmlkID0gY3VzdG9tQ29tbWFuZE1hdGNoLm1lbWJlcklkXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJmcm9udGVuZC1jdXN0b20tY29tbWFuZFwiLFxuICAgICAgY29udHJvbGxlcjogY3VzdG9tQ29tbWFuZE1hdGNoLnJlc291cmNlUGF0aC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpLFxuICAgICAgY29udHJvbGxlclBhdGg6IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSCxcbiAgICAgIHBhcmFtc1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlc1dpdGhCdWlsdEluc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuXG4gICAgZm9yIChjb25zdCBtb2RlbE5hbWUgaW4gcmVzb3VyY2VzKSB7XG4gICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSByZXNvdXJjZXNbbW9kZWxOYW1lXVxuICAgICAgY29uc3QgcmVzb3VyY2VQYXRoID0gZnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aChtb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbilcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNvdXJjZVBhdGggPSBub3JtYWxpemVQYXRoKHJlc291cmNlUGF0aClcbiAgICAgIGNvbnN0IGV4cGVjdGVkUHJlZml4ID0gYCR7bm9ybWFsaXplZFJlc291cmNlUGF0aH0vYFxuXG4gICAgICBpZiAoIW5vcm1hbGl6ZWRDdXJyZW50UGF0aC5zdGFydHNXaXRoKGV4cGVjdGVkUHJlZml4KSkgY29udGludWVcblxuICAgICAgY29uc3QgY29tbWFuZE5hbWUgPSBub3JtYWxpemVkQ3VycmVudFBhdGguc2xpY2UoZXhwZWN0ZWRQcmVmaXgubGVuZ3RoKVxuICAgICAgaWYgKGNvbW1hbmROYW1lLmluY2x1ZGVzKFwiL1wiKSkgY29udGludWVcblxuICAgICAgY29uc3QgYWN0aW9uID0gZnJvbnRlbmRNb2RlbEFjdGlvbkZvckNvbW1hbmQoe2NvbW1hbmROYW1lLCBtb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbn0pXG4gICAgICBpZiAoIWFjdGlvbikgY29udGludWVcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBub3JtYWxpemVkUmVzb3VyY2VQYXRoLnJlcGxhY2UoL15cXC8rLywgXCJcIilcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uOiBgZnJvbnRlbmQtJHthY3Rpb259YCxcbiAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgY29udHJvbGxlclBhdGg6IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTm9ybWFsaXplZCBwYXRoIHdpdGggbGVhZGluZyBzbGFzaCBhbmQgbm8gdHJhaWxpbmcgc2xhc2guXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICBjb25zdCB3aXRoTGVhZGluZ1NsYXNoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gXG5cbiAgaWYgKHdpdGhMZWFkaW5nU2xhc2gubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiB3aXRoTGVhZGluZ1NsYXNoLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgfVxuXG4gIHJldHVybiB3aXRoTGVhZGluZ1NsYXNoXG59XG4iXX0=
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {null | string | number | boolean | unknown[] | Record<string, unknown>} SyncJsonValue
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {object} SyncConflictRecord
|
|
6
|
+
* @property {Record<string, SyncJsonValue>} attributes - Record attributes.
|
|
7
|
+
* @property {string | number | boolean | null} [version] - Record version value.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {object} SyncConflictResult
|
|
11
|
+
* @property {Record<string, SyncJsonValue>} [attributes] - Attributes to apply when replay may continue.
|
|
12
|
+
* @property {Record<string, SyncJsonValue>} [conflict] - Structured conflict payload for the client/local log.
|
|
13
|
+
* @property {"applied" | "conflict" | "rejected"} status - Conflict decision.
|
|
14
|
+
* @property {string} strategy - Strategy that produced the decision.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Evaluates a replay mutation against server/base state using a sync conflict strategy.
|
|
18
|
+
* @param {object} args - Arguments.
|
|
19
|
+
* @param {SyncConflictRecord | null} [args.baseRecord] - Record state observed when the mutation was made.
|
|
20
|
+
* @param {function(object): (SyncConflictResult | Promise<SyncConflictResult>)} [args.customHandler] - Resource-specific conflict hook.
|
|
21
|
+
* @param {import("./device-identity.js").SyncMutation} args.mutation - Replayed mutation.
|
|
22
|
+
* @param {SyncConflictRecord | null} [args.serverRecord] - Current authoritative server record.
|
|
23
|
+
* @param {string} [args.strategy] - Conflict strategy.
|
|
24
|
+
* @param {string} [args.versionAttribute] - Attribute used for optimistic version checks.
|
|
25
|
+
* @returns {Promise<SyncConflictResult>} - Conflict decision.
|
|
26
|
+
*/
|
|
27
|
+
export function resolveSyncConflict({ baseRecord, customHandler, mutation, serverRecord, strategy, versionAttribute }: {
|
|
28
|
+
baseRecord?: SyncConflictRecord | null | undefined;
|
|
29
|
+
customHandler?: ((arg0: object) => (SyncConflictResult | Promise<SyncConflictResult>)) | undefined;
|
|
30
|
+
mutation: import("./device-identity.js").SyncMutation;
|
|
31
|
+
serverRecord?: SyncConflictRecord | null | undefined;
|
|
32
|
+
strategy?: string | undefined;
|
|
33
|
+
versionAttribute?: string | undefined;
|
|
34
|
+
}): Promise<SyncConflictResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Applies a server replay result to a local mutation-log record.
|
|
37
|
+
* @param {object} args - Arguments.
|
|
38
|
+
* @param {import("./local-mutation-log.js").default} args.mutationLog - Local mutation log.
|
|
39
|
+
* @param {import("./local-mutation-log.js").LocalMutationLogRecord} args.record - Local mutation-log record.
|
|
40
|
+
* @param {Record<string, SyncJsonValue>} args.result - Server replay result payload.
|
|
41
|
+
* @returns {Promise<import("./local-mutation-log.js").LocalMutationLogRecord>} - Updated local record.
|
|
42
|
+
*/
|
|
43
|
+
export function applySyncReplayResultToLocalMutationLog({ mutationLog, record, result }: {
|
|
44
|
+
mutationLog: import("./local-mutation-log.js").default;
|
|
45
|
+
record: import("./local-mutation-log.js").LocalMutationLogRecord;
|
|
46
|
+
result: Record<string, SyncJsonValue>;
|
|
47
|
+
}): Promise<import("./local-mutation-log.js").LocalMutationLogRecord>;
|
|
48
|
+
/**
|
|
49
|
+
* Maps a server replay result to a local mutation-log status.
|
|
50
|
+
* @param {Record<string, SyncJsonValue>} result - Replay result.
|
|
51
|
+
* @returns {import("./local-mutation-log.js").LocalMutationStatus} - Local mutation-log status.
|
|
52
|
+
*/
|
|
53
|
+
export function replayResultLocalStatus(result: Record<string, SyncJsonValue>): import("./local-mutation-log.js").LocalMutationStatus;
|
|
54
|
+
export type SyncJsonValue = null | string | number | boolean | unknown[] | Record<string, unknown>;
|
|
55
|
+
export type SyncConflictRecord = {
|
|
56
|
+
/**
|
|
57
|
+
* - Record attributes.
|
|
58
|
+
*/
|
|
59
|
+
attributes: Record<string, SyncJsonValue>;
|
|
60
|
+
/**
|
|
61
|
+
* - Record version value.
|
|
62
|
+
*/
|
|
63
|
+
version?: string | number | boolean | null | undefined;
|
|
64
|
+
};
|
|
65
|
+
export type SyncConflictResult = {
|
|
66
|
+
/**
|
|
67
|
+
* - Attributes to apply when replay may continue.
|
|
68
|
+
*/
|
|
69
|
+
attributes?: Record<string, SyncJsonValue> | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* - Structured conflict payload for the client/local log.
|
|
72
|
+
*/
|
|
73
|
+
conflict?: Record<string, SyncJsonValue> | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* - Conflict decision.
|
|
76
|
+
*/
|
|
77
|
+
status: "applied" | "conflict" | "rejected";
|
|
78
|
+
/**
|
|
79
|
+
* - Strategy that produced the decision.
|
|
80
|
+
*/
|
|
81
|
+
strategy: string;
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=conflict-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-strategy.d.ts","sourceRoot":"","sources":["../../../src/sync/conflict-strategy.js"],"names":[],"mappings":"AAIA;;GAEG;AAEH;;;;GAIG;AAEH;;;;;;GAMG;AAEH;;;;;;;;;;GAUG;AACH,uHARG;IAAyC,UAAU;IACiC,aAAa,WAAhF,MAAM,KAAG,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClB,QAAQ,EAA1D,OAAO,sBAAsB,EAAE,YAAY;IACV,YAAY;IAC/B,QAAQ;IACR,gBAAgB;CACtC,GAAU,OAAO,CAAC,kBAAkB,CAAC,CAavC;AAED;;;;;;;GAOG;AACH,yFALG;IAAwD,WAAW,EAA3D,OAAO,yBAAyB,EAAE,OAAO;IACsB,MAAM,EAArE,OAAO,yBAAyB,EAAE,sBAAsB;IACpB,MAAM,EAA1C,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;CACrC,GAAU,OAAO,CAAC,OAAO,yBAAyB,EAAE,sBAAsB,CAAC,CAQ7E;AAED;;;;GAIG;AACH,gDAHW,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAC3B,OAAO,yBAAyB,EAAE,mBAAmB,CASjE;4BArEY,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;gBAKrE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;;;;;;;;;;;;;;;;;;YAQ7B,SAAS,GAAG,UAAU,GAAG,UAAU;;;;cACnC,MAAM"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
const CONFLICT_STRATEGIES = new Set(["optimisticVersion", "serverWins", "lastWriterWins", "fieldThreeWay", "appendOnly"]);
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {null | string | number | boolean | unknown[] | Record<string, unknown>} SyncJsonValue
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* @typedef {object} SyncConflictRecord
|
|
8
|
+
* @property {Record<string, SyncJsonValue>} attributes - Record attributes.
|
|
9
|
+
* @property {string | number | boolean | null} [version] - Record version value.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* @typedef {object} SyncConflictResult
|
|
13
|
+
* @property {Record<string, SyncJsonValue>} [attributes] - Attributes to apply when replay may continue.
|
|
14
|
+
* @property {Record<string, SyncJsonValue>} [conflict] - Structured conflict payload for the client/local log.
|
|
15
|
+
* @property {"applied" | "conflict" | "rejected"} status - Conflict decision.
|
|
16
|
+
* @property {string} strategy - Strategy that produced the decision.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Evaluates a replay mutation against server/base state using a sync conflict strategy.
|
|
20
|
+
* @param {object} args - Arguments.
|
|
21
|
+
* @param {SyncConflictRecord | null} [args.baseRecord] - Record state observed when the mutation was made.
|
|
22
|
+
* @param {function(object): (SyncConflictResult | Promise<SyncConflictResult>)} [args.customHandler] - Resource-specific conflict hook.
|
|
23
|
+
* @param {import("./device-identity.js").SyncMutation} args.mutation - Replayed mutation.
|
|
24
|
+
* @param {SyncConflictRecord | null} [args.serverRecord] - Current authoritative server record.
|
|
25
|
+
* @param {string} [args.strategy] - Conflict strategy.
|
|
26
|
+
* @param {string} [args.versionAttribute] - Attribute used for optimistic version checks.
|
|
27
|
+
* @returns {Promise<SyncConflictResult>} - Conflict decision.
|
|
28
|
+
*/
|
|
29
|
+
export async function resolveSyncConflict({ baseRecord = null, customHandler, mutation, serverRecord = null, strategy = "optimisticVersion", versionAttribute = "updatedAt" }) {
|
|
30
|
+
if (customHandler)
|
|
31
|
+
return normalizeConflictResult(await customHandler({ baseRecord, mutation, serverRecord, strategy, versionAttribute }), strategy);
|
|
32
|
+
if (!CONFLICT_STRATEGIES.has(strategy))
|
|
33
|
+
throw new Error(`Unknown sync conflict strategy '${strategy}'`);
|
|
34
|
+
const mutationAttributes = mutationAttributesFor(mutation);
|
|
35
|
+
if (strategy === "appendOnly" || strategy === "lastWriterWins")
|
|
36
|
+
return { attributes: mutationAttributes, status: "applied", strategy };
|
|
37
|
+
if (strategy === "fieldThreeWay")
|
|
38
|
+
return fieldThreeWayResult({ baseRecord, mutation, serverRecord, strategy, versionAttribute });
|
|
39
|
+
if (hasVersionConflict({ mutation, serverRecord, versionAttribute }))
|
|
40
|
+
return conflictResult({ baseRecord, mutation, serverRecord, strategy, versionAttribute });
|
|
41
|
+
return { attributes: mutationAttributes, status: "applied", strategy };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Applies a server replay result to a local mutation-log record.
|
|
45
|
+
* @param {object} args - Arguments.
|
|
46
|
+
* @param {import("./local-mutation-log.js").default} args.mutationLog - Local mutation log.
|
|
47
|
+
* @param {import("./local-mutation-log.js").LocalMutationLogRecord} args.record - Local mutation-log record.
|
|
48
|
+
* @param {Record<string, SyncJsonValue>} args.result - Server replay result payload.
|
|
49
|
+
* @returns {Promise<import("./local-mutation-log.js").LocalMutationLogRecord>} - Updated local record.
|
|
50
|
+
*/
|
|
51
|
+
export async function applySyncReplayResultToLocalMutationLog({ mutationLog, record, result }) {
|
|
52
|
+
return await mutationLog.updateStatus({
|
|
53
|
+
id: record.id,
|
|
54
|
+
status: replayResultLocalStatus(result),
|
|
55
|
+
syncResult: result
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Maps a server replay result to a local mutation-log status.
|
|
60
|
+
* @param {Record<string, SyncJsonValue>} result - Replay result.
|
|
61
|
+
* @returns {import("./local-mutation-log.js").LocalMutationStatus} - Local mutation-log status.
|
|
62
|
+
*/
|
|
63
|
+
export function replayResultLocalStatus(result) {
|
|
64
|
+
if (result.status === "conflict")
|
|
65
|
+
return "conflict";
|
|
66
|
+
if (result.status === "error" || result.status === "rejected")
|
|
67
|
+
return "rejected";
|
|
68
|
+
if (result.status === "success" && replayResultHasFailedApplication(result))
|
|
69
|
+
return "rejected";
|
|
70
|
+
if (result.status === "success" || result.status === "applied" || result.status === "duplicate")
|
|
71
|
+
return "synced";
|
|
72
|
+
throw new Error(`Unknown sync replay result status '${String(result.status)}'`);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Checks whether an otherwise successful replay result contains a failed
|
|
76
|
+
* frontend-model command or change-feed write.
|
|
77
|
+
* @param {Record<string, SyncJsonValue>} result - Replay result.
|
|
78
|
+
* @returns {boolean} - Whether the local mutation must stay unsynced.
|
|
79
|
+
*/
|
|
80
|
+
function replayResultHasFailedApplication(result) {
|
|
81
|
+
if (result.serverSequence === null || result.serverChangeFeedStatus === "error")
|
|
82
|
+
return true;
|
|
83
|
+
if (!result.response || typeof result.response !== "object" || Array.isArray(result.response))
|
|
84
|
+
return false;
|
|
85
|
+
return /** @type {Record<string, SyncJsonValue>} */ (result.response).status === "error";
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Runs a field-level three-way merge.
|
|
89
|
+
* @param {object} args - Arguments.
|
|
90
|
+
* @param {SyncConflictRecord | null} args.baseRecord - Base record.
|
|
91
|
+
* @param {import("./device-identity.js").SyncMutation} args.mutation - Mutation.
|
|
92
|
+
* @param {SyncConflictRecord | null} args.serverRecord - Server record.
|
|
93
|
+
* @param {string} args.strategy - Strategy.
|
|
94
|
+
* @param {string} args.versionAttribute - Version attribute.
|
|
95
|
+
* @returns {SyncConflictResult} - Conflict decision.
|
|
96
|
+
*/
|
|
97
|
+
function fieldThreeWayResult({ baseRecord, mutation, serverRecord, strategy, versionAttribute }) {
|
|
98
|
+
if (!baseRecord || !serverRecord)
|
|
99
|
+
return { attributes: mutationAttributesFor(mutation), status: "applied", strategy };
|
|
100
|
+
const mutationAttributes = mutationAttributesFor(mutation);
|
|
101
|
+
/** @type {string[]} */
|
|
102
|
+
const affectedFields = [];
|
|
103
|
+
/** @type {Record<string, SyncJsonValue>} */
|
|
104
|
+
const mergedAttributes = {};
|
|
105
|
+
for (const [field, localValue] of Object.entries(mutationAttributes)) {
|
|
106
|
+
const baseValue = baseRecord.attributes[field];
|
|
107
|
+
const serverValue = serverRecord.attributes[field];
|
|
108
|
+
if (jsonValuesEqual(serverValue, baseValue) || jsonValuesEqual(serverValue, localValue)) {
|
|
109
|
+
mergedAttributes[field] = localValue;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
affectedFields.push(field);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (affectedFields.length > 0)
|
|
116
|
+
return conflictResult({ affectedFields, baseRecord, mutation, serverRecord, strategy, versionAttribute });
|
|
117
|
+
return { attributes: mergedAttributes, status: "applied", strategy };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Checks whether current server state conflicts with a mutation base version.
|
|
121
|
+
* @param {object} args - Arguments.
|
|
122
|
+
* @param {import("./device-identity.js").SyncMutation} args.mutation - Mutation.
|
|
123
|
+
* @param {SyncConflictRecord | null} args.serverRecord - Server record.
|
|
124
|
+
* @param {string} args.versionAttribute - Version attribute.
|
|
125
|
+
* @returns {boolean} - Whether versions conflict.
|
|
126
|
+
*/
|
|
127
|
+
function hasVersionConflict({ mutation, serverRecord, versionAttribute }) {
|
|
128
|
+
if (!serverRecord)
|
|
129
|
+
return false;
|
|
130
|
+
if (mutation.baseVersion === undefined || mutation.baseVersion === null)
|
|
131
|
+
return false;
|
|
132
|
+
const serverVersion = serverRecord.version ?? serverRecord.attributes[versionAttribute] ?? null;
|
|
133
|
+
return !jsonValuesEqual(serverVersion, mutation.baseVersion);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Builds a structured conflict result.
|
|
137
|
+
* @param {object} args - Arguments.
|
|
138
|
+
* @param {string[]} [args.affectedFields] - Explicit affected fields.
|
|
139
|
+
* @param {SyncConflictRecord | null} args.baseRecord - Base record.
|
|
140
|
+
* @param {import("./device-identity.js").SyncMutation} args.mutation - Mutation.
|
|
141
|
+
* @param {SyncConflictRecord | null} args.serverRecord - Server record.
|
|
142
|
+
* @param {string} args.strategy - Strategy.
|
|
143
|
+
* @param {string} args.versionAttribute - Version attribute.
|
|
144
|
+
* @returns {SyncConflictResult} - Conflict result.
|
|
145
|
+
*/
|
|
146
|
+
function conflictResult({ affectedFields, baseRecord, mutation, serverRecord, strategy, versionAttribute }) {
|
|
147
|
+
const mutationAttributes = mutationAttributesFor(mutation);
|
|
148
|
+
return {
|
|
149
|
+
conflict: {
|
|
150
|
+
affectedFields: affectedFields || Object.keys(mutationAttributes),
|
|
151
|
+
baseRecord: baseRecord ? baseRecord.attributes : null,
|
|
152
|
+
baseVersion: /** @type {SyncJsonValue} */ (mutation.baseVersion ?? null),
|
|
153
|
+
localMutation: {
|
|
154
|
+
attributes: mutationAttributes,
|
|
155
|
+
clientMutationId: mutation.clientMutationId,
|
|
156
|
+
model: mutation.model,
|
|
157
|
+
operation: mutation.operation,
|
|
158
|
+
payload: /** @type {SyncJsonValue} */ (mutation.payload || null)
|
|
159
|
+
},
|
|
160
|
+
serverModel: serverRecord ? serverRecord.attributes : null,
|
|
161
|
+
serverVersion: serverRecord ? /** @type {SyncJsonValue} */ (serverRecord.version ?? serverRecord.attributes[versionAttribute] ?? null) : null,
|
|
162
|
+
suggestedResolution: strategy === "serverWins" ? "keep_server" : "manual",
|
|
163
|
+
versionAttribute
|
|
164
|
+
},
|
|
165
|
+
status: "conflict",
|
|
166
|
+
strategy
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Normalizes a custom resource conflict result.
|
|
171
|
+
* @param {unknown} result - Raw result.
|
|
172
|
+
* @param {string} strategy - Requested strategy.
|
|
173
|
+
* @returns {SyncConflictResult} - Normalized result.
|
|
174
|
+
*/
|
|
175
|
+
function normalizeConflictResult(result, strategy) {
|
|
176
|
+
if (!result || typeof result !== "object" || Array.isArray(result))
|
|
177
|
+
throw new Error("Sync conflict handler must return an object");
|
|
178
|
+
const resultRecord = /** @type {Record<string, unknown>} */ (result);
|
|
179
|
+
if (!["applied", "conflict", "rejected"].includes(String(resultRecord.status)))
|
|
180
|
+
throw new Error("Sync conflict handler returned an unknown status");
|
|
181
|
+
return /** @type {SyncConflictResult} */ ({ strategy, ...resultRecord });
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Returns mutation attributes as a JSON object.
|
|
185
|
+
* @param {import("./device-identity.js").SyncMutation} mutation - Mutation.
|
|
186
|
+
* @returns {Record<string, SyncJsonValue>} - Attributes.
|
|
187
|
+
*/
|
|
188
|
+
function mutationAttributesFor(mutation) {
|
|
189
|
+
if (!mutation.attributes || typeof mutation.attributes !== "object" || Array.isArray(mutation.attributes))
|
|
190
|
+
return {};
|
|
191
|
+
return /** @type {Record<string, SyncJsonValue>} */ (JSON.parse(JSON.stringify(mutation.attributes)));
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Compares JSON values by stable serialization.
|
|
195
|
+
* @param {unknown} left - Left value.
|
|
196
|
+
* @param {unknown} right - Right value.
|
|
197
|
+
* @returns {boolean} - Whether values match.
|
|
198
|
+
*/
|
|
199
|
+
function jsonValuesEqual(left, right) {
|
|
200
|
+
return stableJsonStringify(left) === stableJsonStringify(right);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Stable JSON stringify helper.
|
|
204
|
+
* @param {unknown} value - Value.
|
|
205
|
+
* @returns {string} - Stable JSON.
|
|
206
|
+
*/
|
|
207
|
+
function stableJsonStringify(value) {
|
|
208
|
+
if (Array.isArray(value))
|
|
209
|
+
return `[${value.map((entry) => stableJsonStringify(entry)).join(",")}]`;
|
|
210
|
+
if (value && typeof value === "object") {
|
|
211
|
+
return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${stableJsonStringify(/** @type {Record<string, unknown>} */ (value)[key])}`).join(",")}}`;
|
|
212
|
+
}
|
|
213
|
+
return JSON.stringify(value);
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmxpY3Qtc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9jb25mbGljdC1zdHJhdGVneS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtBQUV6SDs7R0FFRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxFQUFDLFVBQVUsR0FBRyxJQUFJLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxZQUFZLEdBQUcsSUFBSSxFQUFFLFFBQVEsR0FBRyxtQkFBbUIsRUFBRSxnQkFBZ0IsR0FBRyxXQUFXLEVBQUM7SUFDekssSUFBSSxhQUFhO1FBQUUsT0FBTyx1QkFBdUIsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDbEosSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxRQUFRLEdBQUcsQ0FBQyxDQUFBO0lBRXZHLE1BQU0sa0JBQWtCLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFMUQsSUFBSSxRQUFRLEtBQUssWUFBWSxJQUFJLFFBQVEsS0FBSyxnQkFBZ0I7UUFBRSxPQUFPLEVBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFDLENBQUE7SUFDcEksSUFBSSxRQUFRLEtBQUssZUFBZTtRQUFFLE9BQU8sbUJB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QTtBQUNqRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsS0FBSztJQUNoQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUE7SUFDbEcsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksbUJBQW1CLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQTtJQUN0SyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuY29uc3QgQ09ORkxJQ1RfU1RSQVRFR0lFUyA9IG5ldyBTZXQoW1wib3B0aW1pc3RpY1ZlcnNpb25cIiwgXCJzZXJ2ZXJXaW5zXCIsIFwibGFzdFdyaXRlcldpbnNcIiwgXCJmaWVsZFRocmVlV2F5XCIsIFwiYXBwZW5kT25seVwiXSlcblxuLyoqXG4gKiBAdHlwZWRlZiB7bnVsbCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmtub3duW10gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gU3luY0pzb25WYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY0NvbmZsaWN0UmVjb3JkXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSBhdHRyaWJ1dGVzIC0gUmVjb3JkIGF0dHJpYnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsfSBbdmVyc2lvbl0gLSBSZWNvcmQgdmVyc2lvbiB2YWx1ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDb25mbGljdFJlc3VsdFxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gW2F0dHJpYnV0ZXNdIC0gQXR0cmlidXRlcyB0byBhcHBseSB3aGVuIHJlcGxheSBtYXkgY29udGludWUuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSBbY29uZmxpY3RdIC0gU3RydWN0dXJlZCBjb25mbGljdCBwYXlsb2FkIGZvciB0aGUgY2xpZW50L2xvY2FsIGxvZy5cbiAqIEBwcm9wZXJ0eSB7XCJhcHBsaWVkXCIgfCBcImNvbmZsaWN0XCIgfCBcInJlamVjdGVkXCJ9IHN0YXR1cyAtIENvbmZsaWN0IGRlY2lzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0cmF0ZWd5IC0gU3RyYXRlZ3kgdGhhdCBwcm9kdWNlZCB0aGUgZGVjaXNpb24uXG4gKi9cblxuLyoqXG4gKiBFdmFsdWF0ZXMgYSByZXBsYXkgbXV0YXRpb24gYWdhaW5zdCBzZXJ2ZXIvYmFzZSBzdGF0ZSB1c2luZyBhIHN5bmMgY29uZmxpY3Qgc3RyYXRlZ3kuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gW2FyZ3MuYmFzZVJlY29yZF0gLSBSZWNvcmQgc3RhdGUgb2JzZXJ2ZWQgd2hlbiB0aGUgbXV0YXRpb24gd2FzIG1hZGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG9iamVjdCk6IChTeW5jQ29uZmxpY3RSZXN1bHQgfCBQcm9taXNlPFN5bmNDb25mbGljdFJlc3VsdD4pfSBbYXJncy5jdXN0b21IYW5kbGVyXSAtIFJlc291cmNlLXNwZWNpZmljIGNvbmZsaWN0IGhvb2suXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIFJlcGxheWVkIG11dGF0aW9uLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBbYXJncy5zZXJ2ZXJSZWNvcmRdIC0gQ3VycmVudCBhdXRob3JpdGF0aXZlIHNlcnZlciByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc3RyYXRlZ3ldIC0gQ29uZmxpY3Qgc3RyYXRlZ3kuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudmVyc2lvbkF0dHJpYnV0ZV0gLSBBdHRyaWJ1dGUgdXNlZCBmb3Igb3B0aW1pc3RpYyB2ZXJzaW9uIGNoZWNrcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNDb25mbGljdFJlc3VsdD59IC0gQ29uZmxpY3QgZGVjaXNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU3luY0NvbmZsaWN0KHtiYXNlUmVjb3JkID0gbnVsbCwgY3VzdG9tSGFuZGxlciwgbXV0YXRpb24sIHNlcnZlclJlY29yZCA9IG51bGwsIHN0cmF0ZWd5ID0gXCJvcHRpbWlzdGljVmVyc2lvblwiLCB2ZXJzaW9uQXR0cmlidXRlID0gXCJ1cGRhdGVkQXRcIn0pIHtcbiAgaWYgKGN1c3RvbUhhbmRsZXIpIHJldHVybiBub3JtYWxpemVDb25mbGljdFJlc3VsdChhd2FpdCBjdXN0b21IYW5kbGVyKHtiYXNlUmVjb3JkLCBtdXRhdGlvbiwgc2VydmVyUmVjb3JkLCBzdHJhdGVneSwgdmVyc2lvbkF0dHJpYnV0ZX0pLCBzdHJhdGVneSlcbiAgaWYgKCFDT05GTElDVF9TVFJBVEVHSUVTLmhhcyhzdHJhdGVneSkpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzeW5jIGNvbmZsaWN0IHN0cmF0ZWd5ICcke3N0cmF0ZWd5fSdgKVxuXG4gIGNvbnN0IG11dGF0aW9uQXR0cmlidXRlcyA9IG11dGF0aW9uQXR0cmlidXRlc0ZvcihtdXRhdGlvbilcblxuICBpZiAoc3RyYXRlZ3kgPT09IFwiYXBwZW5kT25seVwiIHx8IHN0cmF0ZWd5ID09PSBcImxhc3RXcml0ZXJXaW5zXCIpIHJldHVybiB7YXR0cmlidXRlczogbXV0YXRpb25BdHRyaWJ1dGVzLCBzdGF0dXM6IFwiYXBwbGllZFwiLCBzdHJhdGVneX1cbiAgaWYgKHN0cmF0ZWd5ID09PSBcImZpZWxkVGhyZWVXYXlcIikgcmV0dXJuIGZpZWxkVGhyZWVXYXlSZXN1bHQoe2Jhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSlcbiAgaWYgKGhhc1ZlcnNpb25Db25mbGljdCh7bXV0YXRpb24sIHNlcnZlclJlY29yZCwgdmVyc2lvbkF0dHJpYnV0ZX0pKSByZXR1cm4gY29uZmxpY3RSZXN1bHQoe2Jhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSlcblxuICByZXR1cm4ge2F0dHJpYnV0ZXM6IG11dGF0aW9uQXR0cmlidXRlcywgc3RhdHVzOiBcImFwcGxpZWRcIiwgc3RyYXRlZ3l9XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNlcnZlciByZXBsYXkgcmVzdWx0IHRvIGEgbG9jYWwgbXV0YXRpb24tbG9nIHJlY29yZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5kZWZhdWx0fSBhcmdzLm11dGF0aW9uTG9nIC0gTG9jYWwgbXV0YXRpb24gbG9nLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkfSBhcmdzLnJlY29yZCAtIExvY2FsIG11dGF0aW9uLWxvZyByZWNvcmQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSBhcmdzLnJlc3VsdCAtIFNlcnZlciByZXBsYXkgcmVzdWx0IHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkPn0gLSBVcGRhdGVkIGxvY2FsIHJlY29yZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5U3luY1JlcGxheVJlc3VsdFRvTG9jYWxNdXRhdGlvbkxvZyh7bXV0YXRpb25Mb2csIHJlY29yZCwgcmVzdWx0fSkge1xuICByZXR1cm4gYXdhaXQgbXV0YXRpb25Mb2cudXBkYXRlU3RhdHVzKHtcbiAgICBpZDogcmVjb3JkLmlkLFxuICAgIHN0YXR1czogcmVwbGF5UmVzdWx0TG9jYWxTdGF0dXMocmVzdWx0KSxcbiAgICBzeW5jUmVzdWx0OiByZXN1bHRcbiAgfSlcbn1cblxuLyoqXG4gKiBNYXBzIGEgc2VydmVyIHJlcGxheSByZXN1bHQgdG8gYSBsb2NhbCBtdXRhdGlvbi1sb2cgc3RhdHVzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gcmVzdWx0IC0gUmVwbGF5IHJlc3VsdC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uU3RhdHVzfSAtIExvY2FsIG11dGF0aW9uLWxvZyBzdGF0dXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYXlSZXN1bHRMb2NhbFN0YXR1cyhyZXN1bHQpIHtcbiAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiY29uZmxpY3RcIikgcmV0dXJuIFwiY29uZmxpY3RcIlxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJlcnJvclwiIHx8IHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikgcmV0dXJuIFwicmVqZWN0ZWRcIlxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIgJiYgcmVwbGF5UmVzdWx0SGFzRmFpbGVkQXBwbGljYXRpb24ocmVzdWx0KSkgcmV0dXJuIFwicmVqZWN0ZWRcIlxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIgfHwgcmVzdWx0LnN0YXR1cyA9PT0gXCJhcHBsaWVkXCIgfHwgcmVzdWx0LnN0YXR1cyA9PT0gXCJkdXBsaWNhdGVcIikgcmV0dXJuIFwic3luY2VkXCJcblxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3luYyByZXBsYXkgcmVzdWx0IHN0YXR1cyAnJHtTdHJpbmcocmVzdWx0LnN0YXR1cyl9J2ApXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYW4gb3RoZXJ3aXNlIHN1Y2Nlc3NmdWwgcmVwbGF5IHJlc3VsdCBjb250YWlucyBhIGZhaWxlZFxuICogZnJvbnRlbmQtbW9kZWwgY29tbWFuZCBvciBjaGFuZ2UtZmVlZCB3cml0ZS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgU3luY0pzb25WYWx1ZT59IHJlc3VsdCAtIFJlcGxheSByZXN1bHQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBsb2NhbCBtdXRhdGlvbiBtdXN0IHN0YXkgdW5zeW5jZWQuXG4gKi9cbmZ1bmN0aW9uIHJlcGxheVJlc3VsdEhhc0ZhaWxlZEFwcGxpY2F0aW9uKHJlc3VsdCkge1xuICBpZiAocmVzdWx0LnNlcnZlclNlcXVlbmNlID09PSBudWxsIHx8IHJlc3VsdC5zZXJ2ZXJDaGFuZ2VGZWVkU3RhdHVzID09PSBcImVycm9yXCIpIHJldHVybiB0cnVlXG4gIGlmICghcmVzdWx0LnJlc3BvbnNlIHx8IHR5cGVvZiByZXN1bHQucmVzcG9uc2UgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShyZXN1bHQucmVzcG9uc2UpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gKi8gKHJlc3VsdC5yZXNwb25zZSkuc3RhdHVzID09PSBcImVycm9yXCJcbn1cblxuLyoqXG4gKiBSdW5zIGEgZmllbGQtbGV2ZWwgdGhyZWUtd2F5IG1lcmdlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge1N5bmNDb25mbGljdFJlY29yZCB8IG51bGx9IGFyZ3MuYmFzZVJlY29yZCAtIEJhc2UgcmVjb3JkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2RldmljZS1pZGVudGl0eS5qc1wiKS5TeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbi5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gYXJncy5zZXJ2ZXJSZWNvcmQgLSBTZXJ2ZXIgcmVjb3JkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3RyYXRlZ3kgLSBTdHJhdGVneS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZlcnNpb25BdHRyaWJ1dGUgLSBWZXJzaW9uIGF0dHJpYnV0ZS5cbiAqIEByZXR1cm5zIHtTeW5jQ29uZmxpY3RSZXN1bHR9IC0gQ29uZmxpY3QgZGVjaXNpb24uXG4gKi9cbmZ1bmN0aW9uIGZpZWxkVGhyZWVXYXlSZXN1bHQoe2Jhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSkge1xuICBpZiAoIWJhc2VSZWNvcmQgfHwgIXNlcnZlclJlY29yZCkgcmV0dXJuIHthdHRyaWJ1dGVzOiBtdXRhdGlvbkF0dHJpYnV0ZXNGb3IobXV0YXRpb24pLCBzdGF0dXM6IFwiYXBwbGllZFwiLCBzdHJhdGVneX1cblxuICBjb25zdCBtdXRhdGlvbkF0dHJpYnV0ZXMgPSBtdXRhdGlvbkF0dHJpYnV0ZXNGb3IobXV0YXRpb24pXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGFmZmVjdGVkRmllbGRzID0gW11cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gKi9cbiAgY29uc3QgbWVyZ2VkQXR0cmlidXRlcyA9IHt9XG5cbiAgZm9yIChjb25zdCBbZmllbGQsIGxvY2FsVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG11dGF0aW9uQXR0cmlidXRlcykpIHtcbiAgICBjb25zdCBiYXNlVmFsdWUgPSBiYXNlUmVjb3JkLmF0dHJpYnV0ZXNbZmllbGRdXG4gICAgY29uc3Qgc2VydmVyVmFsdWUgPSBzZXJ2ZXJSZWNvcmQuYXR0cmlidXRlc1tmaWVsZF1cblxuICAgIGlmIChqc29uVmFsdWVzRXF1YWwoc2VydmVyVmFsdWUsIGJhc2VWYWx1ZSkgfHwganNvblZhbHVlc0VxdWFsKHNlcnZlclZhbHVlLCBsb2NhbFZhbHVlKSkge1xuICAgICAgbWVyZ2VkQXR0cmlidXRlc1tmaWVsZF0gPSBsb2NhbFZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGFmZmVjdGVkRmllbGRzLnB1c2goZmllbGQpXG4gICAgfVxuICB9XG5cbiAgaWYgKGFmZmVjdGVkRmllbGRzLmxlbmd0aCA+IDApIHJldHVybiBjb25mbGljdFJlc3VsdCh7YWZmZWN0ZWRGaWVsZHMsIGJhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSlcblxuICByZXR1cm4ge2F0dHJpYnV0ZXM6IG1lcmdlZEF0dHJpYnV0ZXMsIHN0YXR1czogXCJhcHBsaWVkXCIsIHN0cmF0ZWd5fVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGN1cnJlbnQgc2VydmVyIHN0YXRlIGNvbmZsaWN0cyB3aXRoIGEgbXV0YXRpb24gYmFzZSB2ZXJzaW9uLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBhcmdzLnNlcnZlclJlY29yZCAtIFNlcnZlciByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52ZXJzaW9uQXR0cmlidXRlIC0gVmVyc2lvbiBhdHRyaWJ1dGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHZlcnNpb25zIGNvbmZsaWN0LlxuICovXG5mdW5jdGlvbiBoYXNWZXJzaW9uQ29uZmxpY3Qoe211dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHZlcnNpb25BdHRyaWJ1dGV9KSB7XG4gIGlmICghc2VydmVyUmVjb3JkKSByZXR1cm4gZmFsc2VcbiAgaWYgKG11dGF0aW9uLmJhc2VWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgbXV0YXRpb24uYmFzZVZlcnNpb24gPT09IG51bGwpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHNlcnZlclZlcnNpb24gPSBzZXJ2ZXJSZWNvcmQudmVyc2lvbiA/PyBzZXJ2ZXJSZWNvcmQuYXR0cmlidXRlc1t2ZXJzaW9uQXR0cmlidXRlXSA/PyBudWxsXG5cbiAgcmV0dXJuICFqc29uVmFsdWVzRXF1YWwoc2VydmVyVmVyc2lvbiwgbXV0YXRpb24uYmFzZVZlcnNpb24pXG59XG5cbi8qKlxuICogQnVpbGRzIGEgc3RydWN0dXJlZCBjb25mbGljdCByZXN1bHQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLmFmZmVjdGVkRmllbGRzXSAtIEV4cGxpY2l0IGFmZmVjdGVkIGZpZWxkcy5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gYXJncy5iYXNlUmVjb3JkIC0gQmFzZSByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBhcmdzLnNlcnZlclJlY29yZCAtIFNlcnZlciByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdHJhdGVneSAtIFN0cmF0ZWd5LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmVyc2lvbkF0dHJpYnV0ZSAtIFZlcnNpb24gYXR0cmlidXRlLlxuICogQHJldHVybnMge1N5bmNDb25mbGljdFJlc3VsdH0gLSBDb25mbGljdCByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNvbmZsaWN0UmVzdWx0KHthZmZlY3RlZEZpZWxkcywgYmFzZVJlY29yZCwgbXV0YXRpb24sIHNlcnZlclJlY29yZCwgc3RyYXRlZ3ksIHZlcnNpb25BdHRyaWJ1dGV9KSB7XG4gIGNvbnN0IG11dGF0aW9uQXR0cmlidXRlcyA9IG11dGF0aW9uQXR0cmlidXRlc0ZvcihtdXRhdGlvbilcblxuICByZXR1cm4ge1xuICAgIGNvbmZsaWN0OiB7XG4gICAgICBhZmZlY3RlZEZpZWxkczogYWZmZWN0ZWRGaWVsZHMgfHwgT2JqZWN0LmtleXMobXV0YXRpb25BdHRyaWJ1dGVzKSxcbiAgICAgIGJhc2VSZWNvcmQ6IGJhc2VSZWNvcmQgPyBiYXNlUmVjb3JkLmF0dHJpYnV0ZXMgOiBudWxsLFxuICAgICAgYmFzZVZlcnNpb246IC8qKiBAdHlwZSB7U3luY0pzb25WYWx1ZX0gKi8gKG11dGF0aW9uLmJhc2VWZXJzaW9uID8/IG51bGwpLFxuICAgICAgbG9jYWxNdXRhdGlvbjoge1xuICAgICAgICBhdHRyaWJ1dGVzOiBtdXRhdGlvbkF0dHJpYnV0ZXMsXG4gICAgICAgIGNsaWVudE11dGF0aW9uSWQ6IG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsXG4gICAgICAgIG1vZGVsOiBtdXRhdGlvbi5tb2RlbCxcbiAgICAgICAgb3BlcmF0aW9uOiBtdXRhdGlvbi5vcGVyYXRpb24sXG4gICAgICAgIHBheWxvYWQ6IC8qKiBAdHlwZSB7U3luY0pzb25WYWx1ZX0gKi8gKG11dGF0aW9uLnBheWxvYWQgfHwgbnVsbClcbiAgICAgIH0sXG4gICAgICBzZXJ2ZXJNb2RlbDogc2VydmVyUmVjb3JkID8gc2VydmVyUmVjb3JkLmF0dHJpYnV0ZXMgOiBudWxsLFxuICAgICAgc2VydmVyVmVyc2lvbjogc2VydmVyUmVjb3JkID8gLyoqIEB0eXBlIHtTeW5jSnNvblZhbHVlfSAqLyAoc2VydmVyUmVjb3JkLnZlcnNpb24gPz8gc2VydmVyUmVjb3JkLmF0dHJpYnV0ZXNbdmVyc2lvbkF0dHJpYnV0ZV0gPz8gbnVsbCkgOiBudWxsLFxuICAgICAgc3VnZ2VzdGVkUmVzb2x1dGlvbjogc3RyYXRlZ3kgPT09IFwic2VydmVyV2luc1wiID8gXCJrZWVwX3NlcnZlclwiIDogXCJtYW51YWxcIixcbiAgICAgIHZlcnNpb25BdHRyaWJ1dGVcbiAgICB9LFxuICAgIHN0YXR1czogXCJjb25mbGljdFwiLFxuICAgIHN0cmF0ZWd5XG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgY3VzdG9tIHJlc291cmNlIGNvbmZsaWN0IHJlc3VsdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcmVzdWx0IC0gUmF3IHJlc3VsdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJhdGVneSAtIFJlcXVlc3RlZCBzdHJhdGVneS5cbiAqIEByZXR1cm5zIHtTeW5jQ29uZmxpY3RSZXN1bHR9IC0gTm9ybWFsaXplZCByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZsaWN0UmVzdWx0KHJlc3VsdCwgc3RyYXRlZ3kpIHtcbiAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJlc3VsdCkpIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY29uZmxpY3QgaGFuZGxlciBtdXN0IHJldHVybiBhbiBvYmplY3RcIilcbiAgY29uc3QgcmVzdWx0UmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHJlc3VsdClcbiAgaWYgKCFbXCJhcHBsaWVkXCIsIFwiY29uZmxpY3RcIiwgXCJyZWplY3RlZFwiXS5pbmNsdWRlcyhTdHJpbmcocmVzdWx0UmVjb3JkLnN0YXR1cykpKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIGNvbmZsaWN0IGhhbmRsZXIgcmV0dXJuZWQgYW4gdW5rbm93biBzdGF0dXNcIilcblxuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jQ29uZmxpY3RSZXN1bHR9ICovICh7c3RyYXRlZ3ksIC4uLnJlc3VsdFJlY29yZH0pXG59XG5cbi8qKlxuICogUmV0dXJucyBtdXRhdGlvbiBhdHRyaWJ1dGVzIGFzIGEgSlNPTiBvYmplY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gbXV0YXRpb24gLSBNdXRhdGlvbi5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gLSBBdHRyaWJ1dGVzLlxuICovXG5mdW5jdGlvbiBtdXRhdGlvbkF0dHJpYnV0ZXNGb3IobXV0YXRpb24pIHtcbiAgaWYgKCFtdXRhdGlvbi5hdHRyaWJ1dGVzIHx8IHR5cGVvZiBtdXRhdGlvbi5hdHRyaWJ1dGVzICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobXV0YXRpb24uYXR0cmlidXRlcykpIHJldHVybiB7fVxuXG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSAqLyAoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtdXRhdGlvbi5hdHRyaWJ1dGVzKSkpXG59XG5cbi8qKlxuICogQ29tcGFyZXMgSlNPTiB2YWx1ZXMgYnkgc3RhYmxlIHNlcmlhbGl6YXRpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGxlZnQgLSBMZWZ0IHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSByaWdodCAtIFJpZ2h0IHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB2YWx1ZXMgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGpzb25WYWx1ZXNFcXVhbChsZWZ0LCByaWdodCkge1xuICByZXR1cm4gc3RhYmxlSnNvblN0cmluZ2lmeShsZWZ0KSA9PT0gc3RhYmxlSnNvblN0cmluZ2lmeShyaWdodClcbn1cblxuLyoqXG4gKiBTdGFibGUgSlNPTiBzdHJpbmdpZnkgaGVscGVyLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBTdGFibGUgSlNPTi5cbiAqL1xuZnVuY3Rpb24gc3RhYmxlSnNvblN0cmluZ2lmeSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBgWyR7dmFsdWUubWFwKChlbnRyeSkgPT4gc3RhYmxlSnNvblN0cmluZ2lmeShlbnRyeSkpLmpvaW4oXCIsXCIpfV1gXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gYHske09iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkubWFwKChrZXkpID0+IGAke0pTT04uc3RyaW5naWZ5KGtleSl9OiR7c3RhYmxlSnNvblN0cmluZ2lmeSgvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpW2tleV0pfWApLmpvaW4oXCIsXCIpfX1gXG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG59XG4iXX0=
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Peer mutation bundle exported by a device for offline/P2P transfer.
|
|
3
|
+
* @typedef {object} PeerMutationBundle
|
|
4
|
+
* @property {string} exportedAt - ISO timestamp when the bundle was exported.
|
|
5
|
+
* @property {"velocious.sync.peer-mutation-bundle.v1"} format - Bundle format identifier.
|
|
6
|
+
* @property {PeerMutationBundleEntry[]} mutations - Signed mutations in local sequence order.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* One peer mutation bundle entry.
|
|
10
|
+
* @typedef {object} PeerMutationBundleEntry
|
|
11
|
+
* @property {string} [localRecordId] - Exporting device's local mutation record id.
|
|
12
|
+
* @property {number} [localSequence] - Exporting device's local mutation sequence.
|
|
13
|
+
* @property {import("./device-identity.js").SignedSyncMutation} signedMutation - Device-signed mutation envelope.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Exports local non-terminal mutations as a signed peer-transfer bundle.
|
|
17
|
+
* @param {object} args - Arguments.
|
|
18
|
+
* @param {import("./device-identity.js").DeviceCertificate} args.deviceCertificate - Device certificate for signing records.
|
|
19
|
+
* @param {import("./device-identity.js").SyncJsonWebKey} args.devicePrivateKey - Device private key for signing records.
|
|
20
|
+
* @param {import("./local-mutation-log.js").default} args.mutationLog - Local mutation log.
|
|
21
|
+
* @param {() => Date} [args.now] - Export clock.
|
|
22
|
+
* @param {import("./local-mutation-log.js").LocalMutationStatus[]} [args.statuses] - Statuses to export.
|
|
23
|
+
* @returns {Promise<PeerMutationBundle>} - Signed peer mutation bundle.
|
|
24
|
+
*/
|
|
25
|
+
export function exportPeerMutationBundle({ deviceCertificate, devicePrivateKey, mutationLog, now, statuses }: {
|
|
26
|
+
deviceCertificate: import("./device-identity.js").DeviceCertificate;
|
|
27
|
+
devicePrivateKey: import("./device-identity.js").SyncJsonWebKey;
|
|
28
|
+
mutationLog: import("./local-mutation-log.js").default;
|
|
29
|
+
now?: (() => Date) | undefined;
|
|
30
|
+
statuses?: import("./local-mutation-log.js").LocalMutationStatus[] | undefined;
|
|
31
|
+
}): Promise<PeerMutationBundle>;
|
|
32
|
+
/**
|
|
33
|
+
* Imports verified peer mutations into the local mutation log.
|
|
34
|
+
* @param {object} args - Arguments.
|
|
35
|
+
* @param {import("./device-identity.js").SyncJsonWebKey} args.backendPublicKey - Backend public key for verifying peer certificates.
|
|
36
|
+
* @param {PeerMutationBundle} args.bundle - Peer bundle to import.
|
|
37
|
+
* @param {import("./local-mutation-log.js").default} args.mutationLog - Local mutation log.
|
|
38
|
+
* @param {Date} [args.now] - Verification time.
|
|
39
|
+
* @returns {Promise<{imported: {clientMutationId: string, idempotencyKey: string, localRecordId: string}[], rejected: {errorMessage: string, index: number}[], skipped: {clientMutationId: string, idempotencyKey: string, localRecordId: string, reason: "duplicate"}[]}>} - Import result.
|
|
40
|
+
*/
|
|
41
|
+
export function importPeerMutationBundle({ backendPublicKey, bundle, mutationLog, now }: {
|
|
42
|
+
backendPublicKey: import("./device-identity.js").SyncJsonWebKey;
|
|
43
|
+
bundle: PeerMutationBundle;
|
|
44
|
+
mutationLog: import("./local-mutation-log.js").default;
|
|
45
|
+
now?: Date | undefined;
|
|
46
|
+
}): Promise<{
|
|
47
|
+
imported: {
|
|
48
|
+
clientMutationId: string;
|
|
49
|
+
idempotencyKey: string;
|
|
50
|
+
localRecordId: string;
|
|
51
|
+
}[];
|
|
52
|
+
rejected: {
|
|
53
|
+
errorMessage: string;
|
|
54
|
+
index: number;
|
|
55
|
+
}[];
|
|
56
|
+
skipped: {
|
|
57
|
+
clientMutationId: string;
|
|
58
|
+
idempotencyKey: string;
|
|
59
|
+
localRecordId: string;
|
|
60
|
+
reason: "duplicate";
|
|
61
|
+
}[];
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Peer mutation bundle exported by a device for offline/P2P transfer.
|
|
65
|
+
*/
|
|
66
|
+
export type PeerMutationBundle = {
|
|
67
|
+
/**
|
|
68
|
+
* - ISO timestamp when the bundle was exported.
|
|
69
|
+
*/
|
|
70
|
+
exportedAt: string;
|
|
71
|
+
/**
|
|
72
|
+
* - Bundle format identifier.
|
|
73
|
+
*/
|
|
74
|
+
format: "velocious.sync.peer-mutation-bundle.v1";
|
|
75
|
+
/**
|
|
76
|
+
* - Signed mutations in local sequence order.
|
|
77
|
+
*/
|
|
78
|
+
mutations: PeerMutationBundleEntry[];
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* One peer mutation bundle entry.
|
|
82
|
+
*/
|
|
83
|
+
export type PeerMutationBundleEntry = {
|
|
84
|
+
/**
|
|
85
|
+
* - Exporting device's local mutation record id.
|
|
86
|
+
*/
|
|
87
|
+
localRecordId?: string | undefined;
|
|
88
|
+
/**
|
|
89
|
+
* - Exporting device's local mutation sequence.
|
|
90
|
+
*/
|
|
91
|
+
localSequence?: number | undefined;
|
|
92
|
+
/**
|
|
93
|
+
* - Device-signed mutation envelope.
|
|
94
|
+
*/
|
|
95
|
+
signedMutation: import("./device-identity.js").SignedSyncMutation;
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=peer-mutation-bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-mutation-bundle.d.ts","sourceRoot":"","sources":["../../../src/sync/peer-mutation-bundle.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AAEH;;;;;;GAMG;AAEH;;;;;;;;;GASG;AACH,8GAPG;IAA+D,iBAAiB,EAAxE,OAAO,sBAAsB,EAAE,iBAAiB;IACI,gBAAgB,EAApE,OAAO,sBAAsB,EAAE,cAAc;IACG,WAAW,EAA3D,OAAO,yBAAyB,EAAE,OAAO;IACvB,GAAG,UAAf,IAAI;IACqD,QAAQ;CAC/E,GAAU,OAAO,CAAC,kBAAkB,CAAC,CA2BvC;AAED;;;;;;;;GAQG;AACH,yFANG;IAA4D,gBAAgB,EAApE,OAAO,sBAAsB,EAAE,cAAc;IACpB,MAAM,EAA/B,kBAAkB;IAC8B,WAAW,EAA3D,OAAO,yBAAyB,EAAE,OAAO;IAC7B,GAAG;CACvB,GAAU,OAAO,CAAC;IAAC,QAAQ,EAAE;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;IAAC,QAAQ,EAAE;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;IAAC,OAAO,EAAE;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAC,EAAE,CAAA;CAAC,CAAC,CAsC1Q;;;;;;;;gBA/Fa,MAAM;;;;YACN,wCAAwC;;;;eACxC,uBAAuB,EAAE;;;;;;;;;;;;;;;;;oBAQzB,OAAO,sBAAsB,EAAE,kBAAkB"}
|