@xemahq/biome-database-nest 7.3.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +57 -0
  2. package/dist/index.d.ts +7 -2
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +22 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/biome-migrations.d.ts +2 -0
  7. package/dist/lib/biome-migrations.d.ts.map +1 -1
  8. package/dist/lib/biome-migrations.js +3 -1
  9. package/dist/lib/biome-migrations.js.map +1 -1
  10. package/dist/lib/bootstrap.d.ts +2 -0
  11. package/dist/lib/bootstrap.d.ts.map +1 -1
  12. package/dist/lib/bootstrap.js +4 -3
  13. package/dist/lib/bootstrap.js.map +1 -1
  14. package/dist/lib/ledger-rows.d.ts +1 -0
  15. package/dist/lib/ledger-rows.d.ts.map +1 -1
  16. package/dist/lib/ledger-rows.js +9 -0
  17. package/dist/lib/ledger-rows.js.map +1 -1
  18. package/dist/lib/nest/biome-database.module.d.ts +2 -0
  19. package/dist/lib/nest/biome-database.module.d.ts.map +1 -1
  20. package/dist/lib/nest/biome-database.module.js +5 -0
  21. package/dist/lib/nest/biome-database.module.js.map +1 -1
  22. package/dist/lib/nest/org-erasure.module.d.ts.map +1 -1
  23. package/dist/lib/nest/org-erasure.module.js +2 -0
  24. package/dist/lib/nest/org-erasure.module.js.map +1 -1
  25. package/dist/lib/nest/prisma-service-factory.d.ts.map +1 -1
  26. package/dist/lib/nest/prisma-service-factory.js +23 -13
  27. package/dist/lib/nest/prisma-service-factory.js.map +1 -1
  28. package/dist/lib/org-quiesce/org-erasure-isolation-error.d.ts +6 -0
  29. package/dist/lib/org-quiesce/org-erasure-isolation-error.d.ts.map +1 -0
  30. package/dist/lib/org-quiesce/org-erasure-isolation-error.js +16 -0
  31. package/dist/lib/org-quiesce/org-erasure-isolation-error.js.map +1 -0
  32. package/dist/lib/org-quiesce/org-erasure-transaction.d.ts +2 -0
  33. package/dist/lib/org-quiesce/org-erasure-transaction.d.ts.map +1 -0
  34. package/dist/lib/org-quiesce/org-erasure-transaction.js +16 -0
  35. package/dist/lib/org-quiesce/org-erasure-transaction.js.map +1 -0
  36. package/dist/lib/org-quiesce/org-quiesce-marks.d.ts +2 -2
  37. package/dist/lib/org-quiesce/org-quiesce-marks.d.ts.map +1 -1
  38. package/dist/lib/org-quiesce/org-quiesce-marks.js +13 -9
  39. package/dist/lib/org-quiesce/org-quiesce-marks.js.map +1 -1
  40. package/dist/lib/org-quiesce/org-quiesce-marks.migrations.d.ts +1 -0
  41. package/dist/lib/org-quiesce/org-quiesce-marks.migrations.d.ts.map +1 -1
  42. package/dist/lib/org-quiesce/org-quiesce-marks.migrations.js +26 -3
  43. package/dist/lib/org-quiesce/org-quiesce-marks.migrations.js.map +1 -1
  44. package/dist/lib/org-quiesce/org-quiesce-refusal-mapping.d.ts +13 -0
  45. package/dist/lib/org-quiesce/org-quiesce-refusal-mapping.d.ts.map +1 -0
  46. package/dist/lib/org-quiesce/org-quiesce-refusal-mapping.js +63 -0
  47. package/dist/lib/org-quiesce/org-quiesce-refusal-mapping.js.map +1 -0
  48. package/dist/lib/org-quiesce/org-quiesce-refusal.d.ts +26 -1
  49. package/dist/lib/org-quiesce/org-quiesce-refusal.d.ts.map +1 -1
  50. package/dist/lib/org-quiesce/org-quiesce-refusal.js +34 -3
  51. package/dist/lib/org-quiesce/org-quiesce-refusal.js.map +1 -1
  52. package/dist/lib/org-quiesce/org-write-fence-apply.d.ts +10 -0
  53. package/dist/lib/org-quiesce/org-write-fence-apply.d.ts.map +1 -0
  54. package/dist/lib/org-quiesce/org-write-fence-apply.js +55 -0
  55. package/dist/lib/org-quiesce/org-write-fence-apply.js.map +1 -0
  56. package/dist/lib/org-quiesce/org-write-fence-coverage.d.ts +18 -0
  57. package/dist/lib/org-quiesce/org-write-fence-coverage.d.ts.map +1 -0
  58. package/dist/lib/org-quiesce/org-write-fence-coverage.js +51 -0
  59. package/dist/lib/org-quiesce/org-write-fence-coverage.js.map +1 -0
  60. package/dist/lib/org-quiesce/org-write-fence-token.sql.d.ts +2 -0
  61. package/dist/lib/org-quiesce/org-write-fence-token.sql.d.ts.map +1 -0
  62. package/dist/lib/org-quiesce/org-write-fence-token.sql.js +80 -0
  63. package/dist/lib/org-quiesce/org-write-fence-token.sql.js.map +1 -0
  64. package/dist/lib/org-quiesce/org-write-fence-triggers.d.ts +48 -0
  65. package/dist/lib/org-quiesce/org-write-fence-triggers.d.ts.map +1 -0
  66. package/dist/lib/org-quiesce/org-write-fence-triggers.js +171 -0
  67. package/dist/lib/org-quiesce/org-write-fence-triggers.js.map +1 -0
  68. package/dist/lib/org-quiesce/org-write-fence.sql.d.ts +2 -0
  69. package/dist/lib/org-quiesce/org-write-fence.sql.d.ts.map +1 -0
  70. package/dist/lib/org-quiesce/org-write-fence.sql.js +132 -0
  71. package/dist/lib/org-quiesce/org-write-fence.sql.js.map +1 -0
  72. package/dist/lib/sdk-owned-migrations.d.ts.map +1 -1
  73. package/dist/lib/sdk-owned-migrations.js +5 -1
  74. package/dist/lib/sdk-owned-migrations.js.map +1 -1
  75. package/dist/lib/service-migration-scan.d.ts +2 -1
  76. package/dist/lib/service-migration-scan.d.ts.map +1 -1
  77. package/dist/lib/service-migration-scan.js +7 -2
  78. package/dist/lib/service-migration-scan.js.map +1 -1
  79. package/dist/lib/tenant-isolation/authored-resource-org-erasure.d.ts.map +1 -1
  80. package/dist/lib/tenant-isolation/authored-resource-org-erasure.js +22 -19
  81. package/dist/lib/tenant-isolation/authored-resource-org-erasure.js.map +1 -1
  82. package/dist/lib/tenant-isolation/org-erasure.d.ts.map +1 -1
  83. package/dist/lib/tenant-isolation/org-erasure.js +8 -7
  84. package/dist/lib/tenant-isolation/org-erasure.js.map +1 -1
  85. package/package.json +7 -6
  86. package/xema-peer-facts.json +3 -3
