@openhi/constructs 0.0.111 → 0.0.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/chunk-23PUSHBV.mjs +24 -0
- package/lib/chunk-23PUSHBV.mjs.map +1 -0
- package/lib/{chunk-7FUAMZOF.mjs → chunk-53OHXLIL.mjs} +3 -3
- package/lib/chunk-6NBGYGFL.mjs +1803 -0
- package/lib/chunk-6NBGYGFL.mjs.map +1 -0
- package/lib/chunk-7RZHFI77.mjs +22 -0
- package/lib/chunk-7RZHFI77.mjs.map +1 -0
- package/lib/{chunk-7Q2IJ2J5.mjs → chunk-CUUKXDB2.mjs} +6 -6
- package/lib/chunk-FYHBHHWK.mjs +47 -0
- package/lib/chunk-FYHBHHWK.mjs.map +1 -0
- package/lib/{chunk-MULKGFIJ.mjs → chunk-GBDIGTNV.mjs} +165 -10
- package/lib/chunk-GBDIGTNV.mjs.map +1 -0
- package/lib/chunk-HQ67J7BP.mjs +199 -0
- package/lib/chunk-HQ67J7BP.mjs.map +1 -0
- package/lib/{chunk-AJ3G3THO.mjs → chunk-KO64HPWQ.mjs} +2 -2
- package/lib/{chunk-BB5MK4L3.mjs → chunk-KSFC72TT.mjs} +3 -3
- package/lib/{chunk-2TPJ6HOF.mjs → chunk-NZRW7ROK.mjs} +72 -54
- package/lib/chunk-NZRW7ROK.mjs.map +1 -0
- package/lib/chunk-QJDHVMKT.mjs +117 -0
- package/lib/chunk-QJDHVMKT.mjs.map +1 -0
- package/lib/{chunk-IS4VQRI4.mjs → chunk-QMBJ4VHC.mjs} +12 -47
- package/lib/chunk-QMBJ4VHC.mjs.map +1 -0
- package/lib/chunk-TRY7JGWO.mjs +16 -0
- package/lib/chunk-TRY7JGWO.mjs.map +1 -0
- package/lib/chunk-W4KR4CSL.mjs +236 -0
- package/lib/chunk-W4KR4CSL.mjs.map +1 -0
- package/lib/{chunk-AGF3RAAZ.mjs → chunk-WPCBVDFZ.mjs} +2 -2
- package/lib/chunk-WQWFVEVX.mjs +66 -0
- package/lib/chunk-WQWFVEVX.mjs.map +1 -0
- package/lib/{chunk-SYBADQXI.mjs → chunk-ZM4GDHHC.mjs} +77 -2
- package/lib/chunk-ZM4GDHHC.mjs.map +1 -0
- package/lib/delete-chunk.handler.d.mts +29 -0
- package/lib/delete-chunk.handler.d.ts +29 -0
- package/lib/delete-chunk.handler.js +2716 -0
- package/lib/delete-chunk.handler.js.map +1 -0
- package/lib/delete-chunk.handler.mjs +47 -0
- package/lib/delete-chunk.handler.mjs.map +1 -0
- package/lib/events-CjS-sm0W.d.mts +107 -0
- package/lib/events-CjS-sm0W.d.ts +107 -0
- package/lib/events-Da_cFgtc.d.mts +208 -0
- package/lib/events-Da_cFgtc.d.ts +208 -0
- package/lib/finalize.handler.d.mts +35 -0
- package/lib/finalize.handler.d.ts +35 -0
- package/lib/finalize.handler.js +875 -0
- package/lib/finalize.handler.js.map +1 -0
- package/lib/finalize.handler.mjs +166 -0
- package/lib/finalize.handler.mjs.map +1 -0
- package/lib/index.d.mts +189 -2
- package/lib/index.d.ts +500 -3
- package/lib/index.js +1753 -174
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +571 -17
- package/lib/index.mjs.map +1 -1
- package/lib/list-chunks.handler.d.mts +28 -0
- package/lib/list-chunks.handler.d.ts +28 -0
- package/lib/list-chunks.handler.js +2746 -0
- package/lib/list-chunks.handler.js.map +1 -0
- package/lib/list-chunks.handler.mjs +54 -0
- package/lib/list-chunks.handler.mjs.map +1 -0
- package/lib/platform-deploy-bridge.handler.js +76 -1
- package/lib/platform-deploy-bridge.handler.js.map +1 -1
- package/lib/platform-deploy-bridge.handler.mjs +1 -1
- package/lib/pre-token-generation.handler.js +1106 -155
- package/lib/pre-token-generation.handler.js.map +1 -1
- package/lib/pre-token-generation.handler.mjs +6 -4
- package/lib/pre-token-generation.handler.mjs.map +1 -1
- package/lib/provision-default-workspace.handler.js +1529 -142
- package/lib/provision-default-workspace.handler.js.map +1 -1
- package/lib/provision-default-workspace.handler.mjs +8 -4
- package/lib/provision-default-workspace.handler.mjs.map +1 -1
- package/lib/rename-finalize.handler.d.mts +30 -0
- package/lib/rename-finalize.handler.d.ts +30 -0
- package/lib/rename-finalize.handler.js +795 -0
- package/lib/rename-finalize.handler.js.map +1 -0
- package/lib/rename-finalize.handler.mjs +90 -0
- package/lib/rename-finalize.handler.mjs.map +1 -0
- package/lib/rename-list-targets.handler.d.mts +26 -0
- package/lib/rename-list-targets.handler.d.ts +26 -0
- package/lib/rename-list-targets.handler.js +2985 -0
- package/lib/rename-list-targets.handler.js.map +1 -0
- package/lib/rename-list-targets.handler.mjs +431 -0
- package/lib/rename-list-targets.handler.mjs.map +1 -0
- package/lib/rename-rewrite-chunk.handler.d.mts +35 -0
- package/lib/rename-rewrite-chunk.handler.d.ts +35 -0
- package/lib/rename-rewrite-chunk.handler.js +2021 -0
- package/lib/rename-rewrite-chunk.handler.js.map +1 -0
- package/lib/rename-rewrite-chunk.handler.mjs +27 -0
- package/lib/rename-rewrite-chunk.handler.mjs.map +1 -0
- package/lib/rest-api-lambda.handler.js +4021 -932
- package/lib/rest-api-lambda.handler.js.map +1 -1
- package/lib/rest-api-lambda.handler.mjs +1786 -80
- package/lib/rest-api-lambda.handler.mjs.map +1 -1
- package/lib/seed-demo-data.handler.js +1588 -124
- package/lib/seed-demo-data.handler.js.map +1 -1
- package/lib/seed-demo-data.handler.mjs +10 -6
- package/lib/seed-system-data.handler.js +1179 -155
- package/lib/seed-system-data.handler.js.map +1 -1
- package/lib/seed-system-data.handler.mjs +5 -4
- package/lib/seed-system-data.handler.mjs.map +1 -1
- package/package.json +3 -3
- package/lib/chunk-2TPJ6HOF.mjs.map +0 -1
- package/lib/chunk-IS4VQRI4.mjs.map +0 -1
- package/lib/chunk-MULKGFIJ.mjs.map +0 -1
- package/lib/chunk-QR5JVSCF.mjs +0 -862
- package/lib/chunk-QR5JVSCF.mjs.map +0 -1
- package/lib/chunk-SYBADQXI.mjs.map +0 -1
- /package/lib/{chunk-7FUAMZOF.mjs.map → chunk-53OHXLIL.mjs.map} +0 -0
- /package/lib/{chunk-7Q2IJ2J5.mjs.map → chunk-CUUKXDB2.mjs.map} +0 -0
- /package/lib/{chunk-AJ3G3THO.mjs.map → chunk-KO64HPWQ.mjs.map} +0 -0
- /package/lib/{chunk-BB5MK4L3.mjs.map → chunk-KSFC72TT.mjs.map} +0 -0
- /package/lib/{chunk-AGF3RAAZ.mjs.map → chunk-WPCBVDFZ.mjs.map} +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// src/data/dynamo/dynamo-client.ts
|
|
2
|
+
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
|
|
3
|
+
var defaultTableName = process.env.DYNAMO_TABLE_NAME ?? "jesttesttable";
|
|
4
|
+
var dynamoClient = new DynamoDBClient({
|
|
5
|
+
...process.env.MOCK_DYNAMODB_ENDPOINT && {
|
|
6
|
+
endpoint: process.env.MOCK_DYNAMODB_ENDPOINT,
|
|
7
|
+
sslEnabled: false,
|
|
8
|
+
region: "local"
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
defaultTableName,
|
|
14
|
+
dynamoClient
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=chunk-TRY7JGWO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data/dynamo/dynamo-client.ts"],"sourcesContent":["import { DynamoDBClient } from \"@aws-sdk/client-dynamodb\";\n\n/**\n * DynamoDB table name for the data store. Set via DYNAMO_TABLE_NAME at runtime\n * (e.g. from Lambda env); defaults for local/test.\n */\nexport const defaultTableName =\n process.env.DYNAMO_TABLE_NAME ?? \"jesttesttable\";\n\n/**\n * DynamoDB client. When MOCK_DYNAMODB_ENDPOINT is set (e.g. local DynamoDB or\n * jest-dynalite), uses that endpoint with no SSL and region \"local\".\n */\nexport const dynamoClient = new DynamoDBClient({\n ...(process.env.MOCK_DYNAMODB_ENDPOINT && {\n endpoint: process.env.MOCK_DYNAMODB_ENDPOINT,\n sslEnabled: false,\n region: \"local\",\n }),\n});\n"],"mappings":";AAAA,SAAS,sBAAsB;AAMxB,IAAM,mBACX,QAAQ,IAAI,qBAAqB;AAM5B,IAAM,eAAe,IAAI,eAAe;AAAA,EAC7C,GAAI,QAAQ,IAAI,0BAA0B;AAAA,IACxC,UAAU,QAAQ,IAAI;AAAA,IACtB,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import {
|
|
2
|
+
require_lib
|
|
3
|
+
} from "./chunk-ZM4GDHHC.mjs";
|
|
4
|
+
import {
|
|
5
|
+
TRANSACT_WRITE_ITEM_LIMIT,
|
|
6
|
+
executeMultiWrite
|
|
7
|
+
} from "./chunk-QJDHVMKT.mjs";
|
|
8
|
+
import {
|
|
9
|
+
getDynamoControlService
|
|
10
|
+
} from "./chunk-6NBGYGFL.mjs";
|
|
11
|
+
import {
|
|
12
|
+
__toESM
|
|
13
|
+
} from "./chunk-LZOMFHX3.mjs";
|
|
14
|
+
|
|
15
|
+
// src/data/operations/control/owning-delete/owning-delete-batch-delete-operation.ts
|
|
16
|
+
var OWNING_DELETE_CASCADE_CHUNK_SIZE = TRANSACT_WRITE_ITEM_LIMIT;
|
|
17
|
+
async function deleteOwningChildChunkOperation(params) {
|
|
18
|
+
const { rows, tableName, token } = params;
|
|
19
|
+
if (rows.length === 0) {
|
|
20
|
+
return { rowsDeleted: 0, breakdown: {} };
|
|
21
|
+
}
|
|
22
|
+
if (rows.length > OWNING_DELETE_CASCADE_CHUNK_SIZE) {
|
|
23
|
+
throw new Error(
|
|
24
|
+
`deleteOwningChildChunkOperation: chunk has ${rows.length} rows; limit is ${OWNING_DELETE_CASCADE_CHUNK_SIZE}`
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
const service = getDynamoControlService(tableName);
|
|
28
|
+
const triples = rows.map((row) => ({
|
|
29
|
+
entity: row.entity,
|
|
30
|
+
action: "delete",
|
|
31
|
+
item: { ...row.key }
|
|
32
|
+
}));
|
|
33
|
+
await executeMultiWrite({ service, triples, token });
|
|
34
|
+
const breakdown = {};
|
|
35
|
+
for (const row of rows) {
|
|
36
|
+
breakdown[row.entity] = (breakdown[row.entity] ?? 0) + 1;
|
|
37
|
+
}
|
|
38
|
+
return { rowsDeleted: rows.length, breakdown };
|
|
39
|
+
}
|
|
40
|
+
function chunkOwningChildRows(rows) {
|
|
41
|
+
const chunks = [];
|
|
42
|
+
for (let i = 0; i < rows.length; i += OWNING_DELETE_CASCADE_CHUNK_SIZE) {
|
|
43
|
+
chunks.push(rows.slice(i, i + OWNING_DELETE_CASCADE_CHUNK_SIZE));
|
|
44
|
+
}
|
|
45
|
+
return chunks;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/data/operations/control/owning-delete/owning-delete-list-child-projections-operation.ts
|
|
49
|
+
var import_workflows = __toESM(require_lib());
|
|
50
|
+
var OWNING_DELETE_PROJECTION_ENTITY = {
|
|
51
|
+
MembershipUserProjection: "membershipUserProjection",
|
|
52
|
+
MembershipWorkspaceProjection: "membershipWorkspaceProjection",
|
|
53
|
+
RoleAssignmentUserProjection: "roleAssignmentUserProjection",
|
|
54
|
+
RoleAssignmentWorkspaceProjection: "roleAssignmentWorkspaceProjection",
|
|
55
|
+
ConfigurationUserProjection: "configurationUserProjection",
|
|
56
|
+
ConfigurationWorkspaceProjection: "configurationWorkspaceProjection"
|
|
57
|
+
};
|
|
58
|
+
var DEFAULT_PAGE_SIZE = 100;
|
|
59
|
+
var ENTITY_SK_PREFIXES = {
|
|
60
|
+
membershipUserProjection: "MEMBERSHIP#",
|
|
61
|
+
membershipWorkspaceProjection: "MEMBERSHIP#",
|
|
62
|
+
roleAssignmentUserProjection: "ROLEASSIGNMENT#",
|
|
63
|
+
roleAssignmentWorkspaceProjection: "ROLEASSIGNMENT#",
|
|
64
|
+
configurationUserProjection: "CONFIGURATION#",
|
|
65
|
+
configurationWorkspaceProjection: "CONFIGURATION#"
|
|
66
|
+
};
|
|
67
|
+
var ENTITIES_FOR_OWNER = {
|
|
68
|
+
Workspace: [
|
|
69
|
+
"membershipWorkspaceProjection",
|
|
70
|
+
"roleAssignmentWorkspaceProjection",
|
|
71
|
+
"configurationWorkspaceProjection"
|
|
72
|
+
],
|
|
73
|
+
User: [
|
|
74
|
+
"membershipUserProjection",
|
|
75
|
+
"roleAssignmentUserProjection",
|
|
76
|
+
"configurationUserProjection"
|
|
77
|
+
]
|
|
78
|
+
};
|
|
79
|
+
async function listOwningChildProjectionsOperation(params) {
|
|
80
|
+
const {
|
|
81
|
+
ownerType,
|
|
82
|
+
ownerId,
|
|
83
|
+
tenantId,
|
|
84
|
+
cursors = {},
|
|
85
|
+
limit = DEFAULT_PAGE_SIZE,
|
|
86
|
+
tableName
|
|
87
|
+
} = params;
|
|
88
|
+
if (!ownerId || ownerId.length === 0) {
|
|
89
|
+
throw new Error("listOwningChildProjectionsOperation: ownerId is required");
|
|
90
|
+
}
|
|
91
|
+
if (ownerType === import_workflows.OWNING_ENTITY_TYPE.Workspace && (!tenantId || tenantId.length === 0)) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
"listOwningChildProjectionsOperation: tenantId is required for Workspace owners"
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
const service = getDynamoControlService(tableName);
|
|
97
|
+
const entities = ENTITIES_FOR_OWNER[ownerType];
|
|
98
|
+
const nextCursors = {};
|
|
99
|
+
const items = [];
|
|
100
|
+
for (const entityName of entities) {
|
|
101
|
+
const priorCursor = cursors[entityName];
|
|
102
|
+
if (priorCursor === null) {
|
|
103
|
+
nextCursors[entityName] = null;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const prefix = ENTITY_SK_PREFIXES[entityName];
|
|
107
|
+
const page = await queryProjectionEntity({
|
|
108
|
+
service,
|
|
109
|
+
entityName,
|
|
110
|
+
ownerType,
|
|
111
|
+
ownerId,
|
|
112
|
+
tenantId,
|
|
113
|
+
prefix,
|
|
114
|
+
cursor: priorCursor ?? null,
|
|
115
|
+
limit
|
|
116
|
+
});
|
|
117
|
+
for (const row of page.items) {
|
|
118
|
+
items.push(row);
|
|
119
|
+
}
|
|
120
|
+
nextCursors[entityName] = page.cursor;
|
|
121
|
+
}
|
|
122
|
+
const exhausted = Object.values(nextCursors).every((value) => value === null);
|
|
123
|
+
return { items, cursors: nextCursors, exhausted };
|
|
124
|
+
}
|
|
125
|
+
async function queryProjectionEntity(params) {
|
|
126
|
+
const {
|
|
127
|
+
service,
|
|
128
|
+
entityName,
|
|
129
|
+
ownerType,
|
|
130
|
+
ownerId,
|
|
131
|
+
tenantId,
|
|
132
|
+
prefix,
|
|
133
|
+
cursor,
|
|
134
|
+
limit
|
|
135
|
+
} = params;
|
|
136
|
+
const goOptions = { cursor, limit };
|
|
137
|
+
switch (entityName) {
|
|
138
|
+
case "membershipUserProjection": {
|
|
139
|
+
const result = await service.entities.membershipUserProjection.query.record({ userId: ownerId }).begins({ sk: prefix }).go(goOptions);
|
|
140
|
+
const items = (result.data ?? []).map(
|
|
141
|
+
(row) => ({
|
|
142
|
+
entity: entityName,
|
|
143
|
+
key: { userId: row.userId, sk: row.sk }
|
|
144
|
+
})
|
|
145
|
+
);
|
|
146
|
+
return { items, cursor: result.cursor ?? null };
|
|
147
|
+
}
|
|
148
|
+
case "membershipWorkspaceProjection": {
|
|
149
|
+
if (ownerType !== import_workflows.OWNING_ENTITY_TYPE.Workspace || !tenantId) {
|
|
150
|
+
return { items: [], cursor: null };
|
|
151
|
+
}
|
|
152
|
+
const result = await service.entities.membershipWorkspaceProjection.query.record({ tenantId, workspaceId: ownerId }).begins({ sk: prefix }).go(goOptions);
|
|
153
|
+
const items = (result.data ?? []).map(
|
|
154
|
+
(row) => ({
|
|
155
|
+
entity: entityName,
|
|
156
|
+
key: {
|
|
157
|
+
tenantId: row.tenantId,
|
|
158
|
+
workspaceId: row.workspaceId,
|
|
159
|
+
sk: row.sk
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
);
|
|
163
|
+
return { items, cursor: result.cursor ?? null };
|
|
164
|
+
}
|
|
165
|
+
case "roleAssignmentUserProjection": {
|
|
166
|
+
const result = await service.entities.roleAssignmentUserProjection.query.record({ userId: ownerId }).begins({ sk: prefix }).go(goOptions);
|
|
167
|
+
const items = (result.data ?? []).map(
|
|
168
|
+
(row) => ({
|
|
169
|
+
entity: entityName,
|
|
170
|
+
key: { userId: row.userId, sk: row.sk }
|
|
171
|
+
})
|
|
172
|
+
);
|
|
173
|
+
return { items, cursor: result.cursor ?? null };
|
|
174
|
+
}
|
|
175
|
+
case "roleAssignmentWorkspaceProjection": {
|
|
176
|
+
if (ownerType !== import_workflows.OWNING_ENTITY_TYPE.Workspace || !tenantId) {
|
|
177
|
+
return { items: [], cursor: null };
|
|
178
|
+
}
|
|
179
|
+
const result = await service.entities.roleAssignmentWorkspaceProjection.query.record({ tenantId, workspaceId: ownerId }).begins({ sk: prefix }).go(goOptions);
|
|
180
|
+
const items = (result.data ?? []).map(
|
|
181
|
+
(row) => ({
|
|
182
|
+
entity: entityName,
|
|
183
|
+
key: {
|
|
184
|
+
tenantId: row.tenantId,
|
|
185
|
+
workspaceId: row.workspaceId,
|
|
186
|
+
sk: row.sk
|
|
187
|
+
}
|
|
188
|
+
})
|
|
189
|
+
);
|
|
190
|
+
return { items, cursor: result.cursor ?? null };
|
|
191
|
+
}
|
|
192
|
+
case "configurationUserProjection": {
|
|
193
|
+
const result = await service.entities.configurationUserProjection.query.record({ userId: ownerId }).begins({ sk: prefix }).go(goOptions);
|
|
194
|
+
const items = (result.data ?? []).map(
|
|
195
|
+
(row) => ({
|
|
196
|
+
entity: entityName,
|
|
197
|
+
key: { userId: row.userId, sk: row.sk }
|
|
198
|
+
})
|
|
199
|
+
);
|
|
200
|
+
return { items, cursor: result.cursor ?? null };
|
|
201
|
+
}
|
|
202
|
+
case "configurationWorkspaceProjection": {
|
|
203
|
+
if (ownerType !== import_workflows.OWNING_ENTITY_TYPE.Workspace || !tenantId) {
|
|
204
|
+
return { items: [], cursor: null };
|
|
205
|
+
}
|
|
206
|
+
const result = await service.entities.configurationWorkspaceProjection.query.record({ tenantId, workspaceId: ownerId }).begins({ sk: prefix }).go(goOptions);
|
|
207
|
+
const items = (result.data ?? []).map(
|
|
208
|
+
(row) => ({
|
|
209
|
+
entity: entityName,
|
|
210
|
+
key: {
|
|
211
|
+
tenantId: row.tenantId,
|
|
212
|
+
workspaceId: row.workspaceId,
|
|
213
|
+
sk: row.sk
|
|
214
|
+
}
|
|
215
|
+
})
|
|
216
|
+
);
|
|
217
|
+
return { items, cursor: result.cursor ?? null };
|
|
218
|
+
}
|
|
219
|
+
default: {
|
|
220
|
+
const exhaustive = entityName;
|
|
221
|
+
throw new Error(
|
|
222
|
+
`listOwningChildProjectionsOperation: unsupported entity '${String(
|
|
223
|
+
exhaustive
|
|
224
|
+
)}'`
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export {
|
|
231
|
+
deleteOwningChildChunkOperation,
|
|
232
|
+
chunkOwningChildRows,
|
|
233
|
+
OWNING_DELETE_PROJECTION_ENTITY,
|
|
234
|
+
listOwningChildProjectionsOperation
|
|
235
|
+
};
|
|
236
|
+
//# sourceMappingURL=chunk-W4KR4CSL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data/operations/control/owning-delete/owning-delete-batch-delete-operation.ts","../src/data/operations/control/owning-delete/owning-delete-list-child-projections-operation.ts"],"sourcesContent":["/**\n * Atomic chunk delete for the TR-022 hard-delete cascade.\n *\n * Each cascade Map iteration receives up to\n * {@link OWNING_DELETE_CASCADE_CHUNK_SIZE} projection rows tagged with\n * their projection entity and submits them all in a single\n * `TransactWriteItems` via the operations-layer multi-write helper\n * (#1010). All-or-nothing semantics: every row in the chunk lands or\n * none does.\n *\n * Idempotency: per TR-022 Choice 5A, replayed chunks fail the\n * `attribute_exists(PK)` condition (or are absorbed by the helper's\n * cancellation handling) and the state-machine `Catch` treats\n * `TransactionCanceledException` as a no-op success. The outer loop\n * keeps walking the partition until `Query` returns zero items.\n *\n * @see .state/adr-018-implementation-guide.md section 4 (Step Functions Map shape)\n * @see ../multi-write-operation.ts (executeMultiWrite)\n * @see .claude/rules/data-layer-layout.md\n */\n\nimport {\n type OwningChildProjectionRow,\n type OwningDeleteProjectionEntity,\n} from \"./owning-delete-list-child-projections-operation\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport {\n TRANSACT_WRITE_ITEM_LIMIT,\n executeMultiWrite,\n type MultiWriteTriple,\n} from \"../multi-write-operation\";\n\n/**\n * Maximum rows the cascade may submit in a single chunk. Mirrors the\n * AWS `TransactWriteItems` 100-item ceiling enforced by\n * {@link executeMultiWrite}.\n */\nexport const OWNING_DELETE_CASCADE_CHUNK_SIZE = TRANSACT_WRITE_ITEM_LIMIT;\n\n/** Inputs accepted by {@link deleteOwningChildChunkOperation}. */\nexport interface DeleteOwningChildChunkParams {\n /** Rows to delete in this transaction. Length must be 1..100. */\n readonly rows: ReadonlyArray<OwningChildProjectionRow>;\n /** Optional table-name override; resolved via env when omitted. */\n readonly tableName?: string;\n /** Optional idempotency token forwarded to ElectroDB. */\n readonly token?: string;\n}\n\n/** Result of {@link deleteOwningChildChunkOperation}. */\nexport interface DeleteOwningChildChunkResult {\n /** Number of rows committed to the transaction. */\n readonly rowsDeleted: number;\n /**\n * Per-entity breakdown of the rows deleted, for observability and\n * tests. Keyed by the projection-entity name.\n */\n readonly breakdown: Partial<Record<OwningDeleteProjectionEntity, number>>;\n}\n\n/**\n * Submit `rows` as a single `TransactWriteItems` via `executeMultiWrite`.\n *\n * Empty input is a no-op (returns `rowsDeleted: 0`) so the cascade\n * state machine never needs to pre-flight the chunk size — the Map\n * iteration body can call this operation unconditionally.\n */\nexport async function deleteOwningChildChunkOperation(\n params: DeleteOwningChildChunkParams,\n): Promise<DeleteOwningChildChunkResult> {\n const { rows, tableName, token } = params;\n\n if (rows.length === 0) {\n return { rowsDeleted: 0, breakdown: {} };\n }\n if (rows.length > OWNING_DELETE_CASCADE_CHUNK_SIZE) {\n throw new Error(\n `deleteOwningChildChunkOperation: chunk has ${rows.length} rows; limit is ${OWNING_DELETE_CASCADE_CHUNK_SIZE}`,\n );\n }\n\n const service = getDynamoControlService(tableName);\n\n const triples: Array<MultiWriteTriple> = rows.map((row) => ({\n entity: row.entity,\n action: \"delete\",\n item: { ...row.key },\n }));\n\n await executeMultiWrite({ service, triples, token });\n\n const breakdown: Partial<Record<OwningDeleteProjectionEntity, number>> = {};\n for (const row of rows) {\n breakdown[row.entity] = (breakdown[row.entity] ?? 0) + 1;\n }\n\n return { rowsDeleted: rows.length, breakdown };\n}\n\n/**\n * Split a flat row array into chunks of at most\n * {@link OWNING_DELETE_CASCADE_CHUNK_SIZE} items. Used by the cascade\n * state machine Pass state that prepares the Map's `ItemsPath` array.\n */\nexport function chunkOwningChildRows(\n rows: ReadonlyArray<OwningChildProjectionRow>,\n): Array<Array<OwningChildProjectionRow>> {\n const chunks: Array<Array<OwningChildProjectionRow>> = [];\n for (let i = 0; i < rows.length; i += OWNING_DELETE_CASCADE_CHUNK_SIZE) {\n chunks.push(rows.slice(i, i + OWNING_DELETE_CASCADE_CHUNK_SIZE));\n }\n return chunks;\n}\n","/**\n * Enumerate child projection rows under an owning entity's partition\n * for the TR-022 hard-delete cascade.\n *\n * The cascade state machine pages through this operation until it\n * returns zero items, batching each page into <=100-item chunks for the\n * delete step. The operation queries each of the projection entities\n * that key off the owner's partition and returns each row tagged with\n * the entity it came from plus the composite-key payload the\n * operations-layer multi-write helper needs to issue a delete.\n *\n * Owner-type to projection-entity matrix:\n *\n * | Owner | Partition | Entities queried |\n * |---|---|---|\n * | Workspace | `TID#<tenantId>#WORKSPACE#ID#<workspaceId>` | membershipWorkspaceProjection (#2), roleAssignmentWorkspaceProjection (#9), configurationWorkspaceProjection (#10) |\n * | User | `USER#ID#<userId>` | membershipUserProjection (#3, #4), roleAssignmentUserProjection (#5), configurationUserProjection (#10) |\n *\n * The owning canonical record itself (`SK = \"CURRENT\"`) is never\n * returned — the canonical row lives on a different entity (Workspace\n * / User) which is not queried here.\n *\n * Each page reads up to `limit` rows per entity; the operation merges\n * the per-entity responses and surfaces a single `cursor` map keyed by\n * entity name. The state machine outer loop passes this map back on\n * subsequent calls and stops when every per-entity cursor is exhausted.\n *\n * @see .state/adr-018-implementation-guide.md section 4 (Per-batch delete query)\n * @see .claude/rules/data-layer-layout.md (operations live under operations/, not dynamo/)\n */\n\nimport { OWNING_ENTITY_TYPE, type OwningEntityType } from \"@openhi/workflows\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\n\n/**\n * Entity-name keys this operation may emit. Matches the keys exposed\n * by the control-plane service factory; downstream delete callers feed\n * them to `executeMultiWrite` as the `entity` field on each triple.\n */\nexport const OWNING_DELETE_PROJECTION_ENTITY = {\n MembershipUserProjection: \"membershipUserProjection\",\n MembershipWorkspaceProjection: \"membershipWorkspaceProjection\",\n RoleAssignmentUserProjection: \"roleAssignmentUserProjection\",\n RoleAssignmentWorkspaceProjection: \"roleAssignmentWorkspaceProjection\",\n ConfigurationUserProjection: \"configurationUserProjection\",\n ConfigurationWorkspaceProjection: \"configurationWorkspaceProjection\",\n} as const;\nexport type OwningDeleteProjectionEntity =\n (typeof OWNING_DELETE_PROJECTION_ENTITY)[keyof typeof OWNING_DELETE_PROJECTION_ENTITY];\n\n/** Inputs accepted by {@link listOwningChildProjectionsOperation}. */\nexport interface ListOwningChildProjectionsParams {\n /** The type of owning entity whose children the cascade is reaping. */\n readonly ownerType: OwningEntityType;\n /** Canonical id of the owning entity (Workspace id or User id). */\n readonly ownerId: string;\n /** Required for Workspace owners; ignored for User owners. */\n readonly tenantId?: string;\n /**\n * Per-entity cursor map carried forward from a prior page. Each\n * key is one of the {@link OWNING_DELETE_PROJECTION_ENTITY} values;\n * missing keys are treated as \"start from the beginning\". Pass the\n * value `null` to mark a per-entity stream as exhausted.\n */\n readonly cursors?: ListOwningChildProjectionsCursorMap;\n /**\n * Per-entity per-page limit (defaults to 100, matching the cascade\n * chunk size cap). The merged page can exceed this when more than\n * one entity has matching rows; the state machine chunker re-splits\n * the merged page into 100-item batches.\n */\n readonly limit?: number;\n /** Optional table-name override; resolved via env when omitted. */\n readonly tableName?: string;\n}\n\n/**\n * One projection row tagged for delete. Carries the entity name plus\n * the composite-key payload the operations-layer multi-write helper\n * expects on a `delete` triple — never the raw `PK`/`SK` strings, so\n * callers cannot accidentally delete an owning canonical record.\n */\nexport interface OwningChildProjectionRow {\n /** The projection entity this row belongs to. */\n readonly entity: OwningDeleteProjectionEntity;\n /**\n * Composite-key payload for `TransactWriteItems` delete. Shape\n * depends on `entity` — user-partition projections key on\n * `{ userId, sk }`; workspace-partition projections key on\n * `{ tenantId, workspaceId, sk }`.\n */\n readonly key: Record<string, string>;\n}\n\n/**\n * Per-entity cursor map. `null` for a key means the entity stream is\n * exhausted; an `undefined` / missing key means start from the\n * beginning.\n */\nexport type ListOwningChildProjectionsCursorMap = Partial<\n Record<OwningDeleteProjectionEntity, string | null>\n>;\n\n/** Page returned by {@link listOwningChildProjectionsOperation}. */\nexport interface ListOwningChildProjectionsResult {\n /** Projection rows in this page, merged across the per-entity queries. */\n readonly items: ReadonlyArray<OwningChildProjectionRow>;\n /** Per-entity cursors for the next page. */\n readonly cursors: ListOwningChildProjectionsCursorMap;\n /**\n * `true` when every per-entity stream returned no items and every\n * cursor is null — the cascade's outer loop terminates on this flag.\n */\n readonly exhausted: boolean;\n}\n\n/**\n * Build the owning partition key for the cascade query — exported so\n * tests and other operations can recompose the same partition string\n * the projection-entity queries here target via ElectroDB.\n */\nexport function buildOwningPartitionKey(params: {\n readonly ownerType: OwningEntityType;\n readonly ownerId: string;\n readonly tenantId?: string;\n}): string {\n switch (params.ownerType) {\n case OWNING_ENTITY_TYPE.Workspace:\n if (!params.tenantId || params.tenantId.length === 0) {\n throw new Error(\n \"buildOwningPartitionKey: tenantId is required for Workspace owners\",\n );\n }\n return `TID#${params.tenantId}#WORKSPACE#ID#${params.ownerId}`;\n case OWNING_ENTITY_TYPE.User:\n return `USER#ID#${params.ownerId}`;\n default: {\n const exhaustive: never = params.ownerType;\n throw new Error(\n `buildOwningPartitionKey: unsupported ownerType '${String(\n exhaustive,\n )}'`,\n );\n }\n }\n}\n\n/** Default per-entity per-page item limit. */\nconst DEFAULT_PAGE_SIZE = 100 as const;\n\n/** SK-prefix filter for each projection-entity query. */\nconst ENTITY_SK_PREFIXES: Record<OwningDeleteProjectionEntity, string> = {\n membershipUserProjection: \"MEMBERSHIP#\",\n membershipWorkspaceProjection: \"MEMBERSHIP#\",\n roleAssignmentUserProjection: \"ROLEASSIGNMENT#\",\n roleAssignmentWorkspaceProjection: \"ROLEASSIGNMENT#\",\n configurationUserProjection: \"CONFIGURATION#\",\n configurationWorkspaceProjection: \"CONFIGURATION#\",\n};\n\n/**\n * Entity-list per owner-type. Lookups for a Workspace skip user-\n * partition entities and vice versa, so the cascade never reaches\n * across the partition boundary by mistake.\n */\nconst ENTITIES_FOR_OWNER: Record<\n OwningEntityType,\n ReadonlyArray<OwningDeleteProjectionEntity>\n> = {\n Workspace: [\n \"membershipWorkspaceProjection\",\n \"roleAssignmentWorkspaceProjection\",\n \"configurationWorkspaceProjection\",\n ],\n User: [\n \"membershipUserProjection\",\n \"roleAssignmentUserProjection\",\n \"configurationUserProjection\",\n ],\n};\n\n/**\n * Issue one ElectroDB `Query` per applicable projection entity for the\n * owner's partition, return the merged page, and carry per-entity\n * cursors forward. Each entity is queried independently — when one\n * entity is exhausted but others still have rows, the next page reads\n * only the still-open streams. The merged result preserves entity\n * identity on every row so the delete step can issue a typed\n * `TransactWriteItems` via `executeMultiWrite`.\n */\nexport async function listOwningChildProjectionsOperation(\n params: ListOwningChildProjectionsParams,\n): Promise<ListOwningChildProjectionsResult> {\n const {\n ownerType,\n ownerId,\n tenantId,\n cursors = {},\n limit = DEFAULT_PAGE_SIZE,\n tableName,\n } = params;\n\n if (!ownerId || ownerId.length === 0) {\n throw new Error(\"listOwningChildProjectionsOperation: ownerId is required\");\n }\n if (\n ownerType === OWNING_ENTITY_TYPE.Workspace &&\n (!tenantId || tenantId.length === 0)\n ) {\n throw new Error(\n \"listOwningChildProjectionsOperation: tenantId is required for Workspace owners\",\n );\n }\n\n const service = getDynamoControlService(tableName);\n const entities = ENTITIES_FOR_OWNER[ownerType];\n\n const nextCursors: ListOwningChildProjectionsCursorMap = {};\n const items: Array<OwningChildProjectionRow> = [];\n\n for (const entityName of entities) {\n const priorCursor = cursors[entityName];\n if (priorCursor === null) {\n // Exhausted on a previous page — skip without re-querying.\n nextCursors[entityName] = null;\n continue;\n }\n const prefix = ENTITY_SK_PREFIXES[entityName];\n const page = await queryProjectionEntity({\n service,\n entityName,\n ownerType,\n ownerId,\n tenantId,\n prefix,\n cursor: priorCursor ?? null,\n limit,\n });\n for (const row of page.items) {\n items.push(row);\n }\n nextCursors[entityName] = page.cursor;\n }\n\n const exhausted = Object.values(nextCursors).every((value) => value === null);\n\n return { items, cursors: nextCursors, exhausted };\n}\n\ninterface QueryProjectionEntityParams {\n readonly service: ReturnType<typeof getDynamoControlService>;\n readonly entityName: OwningDeleteProjectionEntity;\n readonly ownerType: OwningEntityType;\n readonly ownerId: string;\n readonly tenantId?: string;\n readonly prefix: string;\n readonly cursor: string | null;\n readonly limit: number;\n}\n\ninterface QueryProjectionEntityResult {\n readonly items: ReadonlyArray<OwningChildProjectionRow>;\n readonly cursor: string | null;\n}\n\nasync function queryProjectionEntity(\n params: QueryProjectionEntityParams,\n): Promise<QueryProjectionEntityResult> {\n const {\n service,\n entityName,\n ownerType,\n ownerId,\n tenantId,\n prefix,\n cursor,\n limit,\n } = params;\n\n const goOptions = { cursor, limit };\n\n switch (entityName) {\n case \"membershipUserProjection\": {\n const result = await service.entities.membershipUserProjection.query\n .record({ userId: ownerId })\n .begins({ sk: prefix })\n .go(goOptions);\n const items = (result.data ?? []).map<OwningChildProjectionRow>(\n (row) => ({\n entity: entityName,\n key: { userId: row.userId, sk: row.sk },\n }),\n );\n return { items, cursor: result.cursor ?? null };\n }\n case \"membershipWorkspaceProjection\": {\n if (ownerType !== OWNING_ENTITY_TYPE.Workspace || !tenantId) {\n return { items: [], cursor: null };\n }\n const result = await service.entities.membershipWorkspaceProjection.query\n .record({ tenantId, workspaceId: ownerId })\n .begins({ sk: prefix })\n .go(goOptions);\n const items = (result.data ?? []).map<OwningChildProjectionRow>(\n (row) => ({\n entity: entityName,\n key: {\n tenantId: row.tenantId,\n workspaceId: row.workspaceId,\n sk: row.sk,\n },\n }),\n );\n return { items, cursor: result.cursor ?? null };\n }\n case \"roleAssignmentUserProjection\": {\n const result = await service.entities.roleAssignmentUserProjection.query\n .record({ userId: ownerId })\n .begins({ sk: prefix })\n .go(goOptions);\n const items = (result.data ?? []).map<OwningChildProjectionRow>(\n (row) => ({\n entity: entityName,\n key: { userId: row.userId, sk: row.sk },\n }),\n );\n return { items, cursor: result.cursor ?? null };\n }\n case \"roleAssignmentWorkspaceProjection\": {\n if (ownerType !== OWNING_ENTITY_TYPE.Workspace || !tenantId) {\n return { items: [], cursor: null };\n }\n const result =\n await service.entities.roleAssignmentWorkspaceProjection.query\n .record({ tenantId, workspaceId: ownerId })\n .begins({ sk: prefix })\n .go(goOptions);\n const items = (result.data ?? []).map<OwningChildProjectionRow>(\n (row) => ({\n entity: entityName,\n key: {\n tenantId: row.tenantId,\n workspaceId: row.workspaceId,\n sk: row.sk,\n },\n }),\n );\n return { items, cursor: result.cursor ?? null };\n }\n case \"configurationUserProjection\": {\n const result = await service.entities.configurationUserProjection.query\n .record({ userId: ownerId })\n .begins({ sk: prefix })\n .go(goOptions);\n const items = (result.data ?? []).map<OwningChildProjectionRow>(\n (row) => ({\n entity: entityName,\n key: { userId: row.userId, sk: row.sk },\n }),\n );\n return { items, cursor: result.cursor ?? null };\n }\n case \"configurationWorkspaceProjection\": {\n if (ownerType !== OWNING_ENTITY_TYPE.Workspace || !tenantId) {\n return { items: [], cursor: null };\n }\n const result =\n await service.entities.configurationWorkspaceProjection.query\n .record({ tenantId, workspaceId: ownerId })\n .begins({ sk: prefix })\n .go(goOptions);\n const items = (result.data ?? []).map<OwningChildProjectionRow>(\n (row) => ({\n entity: entityName,\n key: {\n tenantId: row.tenantId,\n workspaceId: row.workspaceId,\n sk: row.sk,\n },\n }),\n );\n return { items, cursor: result.cursor ?? null };\n }\n default: {\n const exhaustive: never = entityName;\n throw new Error(\n `listOwningChildProjectionsOperation: unsupported entity '${String(\n exhaustive,\n )}'`,\n );\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
require_lib
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZM4GDHHC.mjs";
|
|
4
4
|
import {
|
|
5
5
|
__toESM
|
|
6
6
|
} from "./chunk-LZOMFHX3.mjs";
|
|
@@ -17,4 +17,4 @@ export {
|
|
|
17
17
|
SEED_SYSTEM_DATA_ACTOR_SYSTEM,
|
|
18
18
|
SEED_SYSTEM_DATA_CONTROL_BUS_ENV_VAR
|
|
19
19
|
};
|
|
20
|
-
//# sourceMappingURL=chunk-
|
|
20
|
+
//# sourceMappingURL=chunk-WPCBVDFZ.mjs.map
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TRANSACT_WRITE_ITEM_LIMIT,
|
|
3
|
+
executeMultiWrite
|
|
4
|
+
} from "./chunk-QJDHVMKT.mjs";
|
|
5
|
+
import {
|
|
6
|
+
getDynamoControlService
|
|
7
|
+
} from "./chunk-6NBGYGFL.mjs";
|
|
8
|
+
|
|
9
|
+
// src/data/operations/control/rename-cascade/rename-cascade-rewrite-chunk-operation.ts
|
|
10
|
+
var RENAME_CASCADE_MAX_TARGETS_PER_CHUNK = 50;
|
|
11
|
+
async function rewriteRenameCascadeChunkOperation(params) {
|
|
12
|
+
const { targets, tableName, token } = params;
|
|
13
|
+
if (targets.length === 0) {
|
|
14
|
+
return { targetsRewritten: 0, transactItemCount: 0 };
|
|
15
|
+
}
|
|
16
|
+
if (targets.length > RENAME_CASCADE_MAX_TARGETS_PER_CHUNK) {
|
|
17
|
+
throw new Error(
|
|
18
|
+
`rewriteRenameCascadeChunkOperation: chunk has ${targets.length} targets; limit is ${RENAME_CASCADE_MAX_TARGETS_PER_CHUNK}`
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
const triples = [];
|
|
22
|
+
for (const target of targets) {
|
|
23
|
+
if (target.skRewriteRequired) {
|
|
24
|
+
triples.push({
|
|
25
|
+
entity: target.entity,
|
|
26
|
+
action: "delete",
|
|
27
|
+
item: { ...target.oldKey }
|
|
28
|
+
});
|
|
29
|
+
triples.push({
|
|
30
|
+
entity: target.entity,
|
|
31
|
+
action: "put",
|
|
32
|
+
item: { ...target.newItem }
|
|
33
|
+
});
|
|
34
|
+
} else {
|
|
35
|
+
triples.push({
|
|
36
|
+
entity: target.entity,
|
|
37
|
+
action: "put",
|
|
38
|
+
item: { ...target.newItem }
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (triples.length > TRANSACT_WRITE_ITEM_LIMIT) {
|
|
43
|
+
throw new Error(
|
|
44
|
+
`rewriteRenameCascadeChunkOperation: chunk expanded to ${triples.length} transact items; DynamoDB TransactWriteItems is limited to ${TRANSACT_WRITE_ITEM_LIMIT}`
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
const service = getDynamoControlService(tableName);
|
|
48
|
+
await executeMultiWrite({ service, triples, token });
|
|
49
|
+
return {
|
|
50
|
+
targetsRewritten: targets.length,
|
|
51
|
+
transactItemCount: triples.length
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function chunkRenameCascadeTargets(targets) {
|
|
55
|
+
const chunks = [];
|
|
56
|
+
for (let i = 0; i < targets.length; i += RENAME_CASCADE_MAX_TARGETS_PER_CHUNK) {
|
|
57
|
+
chunks.push(targets.slice(i, i + RENAME_CASCADE_MAX_TARGETS_PER_CHUNK));
|
|
58
|
+
}
|
|
59
|
+
return chunks;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export {
|
|
63
|
+
rewriteRenameCascadeChunkOperation,
|
|
64
|
+
chunkRenameCascadeTargets
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=chunk-WQWFVEVX.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data/operations/control/rename-cascade/rename-cascade-rewrite-chunk-operation.ts"],"sourcesContent":["/**\n * Atomic chunk rewrite for the TR-023 rename cascade.\n *\n * Each Distributed Map iteration receives up to {@link\n * RENAME_CASCADE_MAX_TARGETS_PER_CHUNK} rewrite targets and submits them\n * all in a single `TransactWriteItems` via the operations-layer multi-\n * write helper (#1010). All-or-nothing semantics: every row in the\n * chunk lands or none does.\n *\n * Each target maps to either:\n *\n * - **SK rewrite** — `delete oldKey` + `put newItem` pair (2 transact\n * items). The new SK is composed by the\n * {@link listRenameCascadeTargetsOperation} from the renamed name's\n * normalized form, so the cascade ends with every projection row\n * keyed by the new normalized name.\n * - **Attr-only update** — single `put` overwrite at the same key (1\n * transact item). Used when the renamed attribute is not encoded in\n * the SK (e.g. Tenant rename's pattern-#4 user-projection row, Role\n * rename's pattern-#9 workspace-projection row).\n *\n * The 100-item DynamoDB `TransactWriteItems` ceiling enforced by\n * `executeMultiWrite` bounds the chunk; the cascade chunker caps targets\n * at 50 by default so the worst-case (every target is an SK rewrite)\n * still fits.\n *\n * Idempotency: a replayed chunk where every row is already at the new\n * SK fails its `delete oldKey` triple (`attribute_exists` implicit on\n * delete) and the helper throws `ConflictError` — the cascade state\n * machine's `Catch` block absorbs this as a no-op success. Partial\n * replays (some rows at new SK, some still at old) re-run the same\n * delete+put pairs; DynamoDB's all-or-nothing transactions make the\n * partial-write race window impossible.\n *\n * @see .state/adr-018-implementation-guide.md § 5 (Per-item handler)\n * @see ../multi-write-operation.ts (executeMultiWrite)\n * @see .claude/rules/data-layer-layout.md\n */\n\nimport type { RenameCascadeRewriteTarget } from \"./rename-cascade-list-targets-operation\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport {\n TRANSACT_WRITE_ITEM_LIMIT,\n executeMultiWrite,\n type MultiWriteTriple,\n} from \"../multi-write-operation\";\n\n/**\n * Maximum rewrite targets the cascade may submit in a single chunk. An\n * SK-rewrite target produces 2 transact items (delete + put); the\n * default cap of 50 ensures the chunk stays at or below the\n * {@link TRANSACT_WRITE_ITEM_LIMIT} ceiling enforced by\n * `executeMultiWrite` even in the worst case where every target is an\n * SK rewrite.\n */\nexport const RENAME_CASCADE_MAX_TARGETS_PER_CHUNK = 50 as const;\n\n/** Inputs accepted by {@link rewriteRenameCascadeChunkOperation}. */\nexport interface RewriteRenameCascadeChunkParams {\n /** Rewrite targets to commit in this transaction. Length must be 1..50. */\n readonly targets: ReadonlyArray<RenameCascadeRewriteTarget>;\n /** Optional table-name override; resolved via env when omitted. */\n readonly tableName?: string;\n /** Optional idempotency token forwarded to ElectroDB. */\n readonly token?: string;\n}\n\n/** Result of {@link rewriteRenameCascadeChunkOperation}. */\nexport interface RewriteRenameCascadeChunkResult {\n /** Number of rewrite targets committed (NOT the underlying transact item count). */\n readonly targetsRewritten: number;\n /** Number of underlying `TransactWriteItems` entries actually issued. */\n readonly transactItemCount: number;\n}\n\n/**\n * Submit `targets` as a single `TransactWriteItems` via `executeMultiWrite`.\n *\n * Empty input is a no-op (returns zero counts) so the cascade Map\n * iteration can call this unconditionally on every chunk — including\n * the trailing empty chunk that may arise from a partial-replay where\n * the previous run already cleared the page.\n */\nexport async function rewriteRenameCascadeChunkOperation(\n params: RewriteRenameCascadeChunkParams,\n): Promise<RewriteRenameCascadeChunkResult> {\n const { targets, tableName, token } = params;\n\n if (targets.length === 0) {\n return { targetsRewritten: 0, transactItemCount: 0 };\n }\n if (targets.length > RENAME_CASCADE_MAX_TARGETS_PER_CHUNK) {\n throw new Error(\n `rewriteRenameCascadeChunkOperation: chunk has ${targets.length} targets; limit is ${RENAME_CASCADE_MAX_TARGETS_PER_CHUNK}`,\n );\n }\n\n const triples: Array<MultiWriteTriple> = [];\n for (const target of targets) {\n if (target.skRewriteRequired) {\n triples.push({\n entity: target.entity,\n action: \"delete\",\n item: { ...target.oldKey },\n });\n triples.push({\n entity: target.entity,\n action: \"put\",\n item: { ...target.newItem },\n });\n } else {\n // Attr-only update — same key, rewrite the row in place.\n triples.push({\n entity: target.entity,\n action: \"put\",\n item: { ...target.newItem },\n });\n }\n }\n\n if (triples.length > TRANSACT_WRITE_ITEM_LIMIT) {\n throw new Error(\n `rewriteRenameCascadeChunkOperation: chunk expanded to ${triples.length} transact items; DynamoDB TransactWriteItems is limited to ${TRANSACT_WRITE_ITEM_LIMIT}`,\n );\n }\n\n const service = getDynamoControlService(tableName);\n await executeMultiWrite({ service, triples, token });\n\n return {\n targetsRewritten: targets.length,\n transactItemCount: triples.length,\n };\n}\n\n/**\n * Split a flat target array into chunks of at most\n * {@link RENAME_CASCADE_MAX_TARGETS_PER_CHUNK} items. Used by the\n * cascade list-and-chunk handler to prepare the Distributed Map's\n * `ItemsPath` array.\n */\nexport function chunkRenameCascadeTargets(\n targets: ReadonlyArray<RenameCascadeRewriteTarget>,\n): Array<Array<RenameCascadeRewriteTarget>> {\n const chunks: Array<Array<RenameCascadeRewriteTarget>> = [];\n for (\n let i = 0;\n i < targets.length;\n i += RENAME_CASCADE_MAX_TARGETS_PER_CHUNK\n ) {\n chunks.push(targets.slice(i, i + RENAME_CASCADE_MAX_TARGETS_PER_CHUNK));\n }\n return chunks;\n}\n"],"mappings":";;;;;;;;;AAuDO,IAAM,uCAAuC;AA4BpD,eAAsB,mCACpB,QAC0C;AAC1C,QAAM,EAAE,SAAS,WAAW,MAAM,IAAI;AAEtC,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,kBAAkB,GAAG,mBAAmB,EAAE;AAAA,EACrD;AACA,MAAI,QAAQ,SAAS,sCAAsC;AACzD,UAAM,IAAI;AAAA,MACR,iDAAiD,QAAQ,MAAM,sBAAsB,oCAAoC;AAAA,IAC3H;AAAA,EACF;AAEA,QAAM,UAAmC,CAAC;AAC1C,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,mBAAmB;AAC5B,cAAQ,KAAK;AAAA,QACX,QAAQ,OAAO;AAAA,QACf,QAAQ;AAAA,QACR,MAAM,EAAE,GAAG,OAAO,OAAO;AAAA,MAC3B,CAAC;AACD,cAAQ,KAAK;AAAA,QACX,QAAQ,OAAO;AAAA,QACf,QAAQ;AAAA,QACR,MAAM,EAAE,GAAG,OAAO,QAAQ;AAAA,MAC5B,CAAC;AAAA,IACH,OAAO;AAEL,cAAQ,KAAK;AAAA,QACX,QAAQ,OAAO;AAAA,QACf,QAAQ;AAAA,QACR,MAAM,EAAE,GAAG,OAAO,QAAQ;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,2BAA2B;AAC9C,UAAM,IAAI;AAAA,MACR,yDAAyD,QAAQ,MAAM,8DAA8D,yBAAyB;AAAA,IAChK;AAAA,EACF;AAEA,QAAM,UAAU,wBAAwB,SAAS;AACjD,QAAM,kBAAkB,EAAE,SAAS,SAAS,MAAM,CAAC;AAEnD,SAAO;AAAA,IACL,kBAAkB,QAAQ;AAAA,IAC1B,mBAAmB,QAAQ;AAAA,EAC7B;AACF;AAQO,SAAS,0BACd,SAC0C;AAC1C,QAAM,SAAmD,CAAC;AAC1D,WACM,IAAI,GACR,IAAI,QAAQ,QACZ,KAAK,sCACL;AACA,WAAO,KAAK,QAAQ,MAAM,GAAG,IAAI,oCAAoC,CAAC;AAAA,EACxE;AACA,SAAO;AACT;","names":[]}
|
|
@@ -107,6 +107,56 @@ var require_registry = __commonJS({
|
|
|
107
107
|
}
|
|
108
108
|
});
|
|
109
109
|
|
|
110
|
+
// ../workflows/lib/detail-types/control-plane.js
|
|
111
|
+
var require_control_plane = __commonJS({
|
|
112
|
+
"../workflows/lib/detail-types/control-plane.js"(exports) {
|
|
113
|
+
"use strict";
|
|
114
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
115
|
+
exports.ControlPlaneRenameFailedV1 = exports.ControlPlaneRenameCompleteV1 = exports.ControlPlaneRenameV1 = exports.RENAMABLE_ENTITY_TYPE = exports.ControlPlaneOwningDeleteFailedV1 = exports.ControlPlaneOwningDeleteCompleteV1 = exports.ControlPlaneOwningDeleteV1 = exports.OWNING_ENTITY_TYPE = void 0;
|
|
116
|
+
var sources_1 = require_sources();
|
|
117
|
+
var registry_1 = require_registry();
|
|
118
|
+
exports.OWNING_ENTITY_TYPE = {
|
|
119
|
+
Workspace: "Workspace",
|
|
120
|
+
User: "User"
|
|
121
|
+
};
|
|
122
|
+
exports.ControlPlaneOwningDeleteV1 = (0, registry_1.defineDetailType)({
|
|
123
|
+
detailType: "control-plane.owning-delete.v1",
|
|
124
|
+
source: sources_1.OPENHI_DATA_SOURCE,
|
|
125
|
+
dedupRequired: true
|
|
126
|
+
});
|
|
127
|
+
exports.ControlPlaneOwningDeleteCompleteV1 = (0, registry_1.defineDetailType)({
|
|
128
|
+
detailType: "control-plane.owning-delete-complete.v1",
|
|
129
|
+
source: sources_1.OPENHI_OPS_SOURCE,
|
|
130
|
+
dedupRequired: true
|
|
131
|
+
});
|
|
132
|
+
exports.ControlPlaneOwningDeleteFailedV1 = (0, registry_1.defineDetailType)({
|
|
133
|
+
detailType: "control-plane.owning-delete-failed.v1",
|
|
134
|
+
source: sources_1.OPENHI_OPS_SOURCE,
|
|
135
|
+
dedupRequired: true
|
|
136
|
+
});
|
|
137
|
+
exports.RENAMABLE_ENTITY_TYPE = {
|
|
138
|
+
Tenant: "Tenant",
|
|
139
|
+
User: "User",
|
|
140
|
+
Role: "Role"
|
|
141
|
+
};
|
|
142
|
+
exports.ControlPlaneRenameV1 = (0, registry_1.defineDetailType)({
|
|
143
|
+
detailType: "control-plane.rename.v1",
|
|
144
|
+
source: sources_1.OPENHI_DATA_SOURCE,
|
|
145
|
+
dedupRequired: true
|
|
146
|
+
});
|
|
147
|
+
exports.ControlPlaneRenameCompleteV1 = (0, registry_1.defineDetailType)({
|
|
148
|
+
detailType: "control-plane.rename-complete.v1",
|
|
149
|
+
source: sources_1.OPENHI_OPS_SOURCE,
|
|
150
|
+
dedupRequired: true
|
|
151
|
+
});
|
|
152
|
+
exports.ControlPlaneRenameFailedV1 = (0, registry_1.defineDetailType)({
|
|
153
|
+
detailType: "control-plane.rename-failed.v1",
|
|
154
|
+
source: sources_1.OPENHI_OPS_SOURCE,
|
|
155
|
+
dedupRequired: true
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
|
|
110
160
|
// ../workflows/lib/detail-types/platform.js
|
|
111
161
|
var require_platform = __commonJS({
|
|
112
162
|
"../workflows/lib/detail-types/platform.js"(exports) {
|
|
@@ -149,6 +199,7 @@ var require_detail_types = __commonJS({
|
|
|
149
199
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p)) __createBinding(exports2, m, p);
|
|
150
200
|
};
|
|
151
201
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
202
|
+
__exportStar(require_control_plane(), exports);
|
|
152
203
|
__exportStar(require_platform(), exports);
|
|
153
204
|
__exportStar(require_registry(), exports);
|
|
154
205
|
}
|
|
@@ -500,7 +551,7 @@ var require_lib = __commonJS({
|
|
|
500
551
|
"../workflows/lib/index.js"(exports) {
|
|
501
552
|
"use strict";
|
|
502
553
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
503
|
-
exports.workflowDedupClient = exports.recordIfAbsent = exports.markFailed = exports.encodeSortKey = exports.WorkflowDedupTableNameMissingError = exports.WorkflowDedupInvalidInputError = exports.WORKFLOW_DEDUP_TABLE_NAME_ENV_VAR = exports.WORKFLOW_DEDUP_MAX_CONSUMER_NAME_LENGTH = exports.WORKFLOW_DEDUP_DEFAULT_TTL_SECONDS = exports.parseWorkflowEvent = exports.UnsupportedEnvelopeVersionError = exports.InvalidWorkflowEventError = exports.workflowsClient = exports.publishWorkflowEvent = exports.WorkflowPublishError = exports.isWellFormedDetailType = exports.defineDetailType = exports.PlatformSystemDataSeededV1 = exports.PlatformDeploymentCompletedV1 = exports.InvalidDetailTypeRegistrationError = exports.OPENHI_OPS_SOURCE = exports.OPENHI_DATA_SOURCE = exports.OPENHI_CONTROL_SOURCE = exports.DEFAULT_BUS_NAME_BY_SOURCE = exports.workflowUserActorFromClaims = exports.isWorkflowUserActor = exports.isWorkflowSystemActor = exports.MissingActorContextError = exports.isSupportedEnvelopeVersion = exports.ENVELOPE_VERSION = void 0;
|
|
554
|
+
exports.workflowDedupClient = exports.recordIfAbsent = exports.markFailed = exports.encodeSortKey = exports.WorkflowDedupTableNameMissingError = exports.WorkflowDedupInvalidInputError = exports.WORKFLOW_DEDUP_TABLE_NAME_ENV_VAR = exports.WORKFLOW_DEDUP_MAX_CONSUMER_NAME_LENGTH = exports.WORKFLOW_DEDUP_DEFAULT_TTL_SECONDS = exports.parseWorkflowEvent = exports.UnsupportedEnvelopeVersionError = exports.InvalidWorkflowEventError = exports.workflowsClient = exports.publishWorkflowEvent = exports.WorkflowPublishError = exports.isWellFormedDetailType = exports.defineDetailType = exports.RENAMABLE_ENTITY_TYPE = exports.PlatformSystemDataSeededV1 = exports.PlatformDeploymentCompletedV1 = exports.OWNING_ENTITY_TYPE = exports.InvalidDetailTypeRegistrationError = exports.ControlPlaneRenameV1 = exports.ControlPlaneRenameFailedV1 = exports.ControlPlaneRenameCompleteV1 = exports.ControlPlaneOwningDeleteV1 = exports.ControlPlaneOwningDeleteFailedV1 = exports.ControlPlaneOwningDeleteCompleteV1 = exports.OPENHI_OPS_SOURCE = exports.OPENHI_DATA_SOURCE = exports.OPENHI_CONTROL_SOURCE = exports.DEFAULT_BUS_NAME_BY_SOURCE = exports.workflowUserActorFromClaims = exports.isWorkflowUserActor = exports.isWorkflowSystemActor = exports.MissingActorContextError = exports.isSupportedEnvelopeVersion = exports.ENVELOPE_VERSION = void 0;
|
|
504
555
|
var envelope_version_1 = require_envelope_version();
|
|
505
556
|
Object.defineProperty(exports, "ENVELOPE_VERSION", { enumerable: true, get: function() {
|
|
506
557
|
return envelope_version_1.ENVELOPE_VERSION;
|
|
@@ -535,15 +586,39 @@ var require_lib = __commonJS({
|
|
|
535
586
|
return sources_1.OPENHI_OPS_SOURCE;
|
|
536
587
|
} });
|
|
537
588
|
var detail_types_1 = require_detail_types();
|
|
589
|
+
Object.defineProperty(exports, "ControlPlaneOwningDeleteCompleteV1", { enumerable: true, get: function() {
|
|
590
|
+
return detail_types_1.ControlPlaneOwningDeleteCompleteV1;
|
|
591
|
+
} });
|
|
592
|
+
Object.defineProperty(exports, "ControlPlaneOwningDeleteFailedV1", { enumerable: true, get: function() {
|
|
593
|
+
return detail_types_1.ControlPlaneOwningDeleteFailedV1;
|
|
594
|
+
} });
|
|
595
|
+
Object.defineProperty(exports, "ControlPlaneOwningDeleteV1", { enumerable: true, get: function() {
|
|
596
|
+
return detail_types_1.ControlPlaneOwningDeleteV1;
|
|
597
|
+
} });
|
|
598
|
+
Object.defineProperty(exports, "ControlPlaneRenameCompleteV1", { enumerable: true, get: function() {
|
|
599
|
+
return detail_types_1.ControlPlaneRenameCompleteV1;
|
|
600
|
+
} });
|
|
601
|
+
Object.defineProperty(exports, "ControlPlaneRenameFailedV1", { enumerable: true, get: function() {
|
|
602
|
+
return detail_types_1.ControlPlaneRenameFailedV1;
|
|
603
|
+
} });
|
|
604
|
+
Object.defineProperty(exports, "ControlPlaneRenameV1", { enumerable: true, get: function() {
|
|
605
|
+
return detail_types_1.ControlPlaneRenameV1;
|
|
606
|
+
} });
|
|
538
607
|
Object.defineProperty(exports, "InvalidDetailTypeRegistrationError", { enumerable: true, get: function() {
|
|
539
608
|
return detail_types_1.InvalidDetailTypeRegistrationError;
|
|
540
609
|
} });
|
|
610
|
+
Object.defineProperty(exports, "OWNING_ENTITY_TYPE", { enumerable: true, get: function() {
|
|
611
|
+
return detail_types_1.OWNING_ENTITY_TYPE;
|
|
612
|
+
} });
|
|
541
613
|
Object.defineProperty(exports, "PlatformDeploymentCompletedV1", { enumerable: true, get: function() {
|
|
542
614
|
return detail_types_1.PlatformDeploymentCompletedV1;
|
|
543
615
|
} });
|
|
544
616
|
Object.defineProperty(exports, "PlatformSystemDataSeededV1", { enumerable: true, get: function() {
|
|
545
617
|
return detail_types_1.PlatformSystemDataSeededV1;
|
|
546
618
|
} });
|
|
619
|
+
Object.defineProperty(exports, "RENAMABLE_ENTITY_TYPE", { enumerable: true, get: function() {
|
|
620
|
+
return detail_types_1.RENAMABLE_ENTITY_TYPE;
|
|
621
|
+
} });
|
|
547
622
|
Object.defineProperty(exports, "defineDetailType", { enumerable: true, get: function() {
|
|
548
623
|
return detail_types_1.defineDetailType;
|
|
549
624
|
} });
|
|
@@ -604,4 +679,4 @@ var require_lib = __commonJS({
|
|
|
604
679
|
export {
|
|
605
680
|
require_lib
|
|
606
681
|
};
|
|
607
|
-
//# sourceMappingURL=chunk-
|
|
682
|
+
//# sourceMappingURL=chunk-ZM4GDHHC.mjs.map
|