velocious 1.0.492 → 1.0.494

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/build/database/drivers/base.js +6 -0
  2. package/build/database/query/insert-base.js +1 -1
  3. package/build/src/database/drivers/base.d.ts +5 -0
  4. package/build/src/database/drivers/base.d.ts.map +1 -1
  5. package/build/src/database/drivers/base.js +6 -1
  6. package/build/src/database/query/insert-base.js +2 -2
  7. package/build/src/sync/server-sequence-allocator.d.ts +106 -0
  8. package/build/src/sync/server-sequence-allocator.d.ts.map +1 -0
  9. package/build/src/sync/server-sequence-allocator.js +220 -0
  10. package/build/src/sync/sync-attribute-normalizer.d.ts +105 -0
  11. package/build/src/sync/sync-attribute-normalizer.d.ts.map +1 -0
  12. package/build/src/sync/sync-attribute-normalizer.js +172 -0
  13. package/build/src/sync/sync-envelope-replay-service.d.ts +116 -7
  14. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  15. package/build/src/sync/sync-envelope-replay-service.js +103 -10
  16. package/build/src/sync/sync-replay-upsert-applier.d.ts +102 -0
  17. package/build/src/sync/sync-replay-upsert-applier.d.ts.map +1 -0
  18. package/build/src/sync/sync-replay-upsert-applier.js +158 -0
  19. package/build/src/sync/sync-resource-base.d.ts +48 -0
  20. package/build/src/sync/sync-resource-base.d.ts.map +1 -1
  21. package/build/src/sync/sync-resource-base.js +89 -1
  22. package/build/sync/server-sequence-allocator.js +246 -0
  23. package/build/sync/sync-attribute-normalizer.js +186 -0
  24. package/build/sync/sync-envelope-replay-service.js +114 -9
  25. package/build/sync/sync-replay-upsert-applier.js +179 -0
  26. package/build/sync/sync-resource-base.js +103 -0
  27. package/build/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +2 -2
  29. package/src/database/drivers/base.js +6 -0
  30. package/src/database/query/insert-base.js +1 -1
  31. package/src/sync/server-sequence-allocator.js +246 -0
  32. package/src/sync/sync-attribute-normalizer.js +186 -0
  33. package/src/sync/sync-envelope-replay-service.js +114 -9
  34. package/src/sync/sync-replay-upsert-applier.js +179 -0
  35. package/src/sync/sync-resource-base.js +103 -0
@@ -116,7 +116,7 @@ export default class VelociousDatabaseQueryInsertBase {
116
116
  sql += " VALUES ";
117
117
  sql += this._valuesSql(Object.values(this.data));
118
118
  }