@@ -14,6 +14,7 @@ const common_1 = require("@nestjs/common");
14
14
  const platform_common_1 = require("@xemahq/platform-common");
15
15
  const adapter_1 = require("../adapter");
16
16
  const resolve_org_erasure_api_1 = require("../org-erasure-coverage/resolve-org-erasure-api");
17
+ const org_quiesce_refusal_mapping_1 = require("../org-quiesce/org-quiesce-refusal-mapping");
17
18
  const tenant_isolation_mode_1 = require("../tenant-isolation/tenant-isolation-mode");
18
19
  const tenant_isolation_extension_1 = require("../tenant-isolation/tenant-isolation.extension");
19
20
  const unscoped_models_1 = require("../tenant-isolation/unscoped-models");
@@ -42,14 +43,16 @@ function createBiomePrismaService(PrismaClientCtor, options) {
42
43
  const mode = (0, tenant_isolation_mode_1.resolveTenantIsolationMode)(tenantOptions.mode);
43
44
  const raw = this;
44
45
  const tenantLogger = new common_1.Logger(`${loggerContext}:tenant-isolation`);
45
- const requireExtends = () => {
46
- const extendsFn = raw.$extends;
46
+ const extendWith = (client, extension) => {
47
+ const extendsFn = client.$extends;
47
48
  if (typeof extendsFn !== 'function') {
48
49
  throw new Error('[tenant-isolation] the Prisma client has no $extends — tenant ' +
49
- 'isolation requires a generated @prisma/client >= 5 (this SDK peers on ^7).');
50
+ 'isolation and the org write-fence refusal mapping require a generated @prisma/client >= 5 (this SDK peers on ^7).');
50
51
  }
51
- return extendsFn.bind(raw);
52
+ return extendsFn.call(client, extension);
52
53
  };
54
+ const base = extendWith(raw, (0, org_quiesce_refusal_mapping_1.createOrgQuiesceRefusalExtension)());
55
+ const requireExtends = () => (extension) => extendWith(base, extension);
53
56
  let scopedModelsCache;
54
57
  const getScopedModels = () => {
55
58
  scopedModelsCache ??= (0, tenant_isolation_extension_1.collectOrgScopedModels)(raw, orgField, exemptModels);
@@ -86,23 +89,29 @@ function createBiomePrismaService(PrismaClientCtor, options) {
86
89
  seenSystemCallSites.add(callSite);
87
90
  tenantLogger.debug(`[tenant-isolation] asSystem() unscoped access from ${callSite}`);
88
91
  }
89
- return raw;
92
+ return base;
90
93
  };
94
+ const shadowOf = (client) => Object.create(client);
91
95
  const explicitApi = new Map([
92
96
  ['forOrg', forOrg],
93
97
  ['asSystem', asSystem],
94
98
  ['orgErasureCoverage', orgErasureApi.orgErasureCoverage],
95
99
  ['eraseOrg', orgErasureApi.eraseOrg],
96
100
  ]);
101
+ const rawOn = raw.$on;
102
+ if (typeof rawOn === 'function') {
103
+ explicitApi.set('$on', rawOn.bind(raw));
104
+ }
97
105
  if (mode === tenant_isolation_mode_1.TenantIsolationMode.Off) {
98
- return new Proxy(raw, {
99
- get(target, prop, _receiver) {
106
+ return new Proxy(shadowOf(base), {
107
+ get(_target, prop, _receiver) {
100
108
  if (explicitApi.has(prop)) {
101
109
  return explicitApi.get(prop);
102
110
  }
103
- const value = Reflect.get(target, prop, target);
104
- return typeof value === 'function' ? value.bind(target) : value;
111
+ const value = Reflect.get(base, prop, base);
112
+ return typeof value === 'function' ? value.bind(base) : value;
105
113
  },
114
+ has: (_target, prop) => explicitApi.has(prop) || prop in base,
106
115
  });
107
116
  }
108
117
  const ambientClient = requireExtends()((0, tenant_isolation_extension_1.createTenantIsolationExtension)({
@@ -116,8 +125,8 @@ function createBiomePrismaService(PrismaClientCtor, options) {
116
125
  for (const modelName of getScopedModels()) {
117
126
  routedProps.add(lowerFirst(modelName));
118
127
  }
119
- return new Proxy(raw, {
120
- get(target, prop, _receiver) {
128
+ return new Proxy(shadowOf(base), {
129
+ get(_target, prop, _receiver) {
121
130
  if (explicitApi.has(prop)) {
122
131
  return explicitApi.get(prop);
123
132
  }
@@ -127,9 +136,10 @@ function createBiomePrismaService(PrismaClientCtor, options) {
127
136
  ? value.bind(ambientClient)
128
137
  : value;
129
138
  }
130
- const value = Reflect.get(target, prop, target);
131
- return typeof value === 'function' ? value.bind(target) : value;
139
+ const value = Reflect.get(base, prop, base);
140
+ return typeof value === 'function' ? value.bind(base) : value;
132
141
  },
142
+ has: (_target, prop) => explicitApi.has(prop) || prop in base,
133
143
  });
134
144
  }
135
145
  async onModuleInit() {
@@ -1 +1 @@
1
- {"version":3,"file":"prisma-service-factory.js","sourceRoot":"","sources":["../../../src/lib/nest/prisma-service-factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prisma-service-factory.js","sourceRoot":"","sources":["../../../src/lib/nest/prisma-service-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare class OrgErasureIsolationError extends Error {
2
+ readonly isolationLevel: string;
3
+ readonly code = "ORG_ERASURE_ISOLATION";
4
+ constructor(isolationLevel: string);
5
+ }
6
+ //# sourceMappingURL=org-erasure-isolation-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-erasure-isolation-error.d.ts","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-erasure-isolation-error.ts"],"names":[],"mappings":"AACA,qBAAa,wBAAyB,SAAQ,KAAK;aAI/B,cAAc,EAAE,MAAM;IAHxC,SAAgB,IAAI,2BAA2B;gBAG7B,cAAc,EAAE,MAAM;CASzC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OrgErasureIsolationError = void 0;
4
+ class OrgErasureIsolationError extends Error {
5
+ isolationLevel;
6
+ code = 'ORG_ERASURE_ISOLATION';
7
+ constructor(isolationLevel) {
8
+ super(`[org-erasure] ORG_ERASURE_ISOLATION: an org erasure must run in a READ COMMITTED transaction, but this one is ${isolationLevel}. ` +
9
+ 'Under a fixed snapshot the eraser would not see a row a Read Committed writer commits while the eraser waits for the org lock, and that row would survive the erasure. ' +
10
+ 'Open the transaction with isolationLevel ReadCommitted (inOrgErasureTransaction does).');
11
+ this.isolationLevel = isolationLevel;
12
+ this.name = 'OrgErasureIsolationError';
13
+ }
14
+ }
15
+ exports.OrgErasureIsolationError = OrgErasureIsolationError;
16
+ //# sourceMappingURL=org-erasure-isolation-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-erasure-isolation-error.js","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-erasure-isolation-error.ts"],"names":[],"mappings":";;;AACA,MAAa,wBAAyB,SAAQ,KAAK;IAI/B;IAHF,IAAI,GAAG,uBAAuB,CAAC;IAE/C,YACkB,cAAsB;QAEtC,KAAK,CACH,iHAAiH,cAAc,IAAI;YACjI,yKAAyK;YACzK,wFAAwF,CAC3F,CAAC;QANc,mBAAc,GAAd,cAAc,CAAQ;QAOtC,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAbD,4DAaC"}
@@ -0,0 +1,2 @@
1
+ export declare function inOrgErasureTransaction<T>(client: unknown, orgId: string, work: (tx: Record<string, unknown>) => Promise<T>): Promise<T>;
2
+ //# sourceMappingURL=org-erasure-transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-erasure-transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-erasure-transaction.ts"],"names":[],"mappings":"AAqBA,wBAAsB,uBAAuB,CAAC,CAAC,EAC7C,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAChD,OAAO,CAAC,CAAC,CAAC,CAmBZ"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inOrgErasureTransaction = inOrgErasureTransaction;
4
+ const org_quiesce_marks_1 = require("./org-quiesce-marks");
5
+ const ORG_ERASURE_ISOLATION_LEVEL = 'ReadCommitted';
6
+ async function inOrgErasureTransaction(client, orgId, work) {
7
+ if (typeof client?.$transaction !==
8
+ 'function') {
9
+ throw new Error('[org-erasure] the Prisma client has no $transaction; an org erasure runs inside one so it can hold the org quiesce lock.');
10
+ }
11
+ return await client.$transaction(async (tx) => {
12
+ await (0, org_quiesce_marks_1.beginOrgErasureWithinTx)(tx, orgId);
13
+ return await work(tx);
14
+ }, { isolationLevel: ORG_ERASURE_ISOLATION_LEVEL });
15
+ }
16
+ //# sourceMappingURL=org-erasure-transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-erasure-transaction.js","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-erasure-transaction.ts"],"names":[],"mappings":";;AAqBA,0DAuBC;AA5CD,2DAA8D;AAK9D,MAAM,2BAA2B,GAAG,eAAe,CAAC;AAgB7C,KAAK,UAAU,uBAAuB,CAC3C,MAAe,EACf,KAAa,EACb,IAAiD;IAEjD,IACE,OAAQ,MAA8C,EAAE,YAAY;QACpE,UAAU,EACV,CAAC;QACD,MAAM,IAAI,KAAK,CACb,0HAA0H,CAC3H,CAAC;IACJ,CAAC;IAID,OAAO,MAAO,MAA8B,CAAC,YAAY,CACvD,KAAK,EAAE,EAAE,EAAE,EAAE;QACX,MAAM,IAAA,2CAAuB,EAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC,EACD,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAChD,CAAC;AACJ,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { type Sql } from '@prisma/client/runtime/client';
2
- import { type AdvisoryLockClient } from '../advisory-lock';
3
- export declare function orgQuiesceLockKey(orgId: string): string;
2
+ import type { AdvisoryLockClient } from '../advisory-lock';
4
3
  export declare function markOrgQuiescingWithinTx(tx: AdvisoryLockClient, orgId: string): Promise<void>;
5
4
  export declare function isOrgQuiescingWithinTx(tx: AdvisoryLockClient, orgId: string): Promise<boolean>;
5
+ export declare function beginOrgErasureWithinTx(tx: AdvisoryLockClient, orgId: string): Promise<void>;
6
6
  export declare function assertOrgNotQuiescingWithinTx(tx: AdvisoryLockClient, orgId: string): Promise<void>;
7
7
  export declare function isOrgQuiescing(db: AdvisoryLockClient, orgId: string): Promise<boolean>;
8
8
  export declare function orgNotQuiescingSql(orgIdColumn: Sql): Sql;
@@ -1 +1 @@
1
- {"version":3,"file":"org-quiesce-marks.d.ts","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-marks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,GAAG,EAAE,MAAM,+BAA+B,CAAC;AAGjE,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAO1B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAWD,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAGf;AAcD,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAGlB;AAGD,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAIf;AAOD,wBAAsB,cAAc,CAClC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAElB;AAwBD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,GAAG,GAAG,GAAG,CAExD"}
1
+ {"version":3,"file":"org-quiesce-marks.d.ts","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-marks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,GAAG,EAAE,MAAM,+BAA+B,CAAC;AAKjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAa3D,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAEf;AAgBD,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAKlB;AAiBD,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAcf;AAGD,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAIf;AAOD,wBAAsB,cAAc,CAClC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAElB;AAwBD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,GAAG,GAAG,GAAG,CAExD"}
@@ -1,24 +1,28 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.orgQuiesceLockKey = orgQuiesceLockKey;
4
3
  exports.markOrgQuiescingWithinTx = markOrgQuiescingWithinTx;
5
4
  exports.isOrgQuiescingWithinTx = isOrgQuiescingWithinTx;
5
+ exports.beginOrgErasureWithinTx = beginOrgErasureWithinTx;
6
6
  exports.assertOrgNotQuiescingWithinTx = assertOrgNotQuiescingWithinTx;
7
7
  exports.isOrgQuiescing = isOrgQuiescing;
8
8
  exports.orgNotQuiescingSql = orgNotQuiescingSql;
9
9
  const client_1 = require("@prisma/client/runtime/client");
10
+ const org_erasure_isolation_error_1 = require("./org-erasure-isolation-error");
10
11
  const org_quiesce_refusal_1 = require("./org-quiesce-refusal");
11
- const advisory_lock_1 = require("../advisory-lock");
12
- function orgQuiesceLockKey(orgId) {
13
- return `org-quiesce:${orgId}`;
14
- }
15
12
  async function markOrgQuiescingWithinTx(tx, orgId) {
16
- await (0, advisory_lock_1.acquireSchemaScopedXactAdvisoryLock)(tx, orgQuiesceLockKey(orgId));
17
- await tx.$executeRaw `INSERT INTO "org_quiesce_marks" ("org_id") VALUES (${orgId}) ON CONFLICT ("org_id") DO NOTHING`;
13
+ await tx.$executeRaw `SELECT xema_org_quiesce_mark(${orgId})`;
18
14
  }
19
15
  async function isOrgQuiescingWithinTx(tx, orgId) {
20
- await (0, advisory_lock_1.acquireSchemaScopedXactAdvisoryLockShared)(tx, orgQuiesceLockKey(orgId));
21
- return readMark(tx, orgId);
16
+ const rows = await tx.$queryRaw `SELECT xema_org_is_quiescing(${orgId}) AS quiescing`;
17
+ return rows[0]?.quiescing === true;
18
+ }
19
+ async function beginOrgErasureWithinTx(tx, orgId) {
20
+ const rows = await tx.$queryRaw `SELECT current_setting('transaction_isolation') AS level`;
21
+ const level = rows[0]?.level;
22
+ if (level !== 'read committed') {
23
+ throw new org_erasure_isolation_error_1.OrgErasureIsolationError(level ?? 'unknown');
24
+ }
25
+ await tx.$executeRaw `SELECT xema_org_begin_erasure(${orgId})`;
22
26
  }
23
27
  async function assertOrgNotQuiescingWithinTx(tx, orgId) {
24
28
  if (await isOrgQuiescingWithinTx(tx, orgId)) {
@@ -1 +1 @@
1
- {"version":3,"file":"org-quiesce-marks.js","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-marks.ts"],"names":[],"mappings":";;AAcA,8CAEC;AAWD,4DAMC;AAcD,wDAMC;AAGD,sEAOC;AAOD,wCAKC;AAwBD,gDAEC;AArGD,0DAAiE;AAEjE,+DAAiE;AACjE,oDAI0B;AAO1B,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,OAAO,eAAe,KAAK,EAAE,CAAC;AAChC,CAAC;AAWM,KAAK,UAAU,wBAAwB,CAC5C,EAAsB,EACtB,KAAa;IAEb,MAAM,IAAA,mDAAmC,EAAC,EAAE,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,MAAM,EAAE,CAAC,WAAW,CAAA,sDAAsD,KAAK,qCAAqC,CAAC;AACvH,CAAC;AAcM,KAAK,UAAU,sBAAsB,CAC1C,EAAsB,EACtB,KAAa;IAEb,MAAM,IAAA,yDAAyC,EAAC,EAAE,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9E,OAAO,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAGM,KAAK,UAAU,6BAA6B,CACjD,EAAsB,EACtB,KAAa;IAEb,IAAI,MAAM,sBAAsB,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,8CAAwB,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAOM,KAAK,UAAU,cAAc,CAClC,EAAsB,EACtB,KAAa;IAEb,OAAO,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAwBD,SAAgB,kBAAkB,CAAC,WAAgB;IACjD,OAAO,IAAA,eAAM,EAAA,sFAAsF,WAAW,GAAG,CAAC;AACpH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,EAAsB,EAAE,KAAa;IAC3D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,SAAS,CAE9B,6DAA6D,KAAK,EAAE,CAAC;IACtE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"org-quiesce-marks.js","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-marks.ts"],"names":[],"mappings":";;AAkBA,4DAKC;AAgBD,wDAQC;AAiBD,0DAiBC;AAGD,sEAOC;AAOD,wCAKC;AAwBD,gDAEC;AAjID,0DAAiE;AAEjE,+EAAyE;AACzE,+DAAiE;AAe1D,KAAK,UAAU,wBAAwB,CAC5C,EAAsB,EACtB,KAAa;IAEb,MAAM,EAAE,CAAC,WAAW,CAAA,gCAAgC,KAAK,GAAG,CAAC;AAC/D,CAAC;AAgBM,KAAK,UAAU,sBAAsB,CAC1C,EAAsB,EACtB,KAAa;IAEb,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,SAAS,CAE9B,gCAAgC,KAAK,gBAAgB,CAAC;IACvD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;AACrC,CAAC;AAiBM,KAAK,UAAU,uBAAuB,CAC3C,EAAsB,EACtB,KAAa;IAOb,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,SAAS,CAE9B,0DAA0D,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IAC7B,IAAI,KAAK,KAAK,gBAAgB,EAAE,CAAC;QAC/B,MAAM,IAAI,sDAAwB,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,EAAE,CAAC,WAAW,CAAA,iCAAiC,KAAK,GAAG,CAAC;AAChE,CAAC;AAGM,KAAK,UAAU,6BAA6B,CACjD,EAAsB,EACtB,KAAa;IAEb,IAAI,MAAM,sBAAsB,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,8CAAwB,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAOM,KAAK,UAAU,cAAc,CAClC,EAAsB,EACtB,KAAa;IAEb,OAAO,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAwBD,SAAgB,kBAAkB,CAAC,WAAgB;IACjD,OAAO,IAAA,eAAM,EAAA,sFAAsF,WAAW,GAAG,CAAC;AACpH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,EAAsB,EAAE,KAAa;IAC3D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,SAAS,CAE9B,6DAA6D,KAAK,EAAE,CAAC;IACtE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  import type { SdkOwnedMigrationSet } from '../sdk-owned-migration-set';
2
+ export declare const ORG_QUIESCE_OWNER = "org-quiesce";
2
3
  export declare const orgQuiesceMarksMigrations: SdkOwnedMigrationSet;
3
4
  //# sourceMappingURL=org-quiesce-marks.migrations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"org-quiesce-marks.migrations.d.ts","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-marks.migrations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EAErB,MAAM,4BAA4B,CAAC;AAqDpC,eAAO,MAAM,yBAAyB,EAAE,oBAgCvC,CAAC"}
1
+ {"version":3,"file":"org-quiesce-marks.migrations.d.ts","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-marks.migrations.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EAErB,MAAM,4BAA4B,CAAC;AAkEpC,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAE/C,eAAO,MAAM,yBAAyB,EAAE,oBA4CvC,CAAC"}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.orgQuiesceMarksMigrations = void 0;
3
+ exports.orgQuiesceMarksMigrations = exports.ORG_QUIESCE_OWNER = void 0;
4
+ const org_write_fence_token_sql_1 = require("./org-write-fence-token.sql");
5
+ const org_write_fence_sql_1 = require("./org-write-fence.sql");
4
6
  const MARKS_SQL = `
5
7
  CREATE TABLE "org_quiesce_marks" (
6
8
  "org_id" TEXT NOT NULL,
@@ -23,6 +25,16 @@ const MARKS_SHAPE = {
23
25
  checks: [],
24
26
  indexes: [],
25
27
  };
28
+ const TOKEN_SHAPE = {
29
+ name: 'org_write_fence_rows',
30
+ columns: [
31
+ { name: 'org_id', type: 'text', notNull: true, default: null },
32
+ { name: 'version', type: 'bigint', notNull: true, default: '0' },
33
+ ],
34
+ primaryKey: ['org_id'],
35
+ checks: [],
36
+ indexes: [],
37
+ };
26
38
  const MIGRATION_VERSION = '0001-org-quiesce-marks';
27
39
  const priorCreator = (serviceMigration, sha256) => ({
28
40
  table: 'org_quiesce_marks',
@@ -31,16 +43,27 @@ const priorCreator = (serviceMigration, sha256) => ({
31
43
  standsInFor: MIGRATION_VERSION,
32
44
  createdShape: MARKS_SHAPE,
33
45
  });
46
+ exports.ORG_QUIESCE_OWNER = 'org-quiesce';
34
47
  exports.orgQuiesceMarksMigrations = {
35
- owner: 'org-quiesce',
48
+ owner: exports.ORG_QUIESCE_OWNER,
36
49
  migrations: [
37
50
  {
38
51
  version: MIGRATION_VERSION,
39
52
  creates: ['org_quiesce_marks'],
40
53
  sql: MARKS_SQL,
41
54
  },
55
+ {
56
+ version: '0002-org-write-fence',
57
+ creates: [],
58
+ sql: org_write_fence_sql_1.ORG_WRITE_FENCE_SQL,
59
+ },
60
+ {
61
+ version: '0003-org-write-fence-token',
62
+ creates: ['org_write_fence_rows'],
63
+ sql: org_write_fence_token_sql_1.ORG_WRITE_FENCE_TOKEN_SQL,
64
+ },
42
65
  ],
43
- tables: [MARKS_SHAPE],
66
+ tables: [MARKS_SHAPE, TOKEN_SHAPE],
44
67
  priorCreators: [
45
68
  priorCreator('20261018000000_org_quiesce_marks', '14b7724dedb83957b3ec55ca2df39820993ff7811f67ee3f7db781277102ec3c'),
46
69
  priorCreator('20261018000000_org_quiesce_marks', '71587424ecd86f56c909de30e8b89a8e58a0b9915dbaf7294a4f2df638270db8'),
@@ -1 +1 @@
1
- {"version":3,"file":"org-quiesce-marks.migrations.js","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-marks.migrations.ts"],"names":[],"mappings":";;;AAYA,MAAM,SAAS,GAAG;;;;;;CAMjB,CAAC;AAEF,MAAM,WAAW,GAAoB;IACnC,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;QAC9D;YACE,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,gCAAgC;YACtC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,mBAAmB;SAC7B;KACF;IACD,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AAEnD,MAAM,YAAY,GAAG,CACnB,gBAAwB,EACxB,MAAc,EACa,EAAE,CAAC,CAAC;IAC/B,KAAK,EAAE,mBAAmB;IAC1B,gBAAgB;IAChB,MAAM;IACN,WAAW,EAAE,iBAAiB;IAC9B,YAAY,EAAE,WAAW;CAC1B,CAAC,CAAC;AAUU,QAAA,yBAAyB,GAAyB;IAC7D,KAAK,EAAE,aAAa;IACpB,UAAU,EAAE;QACV;YACE,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE,CAAC,mBAAmB,CAAC;YAC9B,GAAG,EAAE,SAAS;SACf;KACF;IACD,MAAM,EAAE,CAAC,WAAW,CAAC;IACrB,aAAa,EAAE;QAEb,YAAY,CACV,kCAAkC,EAClC,kEAAkE,CACnE;QAED,YAAY,CACV,kCAAkC,EAClC,kEAAkE,CACnE;QAED,YAAY,CACV,kCAAkC,EAClC,kEAAkE,CACnE;QAED,YAAY,CACV,kCAAkC,EAClC,kEAAkE,CACnE;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"org-quiesce-marks.migrations.js","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-marks.migrations.ts"],"names":[],"mappings":";;;AAAA,2EAAwE;AACxE,+DAA4D;AAc5D,MAAM,SAAS,GAAG;;;;;;CAMjB,CAAC;AAEF,MAAM,WAAW,GAAoB;IACnC,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;QAC9D;YACE,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,gCAAgC;YACtC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,mBAAmB;SAC7B;KACF;IACD,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;CACZ,CAAC;AAGF,MAAM,WAAW,GAAoB;IACnC,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;QAC9D,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE;KACjE;IACD,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AAEnD,MAAM,YAAY,GAAG,CACnB,gBAAwB,EACxB,MAAc,EACa,EAAE,CAAC,CAAC;IAC/B,KAAK,EAAE,mBAAmB;IAC1B,gBAAgB;IAChB,MAAM;IACN,WAAW,EAAE,iBAAiB;IAC9B,YAAY,EAAE,WAAW;CAC1B,CAAC,CAAC;AAWU,QAAA,iBAAiB,GAAG,aAAa,CAAC;AAElC,QAAA,yBAAyB,GAAyB;IAC7D,KAAK,EAAE,yBAAiB;IACxB,UAAU,EAAE;QACV;YACE,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE,CAAC,mBAAmB,CAAC;YAC9B,GAAG,EAAE,SAAS;SACf;QACD;YAEE,OAAO,EAAE,sBAAsB;YAC/B,OAAO,EAAE,EAAE;YACX,GAAG,EAAE,yCAAmB;SACzB;QACD;YAEE,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE,CAAC,sBAAsB,CAAC;YACjC,GAAG,EAAE,qDAAyB;SAC/B;KACF;IACD,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,aAAa,EAAE;QAEb,YAAY,CACV,kCAAkC,EAClC,kEAAkE,CACnE;QAED,YAAY,CACV,kCAAkC,EAClC,kEAAkE,CACnE;QAED,YAAY,CACV,kCAAkC,EAClC,kEAAkE,CACnE;QAED,YAAY,CACV,kCAAkC,EAClC,kEAAkE,CACnE;KACF;CACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { OrgFenceParentMissingError, OrgFenceTruncateRefusedError, OrgQuiescingRefusedError } from './org-quiesce-refusal';
2
+ export declare function orgFenceRefusalFrom(error: unknown): OrgQuiescingRefusedError | OrgFenceParentMissingError | OrgFenceTruncateRefusedError | undefined;
3
+ export declare function orgQuiescingRefusalFrom(error: unknown): OrgQuiescingRefusedError | undefined;
4
+ export declare function createOrgQuiesceRefusalExtension(): {
5
+ readonly name: string;
6
+ readonly query: {
7
+ readonly $allOperations: (ctx: {
8
+ readonly args: unknown;
9
+ readonly query: (args: unknown) => Promise<unknown>;
10
+ }) => Promise<unknown>;
11
+ };
12
+ };
13
+ //# sourceMappingURL=org-quiesce-refusal-mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-quiesce-refusal-mapping.d.ts","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-refusal-mapping.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAE1B,4BAA4B,EAC5B,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAkD/B,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,GAEZ,wBAAwB,GACxB,0BAA0B,GAC1B,4BAA4B,GAC5B,SAAS,CAeZ;AAGD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,GACb,wBAAwB,GAAG,SAAS,CAGtC;AASD,wBAAgB,gCAAgC,IAAI;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE;YAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;YACvB,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;SACrD,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KACxB,CAAC;CACH,CAaA"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.orgFenceRefusalFrom = orgFenceRefusalFrom;
4
+ exports.orgQuiescingRefusalFrom = orgQuiescingRefusalFrom;
5
+ exports.createOrgQuiesceRefusalExtension = createOrgQuiesceRefusalExtension;
6
+ const org_quiesce_refusal_1 = require("./org-quiesce-refusal");
7
+ const isRecord = (value) => typeof value === 'object' && value !== null;
8
+ function fieldsOf(candidate) {
9
+ if (!isRecord(candidate) || typeof candidate['code'] !== 'string') {
10
+ return undefined;
11
+ }
12
+ const { detail } = candidate;
13
+ return {
14
+ code: candidate['code'],
15
+ detail: typeof detail === 'string' ? detail : undefined,
16
+ };
17
+ }
18
+ function sqlErrorOf(error) {
19
+ if (!isRecord(error)) {
20
+ return undefined;
21
+ }
22
+ const { meta } = error;
23
+ const adapterError = isRecord(meta) ? meta['driverAdapterError'] : undefined;
24
+ return ((isRecord(adapterError) ? fieldsOf(adapterError['cause']) : undefined) ??
25
+ fieldsOf(error['cause']) ??
26
+ fieldsOf(error));
27
+ }
28
+ function orgFenceRefusalFrom(error) {
29
+ const fields = sqlErrorOf(error);
30
+ if (fields?.detail === undefined) {
31
+ return undefined;
32
+ }
33
+ switch (fields.code) {
34
+ case org_quiesce_refusal_1.OrgFenceSqlState.OrgQuiescing:
35
+ return new org_quiesce_refusal_1.OrgQuiescingRefusedError(fields.detail, { cause: error });
36
+ case org_quiesce_refusal_1.OrgFenceSqlState.ParentMissing:
37
+ return new org_quiesce_refusal_1.OrgFenceParentMissingError(fields.detail, { cause: error });
38
+ case org_quiesce_refusal_1.OrgFenceSqlState.TruncateRefused:
39
+ return new org_quiesce_refusal_1.OrgFenceTruncateRefusedError(fields.detail, { cause: error });
40
+ default:
41
+ return undefined;
42
+ }
43
+ }
44
+ function orgQuiescingRefusalFrom(error) {
45
+ const refusal = orgFenceRefusalFrom(error);
46
+ return refusal instanceof org_quiesce_refusal_1.OrgQuiescingRefusedError ? refusal : undefined;
47
+ }
48
+ function createOrgQuiesceRefusalExtension() {
49
+ return {
50
+ name: 'xema-org-quiesce-refusal',
51
+ query: {
52
+ async $allOperations({ args, query }) {
53
+ try {
54
+ return await query(args);
55
+ }
56
+ catch (error) {
57
+ throw orgFenceRefusalFrom(error) ?? error;
58
+ }
59
+ },
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=org-quiesce-refusal-mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-quiesce-refusal-mapping.js","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-refusal-mapping.ts"],"names":[],"mappings":";;AAuDA,kDAqBC;AAGD,0DAKC;AASD,4EAqBC;AAlHD,+DAK+B;AAO/B,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AAE9C,SAAS,QAAQ,CAAC,SAAkB;IAClC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC;QACvB,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KACxD,CAAC;AACJ,CAAC;AASD,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,OAAO,CACL,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxB,QAAQ,CAAC,KAAK,CAAC,CAChB,CAAC;AACJ,CAAC;AAWD,SAAgB,mBAAmB,CACjC,KAAc;IAMd,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,sCAAgB,CAAC,YAAY;YAChC,OAAO,IAAI,8CAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,KAAK,sCAAgB,CAAC,aAAa;YACjC,OAAO,IAAI,gDAA0B,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,KAAK,sCAAgB,CAAC,eAAe;YACnC,OAAO,IAAI,kDAA4B,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAGD,SAAgB,uBAAuB,CACrC,KAAc;IAEd,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,OAAO,YAAY,8CAAwB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AASD,SAAgB,gCAAgC;IAS9C,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,KAAK,EAAE;YACL,KAAK,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;gBAClC,IAAI,CAAC;oBACH,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,mBAAmB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;gBAC5C,CAAC;YACH,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -2,7 +2,32 @@ import { HttpException } from '@nestjs/common';
2
2
  export declare enum OrgQuiesceRefusal {
3
3
  OrgQuiescing = "ORG_QUIESCING"
4
4
  }
5
+ export declare enum OrgFenceSqlState {
6
+ OrgQuiescing = "XQ409",
7
+ ParentMissing = "XQ404",
8
+ TruncateRefused = "XQ410"
9
+ }
10
+ export declare enum OrgFenceFailure {
11
+ ParentMissing = "ORG_FENCE_PARENT_MISSING",
12
+ TruncateRefused = "ORG_FENCE_TRUNCATE_REFUSED"
13
+ }
5
14
  export declare class OrgQuiescingRefusedError extends HttpException {
6
- constructor(orgId: string);
15
+ constructor(orgId: string, options?: {
16
+ readonly cause?: unknown;
17
+ });
18
+ }
19
+ export declare class OrgFenceParentMissingError extends Error {
20
+ readonly fkValue: string;
21
+ readonly code = OrgFenceFailure.ParentMissing;
22
+ constructor(fkValue: string, options?: {
23
+ readonly cause?: unknown;
24
+ });
25
+ }
26
+ export declare class OrgFenceTruncateRefusedError extends Error {
27
+ readonly table: string;
28
+ readonly code = OrgFenceFailure.TruncateRefused;
29
+ constructor(table: string, options?: {
30
+ readonly cause?: unknown;
31
+ });
7
32
  }
8
33
  //# sourceMappingURL=org-quiesce-refusal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"org-quiesce-refusal.d.ts","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-refusal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAc,MAAM,gBAAgB,CAAC;AAG3D,oBAAY,iBAAiB;IAE3B,YAAY,kBAAkB;CAC/B;AAGD,qBAAa,wBAAyB,SAAQ,aAAa;gBACtC,KAAK,EAAE,MAAM;CAUjC"}
1
+ {"version":3,"file":"org-quiesce-refusal.d.ts","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-refusal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAc,MAAM,gBAAgB,CAAC;AAG3D,oBAAY,iBAAiB;IAE3B,YAAY,kBAAkB;CAC/B;AAMD,oBAAY,gBAAgB;IAE1B,YAAY,UAAU;IAEtB,aAAa,UAAU;IAEvB,eAAe,UAAU;CAC1B;AAGD,oBAAY,eAAe;IACzB,aAAa,6BAA6B;IAC1C,eAAe,+BAA+B;CAC/C;AAGD,qBAAa,wBAAyB,SAAQ,aAAa;gBACtC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAWzE;AASD,qBAAa,0BAA2B,SAAQ,KAAK;aAIjC,OAAO,EAAE,MAAM;IAHjC,SAAgB,IAAI,iCAAiC;gBAGnC,OAAO,EAAE,MAAM,EAC/B,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQzC;AAGD,qBAAa,4BAA6B,SAAQ,KAAK;aAInC,KAAK,EAAE,MAAM;IAH/B,SAAgB,IAAI,mCAAmC;gBAGrC,KAAK,EAAE,MAAM,EAC7B,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQzC"}
@@ -1,19 +1,50 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OrgQuiescingRefusedError = exports.OrgQuiesceRefusal = void 0;
3
+ exports.OrgFenceTruncateRefusedError = exports.OrgFenceParentMissingError = exports.OrgQuiescingRefusedError = exports.OrgFenceFailure = exports.OrgFenceSqlState = exports.OrgQuiesceRefusal = void 0;
4
4
  const common_1 = require("@nestjs/common");
5
5
  var OrgQuiesceRefusal;
6
6
  (function (OrgQuiesceRefusal) {
7
7
  OrgQuiesceRefusal["OrgQuiescing"] = "ORG_QUIESCING";
8
8
  })(OrgQuiesceRefusal || (exports.OrgQuiesceRefusal = OrgQuiesceRefusal = {}));
9
+ var OrgFenceSqlState;
10
+ (function (OrgFenceSqlState) {
11
+ OrgFenceSqlState["OrgQuiescing"] = "XQ409";
12
+ OrgFenceSqlState["ParentMissing"] = "XQ404";
13
+ OrgFenceSqlState["TruncateRefused"] = "XQ410";
14
+ })(OrgFenceSqlState || (exports.OrgFenceSqlState = OrgFenceSqlState = {}));
15
+ var OrgFenceFailure;
16
+ (function (OrgFenceFailure) {
17
+ OrgFenceFailure["ParentMissing"] = "ORG_FENCE_PARENT_MISSING";
18
+ OrgFenceFailure["TruncateRefused"] = "ORG_FENCE_TRUNCATE_REFUSED";
19
+ })(OrgFenceFailure || (exports.OrgFenceFailure = OrgFenceFailure = {}));
9
20
  class OrgQuiescingRefusedError extends common_1.HttpException {
10
- constructor(orgId) {
21
+ constructor(orgId, options) {
11
22
  super({
12
23
  code: OrgQuiesceRefusal.OrgQuiescing,
13
24
  message: `${OrgQuiesceRefusal.OrgQuiescing}: org ${orgId} is being erased; no new write may be made for it.`,
14
- }, common_1.HttpStatus.CONFLICT);
25
+ }, common_1.HttpStatus.CONFLICT, options);
15
26
  this.name = 'OrgQuiescingRefusedError';
16
27
  }
17
28
  }
18
29
  exports.OrgQuiescingRefusedError = OrgQuiescingRefusedError;
30
+ class OrgFenceParentMissingError extends Error {
31
+ fkValue;
32
+ code = OrgFenceFailure.ParentMissing;
33
+ constructor(fkValue, options) {
34
+ super(`${OrgFenceFailure.ParentMissing}: no parent row for foreign key value ${fkValue}; the row's org is unknown, so the write is refused.`, options);
35
+ this.fkValue = fkValue;
36
+ this.name = 'OrgFenceParentMissingError';
37
+ }
38
+ }
39
+ exports.OrgFenceParentMissingError = OrgFenceParentMissingError;
40
+ class OrgFenceTruncateRefusedError extends Error {
41
+ table;
42
+ code = OrgFenceFailure.TruncateRefused;
43
+ constructor(table, options) {
44
+ super(`${OrgFenceFailure.TruncateRefused}: TRUNCATE of "${table}" is refused; the table is org-fenced and a TRUNCATE cannot be attributed to an org. Use DELETE.`, options);
45
+ this.table = table;
46
+ this.name = 'OrgFenceTruncateRefusedError';
47
+ }
48
+ }
49
+ exports.OrgFenceTruncateRefusedError = OrgFenceTruncateRefusedError;
19
50
  //# sourceMappingURL=org-quiesce-refusal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"org-quiesce-refusal.js","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-refusal.ts"],"names":[],"mappings":";;;AAAA,2CAA2D;AAG3D,IAAY,iBAGX;AAHD,WAAY,iBAAiB;IAE3B,mDAA8B,CAAA;AAChC,CAAC,EAHW,iBAAiB,iCAAjB,iBAAiB,QAG5B;AAGD,MAAa,wBAAyB,SAAQ,sBAAa;IACzD,YAAmB,KAAa;QAC9B,KAAK,CACH;YACE,IAAI,EAAE,iBAAiB,CAAC,YAAY;YACpC,OAAO,EAAE,GAAG,iBAAiB,CAAC,YAAY,SAAS,KAAK,oDAAoD;SAC7G,EACD,mBAAU,CAAC,QAAQ,CACpB,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAXD,4DAWC"}
1
+ {"version":3,"file":"org-quiesce-refusal.js","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-quiesce-refusal.ts"],"names":[],"mappings":";;;AAAA,2CAA2D;AAG3D,IAAY,iBAGX;AAHD,WAAY,iBAAiB;IAE3B,mDAA8B,CAAA;AAChC,CAAC,EAHW,iBAAiB,iCAAjB,iBAAiB,QAG5B;AAMD,IAAY,gBAOX;AAPD,WAAY,gBAAgB;IAE1B,0CAAsB,CAAA;IAEtB,2CAAuB,CAAA;IAEvB,6CAAyB,CAAA;AAC3B,CAAC,EAPW,gBAAgB,gCAAhB,gBAAgB,QAO3B;AAGD,IAAY,eAGX;AAHD,WAAY,eAAe;IACzB,6DAA0C,CAAA;IAC1C,iEAA8C,CAAA;AAChD,CAAC,EAHW,eAAe,+BAAf,eAAe,QAG1B;AAGD,MAAa,wBAAyB,SAAQ,sBAAa;IACzD,YAAmB,KAAa,EAAE,OAAsC;QACtE,KAAK,CACH;YACE,IAAI,EAAE,iBAAiB,CAAC,YAAY;YACpC,OAAO,EAAE,GAAG,iBAAiB,CAAC,YAAY,SAAS,KAAK,oDAAoD;SAC7G,EACD,mBAAU,CAAC,QAAQ,EACnB,OAAO,CACR,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAZD,4DAYC;AASD,MAAa,0BAA2B,SAAQ,KAAK;IAIjC;IAHF,IAAI,GAAG,eAAe,CAAC,aAAa,CAAC;IAErD,YACkB,OAAe,EAC/B,OAAsC;QAEtC,KAAK,CACH,GAAG,eAAe,CAAC,aAAa,yCAAyC,OAAO,sDAAsD,EACtI,OAAO,CACR,CAAC;QANc,YAAO,GAAP,OAAO,CAAQ;QAO/B,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAbD,gEAaC;AAGD,MAAa,4BAA6B,SAAQ,KAAK;IAInC;IAHF,IAAI,GAAG,eAAe,CAAC,eAAe,CAAC;IAEvD,YACkB,KAAa,EAC7B,OAAsC;QAEtC,KAAK,CACH,GAAG,eAAe,CAAC,eAAe,kBAAkB,KAAK,kGAAkG,EAC3J,OAAO,CACR,CAAC;QANc,UAAK,GAAL,KAAK,CAAQ;QAO7B,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF;AAbD,oEAaC"}
@@ -0,0 +1,10 @@
1
+ import { type OrgWriteFenceTable } from './org-write-fence-triggers';
2
+ import { type OperatorMigrationDatabase } from '../ledger-rows';
3
+ import type { SdkOwnedMigrationSet } from '../sdk-owned-migration-set';
4
+ export declare const ORG_WRITE_FENCE_DECLARATION_ID = "sdk-org-quiesce-write-fence-triggers";
5
+ export declare class OrgWriteFenceFunctionsMissingError extends Error {
6
+ readonly code = "ORG_WRITE_FENCE_FUNCTIONS_MISSING";
7
+ constructor();
8
+ }
9
+ export declare function applyOrgWriteFenceTriggers(database: OperatorMigrationDatabase, tables: ReadonlyArray<OrgWriteFenceTable>, sets: readonly SdkOwnedMigrationSet[]): Promise<void>;
10
+ //# sourceMappingURL=org-write-fence-apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-write-fence-apply.d.ts","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-write-fence-apply.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,kBAAkB,EAExB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAKL,KAAK,yBAAyB,EAC/B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AASvE,eAAO,MAAM,8BAA8B,yCAAyC,CAAC;AAGrF,qBAAa,kCAAmC,SAAQ,KAAK;IAC3D,SAAgB,IAAI,uCAAuC;;CAS5D;AAoBD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,yBAAyB,EACnC,MAAM,EAAE,aAAa,CAAC,kBAAkB,CAAC,EACzC,IAAI,EAAE,SAAS,oBAAoB,EAAE,GACpC,OAAO,CAAC,IAAI,CAAC,CAuDf"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OrgWriteFenceFunctionsMissingError = exports.ORG_WRITE_FENCE_DECLARATION_ID = void 0;
4
+ exports.applyOrgWriteFenceTriggers = applyOrgWriteFenceTriggers;
5
+ const org_quiesce_marks_migrations_1 = require("./org-quiesce-marks.migrations");
6
+ const org_write_fence_triggers_1 = require("./org-write-fence-triggers");
7
+ const ledger_rows_1 = require("../ledger-rows");
8
+ const operator_migration_1 = require("../operator-migration");
9
+ exports.ORG_WRITE_FENCE_DECLARATION_ID = 'sdk-org-quiesce-write-fence-triggers';
10
+ class OrgWriteFenceFunctionsMissingError extends Error {
11
+ code = 'ORG_WRITE_FENCE_FUNCTIONS_MISSING';
12
+ constructor() {
13
+ super('[biome-database] ORG_WRITE_FENCE_FUNCTIONS_MISSING: orgWriteFenceTables are declared, but the "org-quiesce" SDK-owned migrations ' +
14
+ '(which create xema_org_write_fence_trigger) are not in this migration phase. Import OrgQuiesceMarksModule.');
15
+ this.name = 'OrgWriteFenceFunctionsMissingError';
16
+ }
17
+ }
18
+ exports.OrgWriteFenceFunctionsMissingError = OrgWriteFenceFunctionsMissingError;
19
+ const quoted = (identifier) => `"${identifier.replaceAll('"', '""')}"`;
20
+ async function applyOrgWriteFenceTriggers(database, tables, sets) {
21
+ const createSql = (0, org_write_fence_triggers_1.orgWriteFenceTriggerSql)(tables);
22
+ if (!sets.some((set) => set.owner === org_quiesce_marks_migrations_1.ORG_QUIESCE_OWNER)) {
23
+ if (tables.length > 0) {
24
+ throw new OrgWriteFenceFunctionsMissingError();
25
+ }
26
+ return;
27
+ }
28
+ const declarationSha256 = (0, ledger_rows_1.sha256)(createSql);
29
+ await (0, operator_migration_1.inMigrationTransaction)(database, exports.ORG_WRITE_FENCE_DECLARATION_ID, async (tx) => {
30
+ const recorded = await (0, ledger_rows_1.readPhase)(tx, exports.ORG_WRITE_FENCE_DECLARATION_ID, ledger_rows_1.OperatorMigrationPhase.Applied);
31
+ const { rows } = await tx.query(org_write_fence_triggers_1.ORG_WRITE_FENCE_TRIGGER_ROWS_SQL);
32
+ const stale = (0, org_write_fence_triggers_1.orgWriteFenceStaleRows)(rows, tables);
33
+ if (recorded === null && tables.length === 0 && stale.length === 0) {
34
+ return;
35
+ }
36
+ if (recorded === declarationSha256 &&
37
+ stale.length === 0 &&
38
+ (0, org_write_fence_triggers_1.orgWriteFenceProblems)(rows, tables).length === 0) {
39
+ return;
40
+ }
41
+ for (const row of stale) {
42
+ await tx.query(`DROP TRIGGER ${quoted(row.name)} ON ${quoted(row.table_name)}`);
43
+ }
44
+ for (const entry of tables) {
45
+ for (const name of org_write_fence_triggers_1.ORG_WRITE_FENCE_TRIGGER_NAMES) {
46
+ await tx.query(`DROP TRIGGER IF EXISTS ${quoted(name)} ON ${quoted(entry.table)}`);
47
+ }
48
+ }
49
+ if (createSql !== '') {
50
+ await tx.query(createSql);
51
+ }
52
+ await (0, ledger_rows_1.replacePhase)(tx, exports.ORG_WRITE_FENCE_DECLARATION_ID, ledger_rows_1.OperatorMigrationPhase.Applied, declarationSha256);
53
+ });
54
+ }
55
+ //# sourceMappingURL=org-write-fence-apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-write-fence-apply.js","sourceRoot":"","sources":["../../../src/lib/org-quiesce/org-write-fence-apply.ts"],"names":[],"mappings":";;;AA6DA,gEA2DC;AAxHD,iFAAmE;AACnE,yEAQoC;AACpC,gDAMwB;AACxB,8DAA+D;AAWlD,QAAA,8BAA8B,GAAG,sCAAsC,CAAC;AAGrF,MAAa,kCAAmC,SAAQ,KAAK;IAC3C,IAAI,GAAG,mCAAmC,CAAC;IAE3D;QACE,KAAK,CACH,mIAAmI;YACjI,4GAA4G,CAC/G,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oCAAoC,CAAC;IACnD,CAAC;CACF;AAVD,gFAUC;AAED,MAAM,MAAM,GAAG,CAAC,UAAkB,EAAU,EAAE,CAC5C,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;AAiBnC,KAAK,UAAU,0BAA0B,CAC9C,QAAmC,EACnC,MAAyC,EACzC,IAAqC;IAErC,MAAM,SAAS,GAAG,IAAA,kDAAuB,EAAC,MAAM,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,gDAAiB,CAAC,EAAE,CAAC;QACzD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,kCAAkC,EAAE,CAAC;QACjD,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,iBAAiB,GAAG,IAAA,oBAAM,EAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAA,2CAAsB,EAC5B,QAAQ,EACR,sCAA8B,EAC9B,KAAK,EAAE,EAAE,EAAE,EAAE;QACX,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAS,EAC9B,EAAE,EACF,sCAA8B,EAC9B,oCAAsB,CAAC,OAAO,CAC/B,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,KAAK,CAC7B,2DAAgC,CACjC,CAAC;QACF,MAAM,KAAK,GAAG,IAAA,iDAAsB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnE,OAAO;QACT,CAAC;QACD,IACE,QAAQ,KAAK,iBAAiB;YAC9B,KAAK,CAAC,MAAM,KAAK,CAAC;YAClB,IAAA,gDAAqB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAChD,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,EAAE,CAAC,KAAK,CACZ,gBAAgB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAChE,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,wDAA6B,EAAE,CAAC;gBACjD,MAAM,EAAE,CAAC,KAAK,CACZ,0BAA0B,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CACnE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACrB,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,IAAA,0BAAY,EAChB,EAAE,EACF,sCAA8B,EAC9B,oCAAsB,CAAC,OAAO,EAC9B,iBAAiB,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}