119
- else if (driver.getType() == "sqlite" || driver.getType() == "mssql") {
119
+ else if (driver.getType() == "sqlite" || driver.getType() == "mssql" || driver.getType() == "pgsql") {
120
120
  sql += " DEFAULT VALUES";
121
121
  }
122
122
  else if (driver.getType() == "mysql") {
@@ -148,4 +148,4 @@ export default class VelociousDatabaseQueryInsertBase {
148
148
  return sql;
149
149
  }
150
150
  }
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zZXJ0LWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvcXVlcnkvaW5zZXJ0LWJhc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sYUFBYSxNQUFNLGdDQUFnQyxDQUFBO0FBRTFELE1BQU0sQ0FBQyxPQUFPLE9BQU8sZ0NBQWdDO0lBQ25EOzs7Ozs7Ozs7O09BVUc7SUFDSCxZQUFZLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSw2QkFBNkIsRUFBRSxJQUFJLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDeEcsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUE7UUFDOUQsSUFBSSxDQUFDLFNBQVM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBRXhGLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsNkJBQTZCLEdBQUcsNkJBQTZCLENBQUE7UUFDbEUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDOUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsS0FBSztRQUNmLElBQUksS0FBSyxLQUFLLElB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cG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi8uLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNEYXRhYmFzZVF1ZXJ5SW5zZXJ0QmFzZSB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBbYXJncy5kYXRhXSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gYXJncy5kcml2ZXIgLSBEYXRhYmFzZSBkcml2ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2FyZ3MuY29sdW1uc10gLSBDb2x1bW4gbmFtZXMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MubXVsdGlwbGVdIC0gV2hldGhlciBtdWx0aXBsZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3MucmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXNdIC0gUmV0dXJuIGxhc3QgaW5zZXJ0ZWQgY29sdW1uIG5hbWVzLlxuICAgKiBAcGFyYW0ge0FycmF5PEFycmF5PD8+Pn0gW2FyZ3Mucm93c10gLSBSb3dzIHRvIGluc2VydC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb2x1bW5zLCBkYXRhLCBkcml2ZXIsIG11bHRpcGxlLCB0YWJsZU5hbWUsIHJldHVybkxhc3RJbnNlcnRlZENvbHVtbk5hbWVzLCByb3dzLCAuLi5yZXN0QXJnc30pIHtcbiAgICBpZiAoIWRyaXZlcikgdGhyb3cgbmV3IEVycm9yKFwiTm8gZHJpdmVyIGdpdmVuIHRvIGluc2VydCBiYXNlXCIpXG4gICAgaWYgKCF0YWJsZU5hbWUpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YWJsZSBuYW1lIGdpdmVuIHRvIGluc2VydCBiYXNlOiAke3RhYmxlTmFtZX1gKVxuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnNcbiAgICB0aGlzLmRhdGEgPSBkYXRhXG4gICAgdGhpcy5kcml2ZXIgPSBkcml2ZXJcbiAgICB0aGlzLm11bHRpcGxlID0gbXVsdGlwbGVcbiAgICB0aGlzLnJldHVybkxhc3RJbnNlcnRlZENvbHVtbk5hbWVzID0gcmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXNcbiAgICB0aGlzLnJvd3MgPSByb3dzXG4gICAgdGhpcy50YWJsZU5hbWUgPSB0YWJsZU5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vcXVlcnktcGFyc2VyL29wdGlvbnMuanNcIikuZGVmYXVsdH0gLSBUaGUgb3B0aW9ucyBvcHRpb25zLlxuICAgKi9cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5kcml2ZXIub3B0aW9ucygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXQgdmFsdWUuXG4gICAqIEBwYXJhbSB7P30gdmFsdWUgLSBWYWx1ZSB0byBmb3JtYXQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXJ9IC0gU1FMIGxpdGVyYWwuXG4gICAqL1xuICBmb3JtYXRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIFwiTlVMTFwiXG5cbiAgICByZXR1cm4gdGhpcy5nZXRPcHRpb25zKCkucXVvdGUodmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBzcWwuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFNRTCBzdGF0ZW1lbnRcbiAgICovXG4gIHRvU3FsKCkge1xuICAgIGNvbnN0IHtkcml2ZXJ9ID0gdGhpc1xuXG4gICAgbGV0IHNxbCA9IGBJTlNFUlQgSU5UTyAke2RyaXZlci5xdW90ZVRhYmxlKHRoaXMudGFibGVOYW1lKX1gXG4gICAgbGV0IGNvdW50ID0gMFxuICAgIGxldCBjb2x1bW5zLCBsYXN0SW5zZXJ0ZWRTUUxcblxuICAgIGlmICh0aGlzLnJldHVybkxhc3RJbnNlcnRlZENvbHVtbk5hbWVzKSB7XG4gICAgICBpZiAoZHJpdmVyLmdldFR5cGUoKSA9PSBcIm1zc3FsXCIpIHtcbiAgICAgICAgbGFzdEluc2VydGVkU1FMID0gYCBPVVRQVVQgYFxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZXR1cm5MYXN0SW5zZXJ0ZWRDb2x1bW5OYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJldHVybkxhc3RJbnNlcnRlZENvbHVtbk5hbWVzW2ldXG5cbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGxhc3RJbnNlcnRlZFNRTCArPSBcIiwgXCJcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsYXN0SW5zZXJ0ZWRTUUwgKz0gYCBJTlNFUlRFRC4ke2RyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX1gXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kYXRhICYmIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICBzcWwgKz0gbGFzdEluc2VydGVkU1FMXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZHJpdmVyLmdldFR5cGUoKSA9PSBcIm15c3FsXCIgfHwgZHJpdmVyLmdldFR5cGUoKSA9PSBcInBnc3FsXCIgfHwgKGRyaXZlci5nZXRUeXBlKCkgPT0gXCJzcWxpdGVcIiAmJiBkcml2ZXIuc3VwcG9ydHNJbnNlcnRJbnRvUmV0dXJuaW5nKCkpKSB7XG4gICAgICAgIGxhc3RJbnNlcnRlZFNRTCA9IFwiIFJFVFVSTklORyBcIlxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZXR1cm5MYXN0SW5zZXJ0ZWRDb2x1bW5OYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJldHVybkxhc3RJbnNlcnRlZENvbHVtbk5hbWVzW2ldXG5cbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGxhc3RJbnNlcnRlZFNRTCArPSBcIiwgXCJcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsYXN0SW5zZXJ0ZWRTUUwgKz0gYCAke2RyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX1gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2x1bW5zICYmIHRoaXMucm93cykge1xuICAgICAgY29sdW1ucyA9IHRoaXMuY29sdW1uc1xuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhKSB7XG4gICAgICBjb2x1bW5zID0gT2JqZWN0LmtleXModGhpcy5kYXRhKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOZWl0aGVyICdjb2x1bW4nIGFuZCAncm93cycgb3IgZGF0YSB3YXMgZ2l2ZW5cIilcbiAgICB9XG5cbiAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBzcWwgKz0gXCIgKFwiXG5cbiAgICAgIGZvciAoY29uc3QgY29sdW1uTmFtZSBvZiBjb2x1bW5zKSB7XG4gICAgICAgIGlmIChjb3VudCA+IDApIHNxbCArPSBcIiwgXCJcblxuICAgICAgICBzcWwgKz0gZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpXG4gICAgICAgIGNvdW50KytcbiAgICAgIH1cblxuICAgICAgc3FsICs9IFwiKVwiXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXMgJiYgZHJpdmVyLmdldFR5cGUoKSA9PSBcIm1zc3FsXCIgJiYgdGhpcy5kYXRhICYmIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgc3FsICs9IGxhc3RJbnNlcnRlZFNRTFxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbHVtbnMgJiYgdGhpcy5yb3dzKSB7XG4gICAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3FsICs9IFwiIFZBTFVFUyBcIlxuICAgICAgfVxuXG4gICAgICBsZXQgY291bnQgPSAwXG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMucm93cykge1xuICAgICAgICBpZiAoY291bnQgPj0gMSkgc3FsICs9IFwiLCBcIlxuXG4gICAgICAgIGNvdW50KytcbiAgICAgICAgc3FsICs9IHRoaXMuX3ZhbHVlc1NxbChyb3cpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmRhdGEgJiYgT2JqZWN0LmtleXModGhpcy5kYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNxbCArPSBcIiBWQUxVRVMgXCJcbiAgICAgICAgc3FsICs9IHRoaXMuX3ZhbHVlc1NxbChPYmplY3QudmFsdWVzKHRoaXMuZGF0YSkpXG4gICAgICB9IGVsc2UgaWYgKGRyaXZlci5nZXRUeXBlKCkgPT0gXCJzcWxpdGVcIiB8fCBkcml2ZXIuZ2V0VHlwZSgpID09IFwibXNzcWxcIikge1xuICAgICAgICBzcWwgKz0gXCIgREVGQVVMVCBWQUxVRVNcIlxuICAgICAgfSBlbHNlIGlmIChkcml2ZXIuZ2V0VHlwZSgpID09IFwibXlzcWxcIikge1xuICAgICAgICBzcWwgKz0gXCIgKCkgVkFMVUVTICgpXCJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXR1cm5MYXN0SW5zZXJ0ZWRDb2x1bW5OYW1lcykge1xuICAgICAgaWYgKGRyaXZlci5nZXRUeXBlKCkgPT0gXCJwZ3NxbFwiIHx8IGRyaXZlci5nZXRUeXBlKCkgPT0gXCJteXNxbFwiIHx8IChkcml2ZXIuZ2V0VHlwZSgpID09IFwic3FsaXRlXCIgJiYgZHJpdmVyLnN1cHBvcnRzSW5zZXJ0SW50b1JldHVybmluZygpKSkge1xuICAgICAgICBzcWwgKz0gbGFzdEluc2VydGVkU1FMXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNxbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdmFsdWVzIHNxbC5cbiAgICogQHBhcmFtIHtBcnJheTw/Pn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgX3ZhbHVlc1NxbChkYXRhKSB7XG4gICAgbGV0IGNvdW50ID0gMFxuICAgIGxldCBzcWwgPSBcIihcIlxuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBkYXRhKSB7XG4gICAgICBpZiAoY291bnQgPiAwKSBzcWwgKz0gXCIsIFwiXG5cbiAgICAgIHNxbCArPSB0aGlzLmZvcm1hdFZhbHVlKHZhbHVlKVxuICAgICAgY291bnQrK1xuICAgIH1cblxuICAgIHNxbCArPSBcIilcIlxuXG4gICAgcmV0dXJuIHNxbFxuICB9XG59XG4iXX0=
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zZXJ0LWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvcXVlcnkvaW5zZXJ0LWJhc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sYUFBYSxNQUFNLGdDQUFnQyxDQUFBO0FBRTFELE1BQU0sQ0FBQyxPQUFPLE9BQU8sZ0NBQWdDO0lBQ25EOzs7Ozs7Ozs7O09BVUc7SUFDSCxZQUFZLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSw2QkFBNkIsRUFBRSxJQUFJLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDeEcsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUE7UUFDOUQsSUFBSSxDQUFDLFNBQVM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBRXhGLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsNkJBQTZCLEdBQUcsNkJBQTZCLENBQUE7UUFDbEUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDOUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsS0FBSztRQUNmLElBQUksS0FBSyxLQUFLLElB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b3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUXVlcnlJbnNlcnRCYXNlIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFthcmdzLmRhdGFdIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLmRyaXZlciAtIERhdGFiYXNlIGRyaXZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbYXJncy5jb2x1bW5zXSAtIENvbHVtbiBuYW1lcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5tdWx0aXBsZV0gLSBXaGV0aGVyIG11bHRpcGxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5yZXR1cm5MYXN0SW5zZXJ0ZWRDb2x1bW5OYW1lc10gLSBSZXR1cm4gbGFzdCBpbnNlcnRlZCBjb2x1bW4gbmFtZXMuXG4gICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8Pz4+fSBbYXJncy5yb3dzXSAtIFJvd3MgdG8gaW5zZXJ0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbHVtbnMsIGRhdGEsIGRyaXZlciwgbXVsdGlwbGUsIHRhYmxlTmFtZSwgcmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXMsIHJvd3MsIC4uLnJlc3RBcmdzfSkge1xuICAgIGlmICghZHJpdmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBkcml2ZXIgZ2l2ZW4gdG8gaW5zZXJ0IGJhc2VcIilcbiAgICBpZiAoIXRhYmxlTmFtZSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRhYmxlIG5hbWUgZ2l2ZW4gdG8gaW5zZXJ0IGJhc2U6ICR7dGFibGVOYW1lfWApXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1uc1xuICAgIHRoaXMuZGF0YSA9IGRhdGFcbiAgICB0aGlzLmRyaXZlciA9IGRyaXZlclxuICAgIHRoaXMubXVsdGlwbGUgPSBtdWx0aXBsZVxuICAgIHRoaXMucmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXMgPSByZXR1cm5MYXN0SW5zZXJ0ZWRDb2x1bW5OYW1lc1xuICAgIHRoaXMucm93cyA9IHJvd3NcbiAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9xdWVyeS1wYXJzZXIvb3B0aW9ucy5qc1wiKS5kZWZhdWx0fSAtIFRoZSBvcHRpb25zIG9wdGlvbnMuXG4gICAqL1xuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmRyaXZlci5vcHRpb25zKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm1hdCB2YWx1ZS5cbiAgICogQHBhcmFtIHs/fSB2YWx1ZSAtIFZhbHVlIHRvIGZvcm1hdC5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlcn0gLSBTUUwgbGl0ZXJhbC5cbiAgICovXG4gIGZvcm1hdFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gXCJOVUxMXCJcblxuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbnMoKS5xdW90ZSh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIHNxbC5cbiAgICogQHJldHVybnMge3N0cmluZ30gU1FMIHN0YXRlbWVudFxuICAgKi9cbiAgdG9TcWwoKSB7XG4gICAgY29uc3Qge2RyaXZlcn0gPSB0aGlzXG5cbiAgICBsZXQgc3FsID0gYElOU0VSVCBJTlRPICR7ZHJpdmVyLnF1b3RlVGFibGUodGhpcy50YWJsZU5hbWUpfWBcbiAgICBsZXQgY291bnQgPSAwXG4gICAgbGV0IGNvbHVtbnMsIGxhc3RJbnNlcnRlZFNRTFxuXG4gICAgaWYgKHRoaXMucmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXMpIHtcbiAgICAgIGlmIChkcml2ZXIuZ2V0VHlwZSgpID09IFwibXNzcWxcIikge1xuICAgICAgICBsYXN0SW5zZXJ0ZWRTUUwgPSBgIE9VVFBVVCBgXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJldHVybkxhc3RJbnNlcnRlZENvbHVtbk5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IHRoaXMucmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXNbaV1cblxuICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgbGFzdEluc2VydGVkU1FMICs9IFwiLCBcIlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxhc3RJbnNlcnRlZFNRTCArPSBgIElOU0VSVEVELiR7ZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfWBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRhdGEgJiYgT2JqZWN0LmtleXModGhpcy5kYXRhKS5sZW5ndGggPD0gMCkge1xuICAgICAgICAgIHNxbCArPSBsYXN0SW5zZXJ0ZWRTUUxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkcml2ZXIuZ2V0VHlwZSgpID09IFwibXlzcWxcIiB8fCBkcml2ZXIuZ2V0VHlwZSgpID09IFwicGdzcWxcIiB8fCAoZHJpdmVyLmdldFR5cGUoKSA9PSBcInNxbGl0ZVwiICYmIGRyaXZlci5zdXBwb3J0c0luc2VydEludG9SZXR1cm5pbmcoKSkpIHtcbiAgICAgICAgbGFzdEluc2VydGVkU1FMID0gXCIgUkVUVVJOSU5HIFwiXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJldHVybkxhc3RJbnNlcnRlZENvbHVtbk5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IHRoaXMucmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXNbaV1cblxuICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgbGFzdEluc2VydGVkU1FMICs9IFwiLCBcIlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxhc3RJbnNlcnRlZFNRTCArPSBgICR7ZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbHVtbnMgJiYgdGhpcy5yb3dzKSB7XG4gICAgICBjb2x1bW5zID0gdGhpcy5jb2x1bW5zXG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIGNvbHVtbnMgPSBPYmplY3Qua2V5cyh0aGlzLmRhdGEpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5laXRoZXIgJ2NvbHVtbicgYW5kICdyb3dzJyBvciBkYXRhIHdhcyBnaXZlblwiKVxuICAgIH1cblxuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHNxbCArPSBcIiAoXCJcblxuICAgICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgaWYgKGNvdW50ID4gMCkgc3FsICs9IFwiLCBcIlxuXG4gICAgICAgIHNxbCArPSBkcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSlcbiAgICAgICAgY291bnQrK1xuICAgICAgfVxuXG4gICAgICBzcWwgKz0gXCIpXCJcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXR1cm5MYXN0SW5zZXJ0ZWRDb2x1bW5OYW1lcyAmJiBkcml2ZXIuZ2V0VHlwZSgpID09IFwibXNzcWxcIiAmJiB0aGlzLmRhdGEgJiYgT2JqZWN0LmtleXModGhpcy5kYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICBzcWwgKz0gbGFzdEluc2VydGVkU1FMXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29sdW1ucyAmJiB0aGlzLnJvd3MpIHtcbiAgICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgICBzcWwgKz0gXCIgVkFMVUVTIFwiXG4gICAgICB9XG5cbiAgICAgIGxldCBjb3VudCA9IDBcblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yb3dzKSB7XG4gICAgICAgIGlmIChjb3VudCA+PSAxKSBzcWwgKz0gXCIsIFwiXG5cbiAgICAgICAgY291bnQrK1xuICAgICAgICBzcWwgKz0gdGhpcy5fdmFsdWVzU3FsKHJvdylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZGF0YSAmJiBPYmplY3Qua2V5cyh0aGlzLmRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3FsICs9IFwiIFZBTFVFUyBcIlxuICAgICAgICBzcWwgKz0gdGhpcy5fdmFsdWVzU3FsKE9iamVjdC52YWx1ZXModGhpcy5kYXRhKSlcbiAgICAgIH0gZWxzZSBpZiAoZHJpdmVyLmdldFR5cGUoKSA9PSBcInNxbGl0ZVwiIHx8IGRyaXZlci5nZXRUeXBlKCkgPT0gXCJtc3NxbFwiIHx8IGRyaXZlci5nZXRUeXBlKCkgPT0gXCJwZ3NxbFwiKSB7XG4gICAgICAgIHNxbCArPSBcIiBERUZBVUxUIFZBTFVFU1wiXG4gICAgICB9IGVsc2UgaWYgKGRyaXZlci5nZXRUeXBlKCkgPT0gXCJteXNxbFwiKSB7XG4gICAgICAgIHNxbCArPSBcIiAoKSBWQUxVRVMgKClcIlxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJldHVybkxhc3RJbnNlcnRlZENvbHVtbk5hbWVzKSB7XG4gICAgICBpZiAoZHJpdmVyLmdldFR5cGUoKSA9PSBcInBnc3FsXCIgfHwgZHJpdmVyLmdldFR5cGUoKSA9PSBcIm15c3FsXCIgfHwgKGRyaXZlci5nZXRUeXBlKCkgPT0gXCJzcWxpdGVcIiAmJiBkcml2ZXIuc3VwcG9ydHNJbnNlcnRJbnRvUmV0dXJuaW5nKCkpKSB7XG4gICAgICAgIHNxbCArPSBsYXN0SW5zZXJ0ZWRTUUxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3FsXG4gIH1cblxuICAvKipcbiAgICogUnVucyB2YWx1ZXMgc3FsLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICBfdmFsdWVzU3FsKGRhdGEpIHtcbiAgICBsZXQgY291bnQgPSAwXG4gICAgbGV0IHNxbCA9IFwiKFwiXG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGRhdGEpIHtcbiAgICAgIGlmIChjb3VudCA+IDApIHNxbCArPSBcIiwgXCJcblxuICAgICAgc3FsICs9IHRoaXMuZm9ybWF0VmFsdWUodmFsdWUpXG4gICAgICBjb3VudCsrXG4gICAgfVxuXG4gICAgc3FsICs9IFwiKVwiXG5cbiAgICByZXR1cm4gc3FsXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Wires server sequencing onto a sync model class: registers a beforeCreate
3
+ * lifecycle callback assigning the next sequence when the record has none, and
4
+ * defines an `advance<Column>()` instance method (when the model does not
5
+ * already define one) that re-sequences the record through the allocator.
6
+ *
7
+ * The sequence is always written through the model's generated typed setter
8
+ * (for example `setServerSequence`), so the model must expose the generated
9
+ * `set<Column>`/`has<Column>` accessors for the column.
10
+ * @template {typeof import("../database/record/index.js").default} TModelClass
11
+ * @param {TModelClass} ModelClass - Sync model class to sequence.
12
+ * @param {object} args - Options.
13
+ * @param {ServerSequenceAllocator} args.allocator - Allocator providing sequence values.
14
+ * @param {string} [args.column] - Sequence attribute name.
15
+ * @returns {TModelClass} The given model class.
16
+ */
17
+ export function withServerSequence<TModelClass extends typeof import("../database/record/index.js").default>(ModelClass: TModelClass, { allocator, column }: {
18
+ allocator: ServerSequenceAllocator;
19
+ column?: string | undefined;
20
+ }): TModelClass;
21
+ /**
22
+ * Allocates monotonically increasing server sync sequences from an
23
+ * AUTO_INCREMENT id table: every allocation inserts a row and returns the
24
+ * driver's last-insert id, so sequences stay unique and increasing across
25
+ * processes sharing the same database.
26
+ *
27
+ * Backed by an auto-created `velocious_server_sequences` table on the
28
+ * configured database, with a process-local memory counter fallback when no
29
+ * database is configured (mirroring the sync scope store). Apps with an
30
+ * existing sequence table (for example a bare `id`-only AUTO_INCREMENT table)
31
+ * point `tableName` at it and pass `insertData: {}` to insert empty rows.
32
+ */
33
+ export default class ServerSequenceAllocator {
34
+ /**
35
+ * Creates a server sequence allocator.
36
+ * @param {object} [args] - Options.
37
+ * @param {import("../configuration.js").default} [args.configuration] - Configuration owning the database. Defaults to the current configuration, resolved lazily per allocation.
38
+ * @param {string} [args.databaseIdentifier] - Database identifier.
39
+ * @param {Record<string, ?>} [args.insertData] - Row payload inserted per allocation. Defaults to `{created_at: new Date()}` matching the auto-created table; pass `{}` for bare id-only tables.
40
+ * @param {string} [args.tableName] - Sequence table name.
41
+ */
42
+ constructor({ configuration, databaseIdentifier, insertData, tableName }?: {
43
+ configuration?: Configuration | undefined;
44
+ databaseIdentifier?: string | undefined;
45
+ insertData?: Record<string, any> | undefined;
46
+ tableName?: string | undefined;
47
+ });
48
+ configuration: Configuration | undefined;
49
+ databaseIdentifier: string;
50
+ insertData: Record<string, any> | undefined;
51
+ tableName: string;
52
+ _memorySequence: number;
53
+ _isReady: boolean;
54
+ /** @type {Promise<void> | null} */
55
+ _readyPromise: Promise<void> | null;
56
+ /**
57
+ * Allocates the next monotonically increasing sequence.
58
+ *
59
+ * Allocations serialize through a module-level queue per database+table so
60
+ * parallel `next()` calls - including calls from other allocator instances
61
+ * sharing the same table and connection - cannot interleave their insert
62
+ * and last-insert-id reads and hand out duplicate sequences.
63
+ * @returns {Promise<number>} Next sequence value.
64
+ */
65
+ next(): Promise<number>;
66
+ /**
67
+ * Ensures the backing table exists.
68
+ * @returns {Promise<void>} Resolves when ready.
69
+ */
70
+ ensureReady(): Promise<void>;
71
+ /**
72
+ * Allocates one sequence value after queueing.
73
+ * @returns {Promise<number>} Allocated sequence value.
74
+ */
75
+ _allocateNext(): Promise<number>;
76
+ /**
77
+ * Builds the row payload inserted per allocation.
78
+ * @returns {Record<string, ?>} Insert payload.
79
+ */
80
+ _insertPayload(): Record<string, unknown>;
81
+ /**
82
+ * Resolves the configuration owning the sequence table.
83
+ * @returns {import("../configuration.js").default} Resolved configuration.
84
+ */
85
+ _getConfiguration(): import("../configuration.js").default;
86
+ /**
87
+ * Whether the allocator runs without a configured database.
88
+ * @returns {boolean} Whether memory storage is used.
89
+ */
90
+ _usesMemoryStorage(): boolean;
91
+ /**
92
+ * Runs a callback with a database connection.
93
+ * @template Result
94
+ * @param {(db: import("../database/drivers/base.js").default) => Promise<Result>} callback - Database callback.
95
+ * @returns {Promise<Result>} Callback result.
96
+ */
97
+ _withDb<Result>(callback: (db: import("../database/drivers/base.js").default) => Promise<Result>): Promise<Result>;
98
+ /**
99
+ * Ensures the sequences table exists.
100
+ * @param {import("../database/drivers/base.js").default} db - Database connection.
101
+ * @returns {Promise<boolean>} Whether the table had to be created.
102
+ */
103
+ _ensureSequencesTable(db: import("../database/drivers/base.js").default): Promise<boolean>;
104
+ }
105
+ import Configuration from "../configuration.js";
106
+ //# sourceMappingURL=server-sequence-allocator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-sequence-allocator.d.ts","sourceRoot":"","sources":["../../../src/sync/server-sequence-allocator.js"],"names":[],"mappings":"AA+LA;;;;;;;;;;;;;;;GAeG;AACH,mCAPoE,WAAW,SAAlE,cAAe,6BAA6B,EAAE,OAAQ,cACxD,WAAW,yBAEnB;IAAsC,SAAS,EAAvC,uBAAuB;IACT,MAAM;CAC5B,GAAU,WAAW,CAwCvB;AAzOD;;;;;;;;;;;GAWG;AACH;IACE;;;;;;;OAOG;IACH,2EALG;QAAqD,aAAa;QAC5C,kBAAkB;QACP,UAAU;QACrB,SAAS;KACjC,EAUA;IARC,yCAAkC;IAClC,2BAA4C;IAC5C,4CAA4B;IAC5B,kBAA0B;IAC1B,wBAAwB;IACxB,kBAAqB;IACrB,mCAAmC;IACnC,eADW,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CACN;IAG3B;;;;;;;;OAQG;IACH,QAFa,OAAO,CAAC,MAAM,CAAC,CAU3B;IAED;;;OAGG;IACH,eAFa,OAAO,CAAC,IAAI,CAAC,CA6BzB;IAED;;;OAGG;IACH,iBAFa,OAAO,CAAC,MAAM,CAAC,CA4B3B;IAED;;;OAGG;IACH,kBAFa,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAI7B;IAED;;;OAGG;IACH,qBAFa,OAAO,qBAAqB,EAAE,OAAO,CAIjD;IAED;;;OAGG;IACH,sBAFa,OAAO,CAQnB;IAED;;;;;OAKG;IACH,QAJa,MAAM,YACR,CAAC,EAAE,EAAE,OAAO,6BAA6B,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,GACpE,OAAO,CAAC,MAAM,CAAC,CAU3B;IAED;;;;OAIG;IACH,0BAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,OAAO,CAAC,CAa5B;CACF;0BA3LyB,qBAAqB"}
@@ -0,0 +1,220 @@
1
+ // @ts-check
2
+ import Configuration from "../configuration.js";
3
+ import TableData from "../database/table-data/index.js";
4
+ /**
5
+ * Allocation queues per database+table, serializing insert/last-insert-id
6
+ * pairs across all allocator instances in this process.
7
+ * @type {Map<string, Promise<void>>}
8
+ */
9
+ const allocationQueues = new Map();
10
+ /**
11
+ * Allocates monotonically increasing server sync sequences from an
12
+ * AUTO_INCREMENT id table: every allocation inserts a row and returns the
13
+ * driver's last-insert id, so sequences stay unique and increasing across
14
+ * processes sharing the same database.
15
+ *
16
+ * Backed by an auto-created `velocious_server_sequences` table on the
17
+ * configured database, with a process-local memory counter fallback when no
18
+ * database is configured (mirroring the sync scope store). Apps with an
19
+ * existing sequence table (for example a bare `id`-only AUTO_INCREMENT table)
20
+ * point `tableName` at it and pass `insertData: {}` to insert empty rows.
21
+ */
22
+ export default class ServerSequenceAllocator {
23
+ /**
24
+ * Creates a server sequence allocator.
25
+ * @param {object} [args] - Options.
26
+ * @param {import("../configuration.js").default} [args.configuration] - Configuration owning the database. Defaults to the current configuration, resolved lazily per allocation.
27
+ * @param {string} [args.databaseIdentifier] - Database identifier.
28
+ * @param {Record<string, ?>} [args.insertData] - Row payload inserted per allocation. Defaults to `{created_at: new Date()}` matching the auto-created table; pass `{}` for bare id-only tables.
29
+ * @param {string} [args.tableName] - Sequence table name.
30
+ */
31
+ constructor({ configuration, databaseIdentifier = "default", insertData, tableName = "velocious_server_sequences" } = {}) {
32
+ this.configuration = configuration;
33
+ this.databaseIdentifier = databaseIdentifier;
34
+ this.insertData = insertData;
35
+ this.tableName = tableName;
36
+ this._memorySequence = 0;
37
+ this._isReady = false;
38
+ /** @type {Promise<void> | null} */
39
+ this._readyPromise = null;
40
+ }
41
+ /**
42
+ * Allocates the next monotonically increasing sequence.
43
+ *
44
+ * Allocations serialize through a module-level queue per database+table so
45
+ * parallel `next()` calls - including calls from other allocator instances
46
+ * sharing the same table and connection - cannot interleave their insert
47
+ * and last-insert-id reads and hand out duplicate sequences.
48
+ * @returns {Promise<number>} Next sequence value.
49
+ */
50
+ async next() {
51
+ const queueKey = `${this.databaseIdentifier}::${this.tableName}`;
52
+ const previousAllocation = allocationQueues.get(queueKey) ?? Promise.resolve();
53
+ const allocation = previousAllocation.then(() => this._allocateNext());
54
+ allocationQueues.set(queueKey, allocation.then(() => undefined, () => undefined));
55
+ return await allocation;
56
+ }
57
+ /**
58
+ * Ensures the backing table exists.
59
+ * @returns {Promise<void>} Resolves when ready.
60
+ */
61
+ async ensureReady() {
62
+ if (this._isReady)
63
+ return;
64
+ if (this._usesMemoryStorage()) {
65
+ this._isReady = true;
66
+ return;
67
+ }
68
+ if (this._readyPromise)
69
+ return await this._readyPromise;
70
+ this._readyPromise = this._withDb(async (db) => {
71
+ const created = await this._ensureSequencesTable(db);
72
+ // DDL joins any transaction already open on this connection (the mixin's
73
+ // beforeCreate allocation always runs inside the record save transaction),
74
+ // and on transactional-DDL databases (MSSQL, PostgreSQL, SQLite) a rollback
75
+ // of that outer transaction removes the just-created table again. Only
76
+ // cache readiness when the table was not created inside an active
77
+ // transaction; otherwise the next allocation re-verifies the table.
78
+ if (!created || !db.insideTransaction())
79
+ this._isReady = true;
80
+ });
81
+ try {
82
+ await this._readyPromise;
83
+ }
84
+ finally {
85
+ if (!this._isReady)
86
+ this._readyPromise = null;
87
+ }
88
+ }
89
+ /**
90
+ * Allocates one sequence value after queueing.
91
+ * @returns {Promise<number>} Allocated sequence value.
92
+ */
93
+ async _allocateNext() {
94
+ await this.ensureReady();
95
+ if (this._usesMemoryStorage()) {
96
+ return ++this._memorySequence;
97
+ }
98
+ return await this._withDb(async (db) => {
99
+ // The allocated id must be returned by the insert statement itself (OUTPUT
100
+ // INSERTED/RETURNING), like the record create path does: MSSQL's
101
+ // SCOPE_IDENTITY() only sees inserts from the same batch/scope, so reading
102
+ // the last-insert id as a separate query always returns NULL there. Drivers
103
+ // without insert-returning support (older SQLite) keep the reliable
104
+ // connection-scoped last-insert-id fallback.
105
+ const insertSql = db.insertSql({
106
+ data: this._insertPayload(),
107
+ returnLastInsertedColumnNames: ["id"],
108
+ tableName: this.tableName
109
+ });
110
+ const insertResult = await db.query(insertSql);
111
+ const insertedId = Array.isArray(insertResult) ? insertResult[0]?.id : undefined;
112
+ if (insertedId !== undefined && insertedId !== null)
113
+ return Number(insertedId);
114
+ return Number(await db.lastInsertID());
115
+ });
116
+ }
117
+ /**
118
+ * Builds the row payload inserted per allocation.
119
+ * @returns {Record<string, ?>} Insert payload.
120
+ */
121
+ _insertPayload() {
122
+ return this.insertData ?? { created_at: new Date() };
123
+ }
124
+ /**
125
+ * Resolves the configuration owning the sequence table.
126
+ * @returns {import("../configuration.js").default} Resolved configuration.
127
+ */
128
+ _getConfiguration() {
129
+ return this.configuration ?? Configuration.current();
130
+ }
131
+ /**
132
+ * Whether the allocator runs without a configured database.
133
+ * @returns {boolean} Whether memory storage is used.
134
+ */
135
+ _usesMemoryStorage() {
136
+ try {
137
+ return !this._getConfiguration().getDatabaseConfiguration()[this.databaseIdentifier];
138
+ }
139
+ catch {
140
+ return true;
141
+ }
142
+ }
143
+ /**
144
+ * Runs a callback with a database connection.
145
+ * @template Result
146
+ * @param {(db: import("../database/drivers/base.js").default) => Promise<Result>} callback - Database callback.
147
+ * @returns {Promise<Result>} Callback result.
148
+ */
149
+ async _withDb(callback) {
150
+ return await this._getConfiguration().ensureConnections({ name: "Server sequence allocator" }, async (dbs) => {
151
+ const db = dbs[this.databaseIdentifier];
152
+ if (!db)
153
+ throw new Error(`No database connection available for identifier: ${this.databaseIdentifier}`);
154
+ return await callback(db);
155
+ });
156
+ }
157
+ /**
158
+ * Ensures the sequences table exists.
159
+ * @param {import("../database/drivers/base.js").default} db - Database connection.
160
+ * @returns {Promise<boolean>} Whether the table had to be created.
161
+ */
162
+ async _ensureSequencesTable(db) {
163
+ if (await db.tableExists(this.tableName))
164
+ return false;
165
+ const table = new TableData(this.tableName, { ifNotExists: true });
166
+ table.bigint("id", { autoIncrement: true, null: false, primaryKey: true });
167
+ table.datetime("created_at", { null: false });
168
+ await db.createTable(table);
169
+ return true;
170
+ }
171
+ }
172
+ /**
173
+ * Wires server sequencing onto a sync model class: registers a beforeCreate
174
+ * lifecycle callback assigning the next sequence when the record has none, and
175
+ * defines an `advance<Column>()` instance method (when the model does not
176
+ * already define one) that re-sequences the record through the allocator.
177
+ *
178
+ * The sequence is always written through the model's generated typed setter
179
+ * (for example `setServerSequence`), so the model must expose the generated
180
+ * `set<Column>`/`has<Column>` accessors for the column.
181
+ * @template {typeof import("../database/record/index.js").default} TModelClass
182
+ * @param {TModelClass} ModelClass - Sync model class to sequence.
183
+ * @param {object} args - Options.
184
+ * @param {ServerSequenceAllocator} args.allocator - Allocator providing sequence values.
185
+ * @param {string} [args.column] - Sequence attribute name.
186
+ * @returns {TModelClass} The given model class.
187
+ */
188
+ export function withServerSequence(ModelClass, { allocator, column = "serverSequence" }) {
189
+ if (!(allocator instanceof ServerSequenceAllocator)) {
190
+ throw new Error(`withServerSequence requires a ServerSequenceAllocator, got: ${String(allocator)}`);
191
+ }
192
+ const upperColumn = `${column.charAt(0).toUpperCase()}${column.slice(1)}`;
193
+ const advanceMethodName = `advance${upperColumn}`;
194
+ const hasMethodName = `has${upperColumn}`;
195
+ const setterMethodName = `set${upperColumn}`;
196
+ // Narrows the prototype to dynamic method access for the configured column name.
197
+ const prototype = /** @type {Record<string, ?>} */ (ModelClass.prototype);
198
+ if (typeof prototype[setterMethodName] != "function" || typeof prototype[hasMethodName] != "function") {
199
+ throw new Error(`withServerSequence requires generated ${setterMethodName} and ${hasMethodName} accessors on ${ModelClass.name}`);
200
+ }
201
+ if (typeof prototype[advanceMethodName] != "function") {
202
+ /**
203
+ * Assigns the next server-side sequence.
204
+ * @this {Record<string, ?>}
205
+ * @returns {Promise<void>}
206
+ */
207
+ prototype[advanceMethodName] = async function advanceServerSequenceThroughAllocator() {
208
+ this[setterMethodName](await allocator.next());
209
+ };
210
+ }
211
+ ModelClass.beforeCreate(async (record) => {
212
+ // Narrows the record to dynamic method access for the configured column name.
213
+ const dynamicRecord = /** @type {Record<string, ?>} */ ( /** @type {?} */(record));
214
+ if (dynamicRecord[hasMethodName]())
215
+ return;
216
+ await dynamicRecord[advanceMethodName]();
217
+ });
218
+ return ModelClass;
219
+ }
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLXNlcXVlbmNlLWFsbG9jYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3NlcnZlci1zZXF1ZW5jZS1hbGxvY2F0b3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBRXZEOzs7O0dBSUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbEM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLHVCQUF1QjtJQUMxQzs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsR0FBRyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsR0FBRyw0QkFBNEIsRUFBQyxHQUFHLEVBQUU7UUFDcEgsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFBO1FBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFBO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ3JCLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtJQUMzQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sUUFBUSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUNoRSxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMs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LE9BQU8sU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ3RHLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLGdCQUFnQixRQUFRLGFBQWEsaUJBQWlCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ25JLENBQUM7SUFFRCxJQUFJLE9BQU8sU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7UUFDdEQ7Ozs7V0FJRztRQUNILFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEtBQUssVUFBVSxxQ0FBcUM7WUFDakYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUNoRCxDQUFDLENBQUE7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDdkMsOEVBQThFO1FBQzlFLE1BQU0sYUFBYSxHQUFHLGdDQUFnQyxDQUFDLEVBQUMsZ0JBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUVsRixJQUFJLGFBQWEsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUFFLE9BQU07UUFFMUMsTUFBTSxhQUFhLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFBO0lBQzFDLENBQUMsQ0FBQyxDQUFBO0lBRUYsT0FBTyxVQUFVLENBQUE7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi5qc1wiXG5pbXBvcnQgVGFibGVEYXRhIGZyb20gXCIuLi9kYXRhYmFzZS90YWJsZS1kYXRhL2luZGV4LmpzXCJcblxuLyoqXG4gKiBBbGxvY2F0aW9uIHF1ZXVlcyBwZXIgZGF0YWJhc2UrdGFibGUsIHNlcmlhbGl6aW5nIGluc2VydC9sYXN0LWluc2VydC1pZFxuICogcGFpcnMgYWNyb3NzIGFsbCBhbGxvY2F0b3IgaW5zdGFuY2VzIGluIHRoaXMgcHJvY2Vzcy5cbiAqIEB0eXBlIHtNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+Pn1cbiAqL1xuY29uc3QgYWxsb2NhdGlvblF1ZXVlcyA9IG5ldyBNYXAoKVxuXG4vKipcbiAqIEFsbG9jYXRlcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgc2VydmVyIHN5bmMgc2VxdWVuY2VzIGZyb20gYW5cbiAqIEFVVE9fSU5DUkVNRU5UIGlkIHRhYmxlOiBldmVyeSBhbGxvY2F0aW9uIGluc2VydHMgYSByb3cgYW5kIHJldHVybnMgdGhlXG4gKiBkcml2ZXIncyBsYXN0LWluc2VydCBpZCwgc28gc2VxdWVuY2VzIHN0YXkgdW5pcXVlIGFuZCBpbmNyZWFzaW5nIGFjcm9zc1xuICogcHJvY2Vzc2VzIHNoYXJpbmcgdGhlIHNhbWUgZGF0YWJhc2UuXG4gKlxuICogQmFja2VkIGJ5IGFuIGF1dG8tY3JlYXRlZCBgdmVsb2Npb3VzX3NlcnZlcl9zZXF1ZW5jZXNgIHRhYmxlIG9uIHRoZVxuICogY29uZmlndXJlZCBkYXRhYmFzZSwgd2l0aCBhIHByb2Nlc3MtbG9jYWwgbWVtb3J5IGNvdW50ZXIgZmFsbGJhY2sgd2hlbiBub1xuICogZGF0YWJhc2UgaXMgY29uZmlndXJlZCAobWlycm9yaW5nIHRoZSBzeW5jIHNjb3BlIHN0b3JlKS4gQXBwcyB3aXRoIGFuXG4gKiBleGlzdGluZyBzZXF1ZW5jZSB0YWJsZSAoZm9yIGV4YW1wbGUgYSBiYXJlIGBpZGAtb25seSBBVVRPX0lOQ1JFTUVOVCB0YWJsZSlcbiAqIHBvaW50IGB0YWJsZU5hbWVgIGF0IGl0IGFuZCBwYXNzIGBpbnNlcnREYXRhOiB7fWAgdG8gaW5zZXJ0IGVtcHR5IHJvd3MuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlcnZlclNlcXVlbmNlQWxsb2NhdG9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzZXJ2ZXIgc2VxdWVuY2UgYWxsb2NhdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBvd25pbmcgdGhlIGRhdGFiYXNlLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLCByZXNvbHZlZCBsYXppbHkgcGVyIGFsbG9jYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kYXRhYmFzZUlkZW50aWZpZXJdIC0gRGF0YWJhc2UgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2FyZ3MuaW5zZXJ0RGF0YV0gLSBSb3cgcGF5bG9hZCBpbnNlcnRlZCBwZXIgYWxsb2NhdGlvbi4gRGVmYXVsdHMgdG8gYHtjcmVhdGVkX2F0OiBuZXcgRGF0ZSgpfWAgbWF0Y2hpbmcgdGhlIGF1dG8tY3JlYXRlZCB0YWJsZTsgcGFzcyBge31gIGZvciBiYXJlIGlkLW9ubHkgdGFibGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudGFibGVOYW1lXSAtIFNlcXVlbmNlIHRhYmxlIG5hbWUuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyID0gXCJkZWZhdWx0XCIsIGluc2VydERhdGEsIHRhYmxlTmFtZSA9IFwidmVsb2Npb3VzX3NlcnZlcl9zZXF1ZW5jZXNcIn0gPSB7fSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmRhdGFiYXNlSWRlbnRpZmllciA9IGRhdGFiYXNlSWRlbnRpZmllclxuICAgIHRoaXMuaW5zZXJ0RGF0YSA9IGluc2VydERhdGFcbiAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZVxuICAgIHRoaXMuX21lbW9yeVNlcXVlbmNlID0gMFxuICAgIHRoaXMuX2lzUmVhZHkgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG9jYXRlcyB0aGUgbmV4dCBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgc2VxdWVuY2UuXG4gICAqXG4gICAqIEFsbG9jYXRpb25zIHNlcmlhbGl6ZSB0aHJvdWdoIGEgbW9kdWxlLWxldmVsIHF1ZXVlIHBlciBkYXRhYmFzZSt0YWJsZSBzb1xuICAgKiBwYXJhbGxlbCBgbmV4dCgpYCBjYWxscyAtIGluY2x1ZGluZyBjYWxscyBmcm9tIG90aGVyIGFsbG9jYXRvciBpbnN0YW5jZXNcbiAgICogc2hhcmluZyB0aGUgc2FtZSB0YWJsZSBhbmQgY29ubmVjdGlvbiAtIGNhbm5vdCBpbnRlcmxlYXZlIHRoZWlyIGluc2VydFxuICAgKiBhbmQgbGFzdC1pbnNlcnQtaWQgcmVhZHMgYW5kIGhhbmQgb3V0IGR1cGxpY2F0ZSBzZXF1ZW5jZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IE5leHQgc2VxdWVuY2UgdmFsdWUuXG4gICAqL1xuICBhc3luYyBuZXh0KCkge1xuICAgIGNvbnN0IHF1ZXVlS2V5ID0gYCR7dGhpcy5kYXRhYmFzZUlkZW50aWZpZXJ9Ojoke3RoaXMudGFibGVOYW1lfWBcbiAgICBjb25zdCBwcmV2aW91c0FsbG9jYXRpb24gPSBhbGxvY2F0aW9uUXVldWVzLmdldChxdWV1ZUtleSkgPz8gUHJvbWlzZS5yZXNvbHZlKClcbiAgICBjb25zdCBhbGxvY2F0aW9uID0gcHJldmlvdXNBbGxvY2F0aW9uLnRoZW4oKCkgPT4gdGhpcy5fYWxsb2NhdGVOZXh0KCkpXG5cbiAgICBhbGxvY2F0aW9uUXVldWVzLnNldChxdWV1ZUtleSwgYWxsb2NhdGlvbi50aGVuKCgpID0+IHVuZGVmaW5lZCwgKCkgPT4gdW5kZWZpbmVkKSlcblxuICAgIHJldHVybiBhd2FpdCBhbGxvY2F0aW9uXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgYmFja2luZyB0YWJsZSBleGlzdHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIHJlYWR5LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlUmVhZHkoKSB7XG4gICAgaWYgKHRoaXMuX2lzUmVhZHkpIHJldHVyblxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHtcbiAgICAgIHRoaXMuX2lzUmVhZHkgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmVhZHlQcm9taXNlKSByZXR1cm4gYXdhaXQgdGhpcy5fcmVhZHlQcm9taXNlXG5cbiAgICB0aGlzLl9yZWFkeVByb21pc2UgPSB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgdGhpcy5fZW5zdXJlU2VxdWVuY2VzVGFibGUoZGIpXG5cbiAgICAgIC8vIERETCBqb2lucyBhbnkgdHJhbnNhY3Rpb24gYWxyZWFkeSBvcGVuIG9uIHRoaXMgY29ubmVjdGlvbiAodGhlIG1peGluJ3NcbiAgICAgIC8vIGJlZm9yZUNyZWF0ZSBhbGxvY2F0aW9uIGFsd2F5cyBydW5zIGluc2lkZSB0aGUgcmVjb3JkIHNhdmUgdHJhbnNhY3Rpb24pLFxuICAgICAgLy8gYW5kIG9uIHRyYW5zYWN0aW9uYWwtRERMIGRhdGFiYXNlcyAoTVNTUUwsIFBvc3RncmVTUUwsIFNRTGl0ZSkgYSByb2xsYmFja1xuICAgICAgLy8gb2YgdGhhdCBvdXRlciB0cmFuc2FjdGlvbiByZW1vdmVzIHRoZSBqdXN0LWNyZWF0ZWQgdGFibGUgYWdhaW4uIE9ubHlcbiAgICAgIC8vIGNhY2hlIHJlYWRpbmVzcyB3aGVuIHRoZSB0YWJsZSB3YXMgbm90IGNyZWF0ZWQgaW5zaWRlIGFuIGFjdGl2ZVxuICAgICAgLy8gdHJhbnNhY3Rpb247IG90aGVyd2lzZSB0aGUgbmV4dCBhbGxvY2F0aW9uIHJlLXZlcmlmaWVzIHRoZSB0YWJsZS5cbiAgICAgIGlmICghY3JlYXRlZCB8fCAhZGIuaW5zaWRlVHJhbnNhY3Rpb24oKSkgdGhpcy5faXNSZWFkeSA9IHRydWVcbiAgICB9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3JlYWR5UHJvbWlzZVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXRoaXMuX2lzUmVhZHkpIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWxsb2NhdGVzIG9uZSBzZXF1ZW5jZSB2YWx1ZSBhZnRlciBxdWV1ZWluZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQWxsb2NhdGVkIHNlcXVlbmNlIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgX2FsbG9jYXRlTmV4dCgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlYWR5KClcblxuICAgIGlmICh0aGlzLl91c2VzTWVtb3J5U3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gKyt0aGlzLl9tZW1vcnlTZXF1ZW5jZVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICAvLyBUaGUgYWxsb2NhdGVkIGlkIG11c3QgYmUgcmV0dXJuZWQgYnkgdGhlIGluc2VydCBzdGF0ZW1lbnQgaXRzZWxmIChPVVRQVVRcbiAgICAgIC8vIElOU0VSVEVEL1JFVFVSTklORyksIGxpa2UgdGhlIHJlY29yZCBjcmVhdGUgcGF0aCBkb2VzOiBNU1NRTCdzXG4gICAgICAvLyBTQ09QRV9JREVOVElUWSgpIG9ubHkgc2VlcyBpbnNlcnRzIGZyb20gdGhlIHNhbWUgYmF0Y2gvc2NvcGUsIHNvIHJlYWRpbmdcbiAgICAgIC8vIHRoZSBsYXN0LWluc2VydCBpZCBhcyBhIHNlcGFyYXRlIHF1ZXJ5IGFsd2F5cyByZXR1cm5zIE5VTEwgdGhlcmUuIERyaXZlcnNcbiAgICAgIC8vIHdpdGhvdXQgaW5zZXJ0LXJldHVybmluZyBzdXBwb3J0IChvbGRlciBTUUxpdGUpIGtlZXAgdGhlIHJlbGlhYmxlXG4gICAgICAvLyBjb25uZWN0aW9uLXNjb3BlZCBsYXN0LWluc2VydC1pZCBmYWxsYmFjay5cbiAgICAgIGNvbnN0IGluc2VydFNxbCA9IGRiLmluc2VydFNxbCh7XG4gICAgICAgIGRhdGE6IHRoaXMuX2luc2VydFBheWxvYWQoKSxcbiAgICAgICAgcmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXM6IFtcImlkXCJdLFxuICAgICAgICB0YWJsZU5hbWU6IHRoaXMudGFibGVOYW1lXG4gICAgICB9KVxuICAgICAgY29uc3QgaW5zZXJ0UmVzdWx0ID0gYXdhaXQgZGIucXVlcnkoaW5zZXJ0U3FsKVxuICAgICAgY29uc3QgaW5zZXJ0ZWRJZCA9IEFycmF5LmlzQXJyYXkoaW5zZXJ0UmVzdWx0KSA/IGluc2VydFJlc3VsdFswXT8uaWQgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKGluc2VydGVkSWQgIT09IHVuZGVmaW5lZCAmJiBpbnNlcnRlZElkICE9PSBudWxsKSByZXR1cm4gTnVtYmVyKGluc2VydGVkSWQpXG5cbiAgICAgIHJldHVybiBOdW1iZXIoYXdhaXQgZGIubGFzdEluc2VydElEKCkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHJvdyBwYXlsb2FkIGluc2VydGVkIHBlciBhbGxvY2F0aW9uLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz59IEluc2VydCBwYXlsb2FkLlxuICAgKi9cbiAgX2luc2VydFBheWxvYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGF0YSA/PyB7Y3JlYXRlZF9hdDogbmV3IERhdGUoKX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgY29uZmlndXJhdGlvbiBvd25pbmcgdGhlIHNlcXVlbmNlIHRhYmxlLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBSZXNvbHZlZCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgX2dldENvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbiA/PyBDb25maWd1cmF0aW9uLmN1cnJlbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFsbG9jYXRvciBydW5zIHdpdGhvdXQgYSBjb25maWd1cmVkIGRhdGFiYXNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtZW1vcnkgc3RvcmFnZSBpcyB1c2VkLlxuICAgKi9cbiAgX3VzZXNNZW1vcnlTdG9yYWdlKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gIXRoaXMuX2dldENvbmZpZ3VyYXRpb24oKS5nZXREYXRhYmFzZUNvbmZpZ3VyYXRpb24oKVt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcl1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBjYWxsYmFjayB3aXRoIGEgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFJlc3VsdFxuICAgKiBAcGFyYW0geyhkYjogaW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8UmVzdWx0Pn0gY2FsbGJhY2sgLSBEYXRhYmFzZSBjYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVzdWx0Pn0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgX3dpdGhEYihjYWxsYmFjaykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9nZXRDb25maWd1cmF0aW9uKCkuZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiU2VydmVyIHNlcXVlbmNlIGFsbG9jYXRvclwifSwgYXN5bmMgKGRicykgPT4ge1xuICAgICAgY29uc3QgZGIgPSBkYnNbdGhpcy5kYXRhYmFzZUlkZW50aWZpZXJdXG5cbiAgICAgIGlmICghZGIpIHRocm93IG5ldyBFcnJvcihgTm8gZGF0YWJhc2UgY29ubmVjdGlvbiBhdmFpbGFibGUgZm9yIGlkZW50aWZpZXI6ICR7dGhpcy5kYXRhYmFzZUlkZW50aWZpZXJ9YClcblxuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGRiKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgc2VxdWVuY2VzIHRhYmxlIGV4aXN0cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgdGFibGUgaGFkIHRvIGJlIGNyZWF0ZWQuXG4gICAqL1xuICBhc3luYyBfZW5zdXJlU2VxdWVuY2VzVGFibGUoZGIpIHtcbiAgICBpZiAoYXdhaXQgZGIudGFibGVFeGlzdHModGhpcy50YWJsZU5hbWUpKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlRGF0YSh0aGlzLnRhYmxlTmFtZSwge2lmTm90RXhpc3RzOiB0cnVlfSlcblxuICAgIHRhYmxlLmJpZ2ludChcImlkXCIsIHthdXRvSW5jcmVtZW50OiB0cnVlLCBudWxsOiBmYWxzZSwgcHJpbWFyeUtleTogdHJ1ZX0pXG4gICAgdGFibGUuZGF0ZXRpbWUoXCJjcmVhdGVkX2F0XCIsIHtudWxsOiBmYWxzZX0pXG5cbiAgICBhd2FpdCBkYi5jcmVhdGVUYWJsZSh0YWJsZSlcblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuLyoqXG4gKiBXaXJlcyBzZXJ2ZXIgc2VxdWVuY2luZyBvbnRvIGEgc3luYyBtb2RlbCBjbGFzczogcmVnaXN0ZXJzIGEgYmVmb3JlQ3JlYXRlXG4gKiBsaWZlY3ljbGUgY2FsbGJhY2sgYXNzaWduaW5nIHRoZSBuZXh0IHNlcXVlbmNlIHdoZW4gdGhlIHJlY29yZCBoYXMgbm9uZSwgYW5kXG4gKiBkZWZpbmVzIGFuIGBhZHZhbmNlPENvbHVtbj4oKWAgaW5zdGFuY2UgbWV0aG9kICh3aGVuIHRoZSBtb2RlbCBkb2VzIG5vdFxuICogYWxyZWFkeSBkZWZpbmUgb25lKSB0aGF0IHJlLXNlcXVlbmNlcyB0aGUgcmVjb3JkIHRocm91Z2ggdGhlIGFsbG9jYXRvci5cbiAqXG4gKiBUaGUgc2VxdWVuY2UgaXMgYWx3YXlzIHdyaXR0ZW4gdGhyb3VnaCB0aGUgbW9kZWwncyBnZW5lcmF0ZWQgdHlwZWQgc2V0dGVyXG4gKiAoZm9yIGV4YW1wbGUgYHNldFNlcnZlclNlcXVlbmNlYCksIHNvIHRoZSBtb2RlbCBtdXN0IGV4cG9zZSB0aGUgZ2VuZXJhdGVkXG4gKiBgc2V0PENvbHVtbj5gL2BoYXM8Q29sdW1uPmAgYWNjZXNzb3JzIGZvciB0aGUgY29sdW1uLlxuICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IFRNb2RlbENsYXNzXG4gKiBAcGFyYW0ge1RNb2RlbENsYXNzfSBNb2RlbENsYXNzIC0gU3luYyBtb2RlbCBjbGFzcyB0byBzZXF1ZW5jZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7U2VydmVyU2VxdWVuY2VBbGxvY2F0b3J9IGFyZ3MuYWxsb2NhdG9yIC0gQWxsb2NhdG9yIHByb3ZpZGluZyBzZXF1ZW5jZSB2YWx1ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuY29sdW1uXSAtIFNlcXVlbmNlIGF0dHJpYnV0ZSBuYW1lLlxuICogQHJldHVybnMge1RNb2RlbENsYXNzfSBUaGUgZ2l2ZW4gbW9kZWwgY2xhc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2VydmVyU2VxdWVuY2UoTW9kZWxDbGFzcywge2FsbG9jYXRvciwgY29sdW1uID0gXCJzZXJ2ZXJTZXF1ZW5jZVwifSkge1xuICBpZiAoIShhbGxvY2F0b3IgaW5zdGFuY2VvZiBTZXJ2ZXJTZXF1ZW5jZUFsbG9jYXRvcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhTZXJ2ZXJTZXF1ZW5jZSByZXF1aXJlcyBhIFNlcnZlclNlcXVlbmNlQWxsb2NhdG9yLCBnb3Q6ICR7U3RyaW5nKGFsbG9jYXRvcil9YClcbiAgfVxuXG4gIGNvbnN0IHVwcGVyQ29sdW1uID0gYCR7Y29sdW1uLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7Y29sdW1uLnNsaWNlKDEpfWBcbiAgY29uc3QgYWR2YW5jZU1ldGhvZE5hbWUgPSBgYWR2YW5jZSR7dXBwZXJDb2x1bW59YFxuICBjb25zdCBoYXNNZXRob2ROYW1lID0gYGhhcyR7dXBwZXJDb2x1bW59YFxuICBjb25zdCBzZXR0ZXJNZXRob2ROYW1lID0gYHNldCR7dXBwZXJDb2x1bW59YFxuXG4gIC8vIE5hcnJvd3MgdGhlIHByb3RvdHlwZSB0byBkeW5hbWljIG1ldGhvZCBhY2Nlc3MgZm9yIHRoZSBjb25maWd1cmVkIGNvbHVtbiBuYW1lLlxuICBjb25zdCBwcm90b3R5cGUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoTW9kZWxDbGFzcy5wcm90b3R5cGUpXG5cbiAgaWYgKHR5cGVvZiBwcm90b3R5cGVbc2V0dGVyTWV0aG9kTmFtZV0gIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBwcm90b3R5cGVbaGFzTWV0aG9kTmFtZV0gIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoU2VydmVyU2VxdWVuY2UgcmVxdWlyZXMgZ2VuZXJhdGVkICR7c2V0dGVyTWV0aG9kTmFtZX0gYW5kICR7aGFzTWV0aG9kTmFtZX0gYWNjZXNzb3JzIG9uICR7TW9kZWxDbGFzcy5uYW1lfWApXG4gIH1cblxuICBpZiAodHlwZW9mIHByb3RvdHlwZVthZHZhbmNlTWV0aG9kTmFtZV0gIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgLyoqXG4gICAgICogQXNzaWducyB0aGUgbmV4dCBzZXJ2ZXItc2lkZSBzZXF1ZW5jZS5cbiAgICAgKiBAdGhpcyB7UmVjb3JkPHN0cmluZywgPz59XG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgcHJvdG90eXBlW2FkdmFuY2VNZXRob2ROYW1lXSA9IGFzeW5jIGZ1bmN0aW9uIGFkdmFuY2VTZXJ2ZXJTZXF1ZW5jZVRocm91Z2hBbGxvY2F0b3IoKSB7XG4gICAgICB0aGlzW3NldHRlck1ldGhvZE5hbWVdKGF3YWl0IGFsbG9jYXRvci5uZXh0KCkpXG4gICAgfVxuICB9XG5cbiAgTW9kZWxDbGFzcy5iZWZvcmVDcmVhdGUoYXN5bmMgKHJlY29yZCkgPT4ge1xuICAgIC8vIE5hcnJvd3MgdGhlIHJlY29yZCB0byBkeW5hbWljIG1ldGhvZCBhY2Nlc3MgZm9yIHRoZSBjb25maWd1cmVkIGNvbHVtbiBuYW1lLlxuICAgIGNvbnN0IGR5bmFtaWNSZWNvcmQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoLyoqIEB0eXBlIHs/fSAqLyAocmVjb3JkKSlcblxuICAgIGlmIChkeW5hbWljUmVjb3JkW2hhc01ldGhvZE5hbWVdKCkpIHJldHVyblxuXG4gICAgYXdhaXQgZHluYW1pY1JlY29yZFthZHZhbmNlTWV0aG9kTmFtZV0oKVxuICB9KVxuXG4gIHJldHVybiBNb2RlbENsYXNzXG59XG4iXX0=
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Builds the error thrown for a failed sync attribute validation.
3
+ * @callback SyncAttributeErrorFactory
4
+ * @param {string} message - Human-readable validation message.
5
+ * @param {{cause?: Error, code: string}} details - Stable machine-readable code and optional cause.
6
+ * @returns {Error} Error to throw.
7
+ */
8
+ /**
9
+ * Declarative validation schema for one writable sync attribute.
10
+ *
11
+ * Keys are camelCase attribute names; each attribute also accepts its
12
+ * snake_case column key on input (the camelCase key wins when both are given)
13
+ * and is written under the snake_case column key on output. Error messages
14
+ * default to `<label> ...` phrasings with `sync-<label>-...` codes, where the
15
+ * label defaults to the camelCase attribute name; apps pin exact messages per
16
+ * attribute through the `*Message` overrides.
17
+ * @typedef {object} SyncAttributeSchemaEntry
18
+ * @property {"date" | "json" | "raw" | "string"} type - Attribute value type.
19
+ * @property {boolean} [required] - Whether present blank/absent values are rejected (strings reject blank-after-trim, dates reject null).
20
+ * @property {number} [maxLength] - Maximum string length, checked after trimming.
21
+ * @property {string} [label] - Label used in derived messages and codes.
22
+ * @property {string} [column] - Output column key. Defaults to the snake_cased attribute name.
23
+ * @property {string} [requiredMessage] - Pinned message for required rejections.
24
+ * @property {string} [tooLongMessage] - Pinned message for too-long rejections.
25
+ * @property {string} [invalidMessage] - Pinned message for invalid dates and non-object/non-string json values.
26
+ * @property {string} [invalidJsonMessage] - Pinned message for unparseable json strings.
27
+ */
28
+ /**
29
+ * Normalizes writable sync attributes against a declarative schema.
30
+ *
31
+ * Only present keys are validated, so required attributes may be absent —
32
+ * create defaults own that concern. Input keys not declared in the schema are
33
+ * rejected by default so misspelled or read-only attributes fail loudly
34
+ * instead of being silently discarded (`unknownAttributes: "ignore"` opts
35
+ * out). Validation failures throw through the given error factory so apps
36
+ * control the raised error class.
37
+ * @param {object} args - Options.
38
+ * @param {Record<string, ?>} args.attributes - Raw incoming attributes (camelCase and/or snake_case keys).
39
+ * @param {SyncAttributeErrorFactory} args.errorFactory - Maps validation failures to thrown errors.
40
+ * @param {Record<string, SyncAttributeSchemaEntry>} args.schema - Attribute schema keyed by camelCase attribute name.
41
+ * @param {"error" | "ignore"} [args.unknownAttributes] - Unknown input-key handling. Defaults to "error".
42
+ * @returns {Record<string, ?>} Normalized values keyed by snake_case column names.
43
+ */
44
+ export default function normalizeAttributesWithSchema({ attributes, errorFactory, schema, unknownAttributes }: {
45
+ attributes: Record<string, unknown>;
46
+ errorFactory: SyncAttributeErrorFactory;
47
+ schema: Record<string, SyncAttributeSchemaEntry>;
48
+ unknownAttributes?: "error" | "ignore" | undefined;
49
+ }): Record<string, unknown>;
50
+ /**
51
+ * Builds the error thrown for a failed sync attribute validation.
52
+ */
53
+ export type SyncAttributeErrorFactory = (message: string, details: {
54
+ cause?: Error;
55
+ code: string;
56
+ }) => Error;
57
+ /**
58
+ * Declarative validation schema for one writable sync attribute.
59
+ *
60
+ * Keys are camelCase attribute names; each attribute also accepts its
61
+ * snake_case column key on input (the camelCase key wins when both are given)
62
+ * and is written under the snake_case column key on output. Error messages
63
+ * default to `<label> ...` phrasings with `sync-<label>-...` codes, where the
64
+ * label defaults to the camelCase attribute name; apps pin exact messages per
65
+ * attribute through the `*Message` overrides.
66
+ */
67
+ export type SyncAttributeSchemaEntry = {
68
+ /**
69
+ * - Attribute value type.
70
+ */
71
+ type: "date" | "json" | "raw" | "string";
72
+ /**
73
+ * - Whether present blank/absent values are rejected (strings reject blank-after-trim, dates reject null).
74
+ */
75
+ required?: boolean | undefined;
76
+ /**
77
+ * - Maximum string length, checked after trimming.
78
+ */
79
+ maxLength?: number | undefined;
80
+ /**
81
+ * - Label used in derived messages and codes.
82
+ */
83
+ label?: string | undefined;
84
+ /**
85
+ * - Output column key. Defaults to the snake_cased attribute name.
86
+ */
87
+ column?: string | undefined;
88
+ /**
89
+ * - Pinned message for required rejections.
90
+ */
91
+ requiredMessage?: string | undefined;
92
+ /**
93
+ * - Pinned message for too-long rejections.
94
+ */
95
+ tooLongMessage?: string | undefined;
96
+ /**
97
+ * - Pinned message for invalid dates and non-object/non-string json values.
98
+ */
99
+ invalidMessage?: string | undefined;
100
+ /**
101
+ * - Pinned message for unparseable json strings.
102
+ */
103
+ invalidJsonMessage?: string | undefined;
104
+ };
105
+ //# sourceMappingURL=sync-attribute-normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-attribute-normalizer.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-attribute-normalizer.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,+GANG;IAAgC,UAAU,EAAlC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;IACe,YAAY,EAA5C,yBAAyB;IACsB,MAAM,EAArD,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC;IACd,iBAAiB;CACnD,GAAU,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAqC7B;;;;kDA7EU,MAAM,WACN;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,KAC3B,KAAK;;;;;;;;;;;;;;;UAaJ,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ"}