borgmcp-shared 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -28
- package/RELEASES.md +29 -0
- package/dist/conformance/adapter.d.ts +19 -0
- package/dist/conformance/adapter.d.ts.map +1 -1
- package/dist/conformance/adapter.js +141 -1
- package/dist/conformance/adapter.js.map +1 -1
- package/dist/conformance/index.d.ts +20 -1
- package/dist/conformance/index.d.ts.map +1 -1
- package/dist/conformance/index.js +37 -0
- package/dist/conformance/index.js.map +1 -1
- package/dist/protocol/contract.d.ts +19 -1
- package/dist/protocol/contract.d.ts.map +1 -1
- package/dist/protocol/contract.js +32 -2
- package/dist/protocol/contract.js.map +1 -1
- package/dist/protocol/errors.d.ts +1 -0
- package/dist/protocol/errors.d.ts.map +1 -1
- package/dist/protocol/errors.js +1 -0
- package/dist/protocol/errors.js.map +1 -1
- package/dist/protocol/sse.d.ts +6 -2
- package/dist/protocol/sse.d.ts.map +1 -1
- package/dist/protocol/sse.js +8 -2
- package/dist/protocol/sse.js.map +1 -1
- package/dist/protocol/version.d.ts +1 -1
- package/dist/protocol/version.js +1 -1
- package/docs/compatibility.md +10 -4
- package/docs/enrollment.md +4 -3
- package/docs/releasing.md +4 -3
- package/package.json +2 -1
- package/src/conformance/adapter.ts +294 -0
- package/src/conformance/index.ts +53 -0
- package/src/protocol/contract.ts +42 -2
- package/src/protocol/errors.ts +1 -0
- package/src/protocol/sse.ts +17 -2
- package/src/protocol/version.ts +2 -2
package/README.md
CHANGED
|
@@ -159,35 +159,12 @@ the coordinated rollout order for introducing protocol changes.
|
|
|
159
159
|
|
|
160
160
|
## Distribution
|
|
161
161
|
|
|
162
|
-
`borgmcp-shared@0.
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
`borgmcp-shared@0.4.2` is published and immutable. `borgmcp-shared@0.4.3` is the
|
|
167
|
-
immutable protocol v2 session-lifecycle release. `borgmcp-shared@0.5.0` is the published protocol v3 attach-session contract
|
|
168
|
-
release: attach responses carry the exact non-expiring `session: { id }` shape.
|
|
169
|
-
`borgmcp-shared@0.5.1` is published and immutable under the accepted attempt-1
|
|
170
|
-
registry-propagation incident: annotated tag object `045268aa8873da330819860012ecaddb4bc2883c` peels to
|
|
171
|
-
`1981d7373e77f6edb4567872c1544bdbe2b1ef20`; workflow run `29984423571` published exact integrity
|
|
172
|
-
`sha512-XUJq+FjY/cbarU9V1dIWnhNYcqyURTiGb6KyIzg99gy5hk/fEs5ee/8X/qvp7pw1Rshqt2J6I3TVbwJdlde2tA==` and must never be rerun. Independent npm verification
|
|
173
|
-
confirmed its registry signature and SLSA provenance. `borgmcp-shared@0.6.0` was
|
|
174
|
-
never published: annotated tag object `90a1cf686a0ce32a7aef836b0b82a930191b9030`
|
|
175
|
-
peels to protected-main commit `fd69b08586481a60c88099dede8e4e066f73f2f2`;
|
|
176
|
-
attempt-1 workflow run `30054936226` failed in tests before build, packaging,
|
|
177
|
-
authentication, or registry mutation and must never be rerun or moved.
|
|
178
|
-
`borgmcp-shared@0.6.1`, `borgmcp-shared@0.6.2`, and
|
|
179
|
-
`borgmcp-shared@0.6.3` are published and immutable. `borgmcp-shared@0.6.4` is
|
|
180
|
-
published and immutable: annotated tag object
|
|
181
|
-
`f79b0683686d3c359023a17f6e8a92efd888104a` peels to protected-main commit
|
|
182
|
-
`fa8a2dc072d4ffe2a16d5f02576fead822a2f72e`; successful attempt-1 workflow run
|
|
183
|
-
`30169732628` published registry integrity
|
|
184
|
-
`sha512-Wm4b0uoOAw9JCz5OTHD0Q2uXKkeWYdkVksdeZvRG8l62XGMY+G8GkNEsZT9L533LbVbQ29GhgF0htjDenQThDg==`.
|
|
185
|
-
Never rerun or move that tag. This source now identifies the unpublished `0.7.0`
|
|
186
|
-
protocol-v6 local-model-template release candidate. This version bump grants no
|
|
187
|
-
tag or publish authority; creating annotated `v0.7.0` and publishing its exact
|
|
188
|
-
reviewed artifact remain separate, independently gated steps.
|
|
162
|
+
This source identifies `borgmcp-shared@0.7.1`; install the published release from npm.
|
|
163
|
+
|
|
164
|
+
See [RELEASES.md](RELEASES.md) for immutable release history.
|
|
165
|
+
|
|
189
166
|
Consumers update shared, server, and client together: peers carrying protocol v2,
|
|
190
|
-
v3, v4, v5, and
|
|
167
|
+
v3, v4, v5, v6, and v7 reject incompatible tags during credential-free preflight. No
|
|
191
168
|
registry token belongs in this repository, package metadata, lockfiles, or a
|
|
192
169
|
committed `.npmrc`;
|
|
193
170
|
publishing uses protected external credentials and provenance. Successful
|
package/RELEASES.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Release History
|
|
2
|
+
|
|
3
|
+
`borgmcp-shared@0.4.0` is the published clean-slate v2 baseline and is
|
|
4
|
+
immutable, but its artifact predates the local/self-hosted package cleanup. The
|
|
5
|
+
immutable `v0.4.1` verification artifact exposed a platform-dependent SBOM audit
|
|
6
|
+
and must never be published, moved, reused, rerun, or substituted.
|
|
7
|
+
`borgmcp-shared@0.4.2` is published and immutable. `borgmcp-shared@0.4.3` is the
|
|
8
|
+
immutable protocol v2 session-lifecycle release. `borgmcp-shared@0.5.0` is the published protocol v3 attach-session contract
|
|
9
|
+
release: attach responses carry the exact non-expiring `session: { id }` shape.
|
|
10
|
+
`borgmcp-shared@0.5.1` is published and immutable under the accepted attempt-1
|
|
11
|
+
registry-propagation incident: annotated tag object `045268aa8873da330819860012ecaddb4bc2883c` peels to
|
|
12
|
+
`1981d7373e77f6edb4567872c1544bdbe2b1ef20`; workflow run `29984423571` published exact integrity
|
|
13
|
+
`sha512-XUJq+FjY/cbarU9V1dIWnhNYcqyURTiGb6KyIzg99gy5hk/fEs5ee/8X/qvp7pw1Rshqt2J6I3TVbwJdlde2tA==` and must never be rerun. Independent npm verification
|
|
14
|
+
confirmed its registry signature and SLSA provenance. `borgmcp-shared@0.6.0` was
|
|
15
|
+
never published: annotated tag object `90a1cf686a0ce32a7aef836b0b82a930191b9030`
|
|
16
|
+
peels to protected-main commit `fd69b08586481a60c88099dede8e4e066f73f2f2`;
|
|
17
|
+
attempt-1 workflow run `30054936226` failed in tests before build, packaging,
|
|
18
|
+
authentication, or registry mutation and must never be rerun or moved.
|
|
19
|
+
`borgmcp-shared@0.6.1`, `borgmcp-shared@0.6.2`, and
|
|
20
|
+
`borgmcp-shared@0.6.3` are published and immutable. `borgmcp-shared@0.6.4` is
|
|
21
|
+
published and immutable: annotated tag object
|
|
22
|
+
`f79b0683686d3c359023a17f6e8a92efd888104a` peels to protected-main commit
|
|
23
|
+
`fa8a2dc072d4ffe2a16d5f02576fead822a2f72e`; successful attempt-1 workflow run
|
|
24
|
+
`30169732628` published registry integrity
|
|
25
|
+
`sha512-Wm4b0uoOAw9JCz5OTHD0Q2uXKkeWYdkVksdeZvRG8l62XGMY+G8GkNEsZT9L533LbVbQ29GhgF0htjDenQThDg==`.
|
|
26
|
+
Never rerun or move that tag.
|
|
27
|
+
`borgmcp-shared@0.7.0` is published and immutable: annotated tag object
|
|
28
|
+
`5ddaf5821c49ac0893fdffbac6115b48d0795281` peels to protected-main commit
|
|
29
|
+
`30af2629052014feba3f3ebf4d9eb29e977e38a7`. Never rerun or move that tag.
|
|
@@ -82,6 +82,19 @@ export interface ConformanceCreatedCubeState {
|
|
|
82
82
|
human_seat_role_matches: boolean;
|
|
83
83
|
default_worker_role_matches: boolean;
|
|
84
84
|
}
|
|
85
|
+
export interface ConformanceDeletedCubeState {
|
|
86
|
+
readonly cube_exists: boolean;
|
|
87
|
+
readonly role_count: number;
|
|
88
|
+
readonly drone_count: number;
|
|
89
|
+
readonly log_count: number;
|
|
90
|
+
readonly claim_count: number;
|
|
91
|
+
readonly decision_count: number;
|
|
92
|
+
readonly grant_count: number;
|
|
93
|
+
readonly cube_create_binding_count: number;
|
|
94
|
+
readonly repository_association_count: number;
|
|
95
|
+
readonly active_stream_count: number;
|
|
96
|
+
readonly terminal_credential_count: number;
|
|
97
|
+
}
|
|
85
98
|
export interface ConformanceRepositoryCubeFixture {
|
|
86
99
|
cube_id: string;
|
|
87
100
|
name: string;
|
|
@@ -104,6 +117,7 @@ export interface ConformanceStreamResponse extends ConformanceHttpResponse {
|
|
|
104
117
|
}
|
|
105
118
|
export interface ConformanceAdmin {
|
|
106
119
|
reset(): Promise<void>;
|
|
120
|
+
restartAuthority(): Promise<void>;
|
|
107
121
|
createPrincipal(name: string): Promise<ConformancePrincipal>;
|
|
108
122
|
createCube(name: string): Promise<ConformanceCube>;
|
|
109
123
|
grantCube(principal: ConformancePrincipal, cube: ConformanceCube, access?: ConformanceCubeAccess): Promise<void>;
|
|
@@ -128,6 +142,7 @@ export interface ConformanceAdmin {
|
|
|
128
142
|
issueSingleUseInvitation(principal: ConformancePrincipal, purpose: 'owner' | 'client'): Promise<string>;
|
|
129
143
|
observeAuthorityState(): Promise<ConformanceAuthorityState>;
|
|
130
144
|
inspectCreatedCube(creator: ConformancePrincipal, response: CreateCubeResponse): Promise<ConformanceCreatedCubeState>;
|
|
145
|
+
inspectDeletedCube(cube: ConformanceCube): Promise<ConformanceDeletedCubeState>;
|
|
131
146
|
prepareRepositoryCube(cube: ConformanceCube, input: {
|
|
132
147
|
name: string;
|
|
133
148
|
template: CubeTemplate;
|
|
@@ -142,6 +157,7 @@ export interface ConformanceOperations {
|
|
|
142
157
|
protocol(credential: string | null): Promise<ConformanceHttpResponse>;
|
|
143
158
|
enroll(request: unknown): Promise<ConformanceHttpResponse>;
|
|
144
159
|
createCube(credential: string | null, request: unknown): Promise<ConformanceHttpResponse>;
|
|
160
|
+
deleteCube(credential: string, cube: ConformanceCube, request: unknown): Promise<ConformanceHttpResponse>;
|
|
145
161
|
resolveRepositoryCube(credential: string | null, request: unknown): Promise<ConformanceHttpResponse>;
|
|
146
162
|
associateRepositoryCube(credential: string | null, request: unknown): Promise<ConformanceHttpResponse>;
|
|
147
163
|
attach(credential: string, request: unknown): Promise<ConformanceHttpResponse>;
|
|
@@ -245,6 +261,9 @@ export declare const ADAPTER_CONFORMANCE_FIXTURES: readonly [{
|
|
|
245
261
|
}, {
|
|
246
262
|
readonly id: "security.active-stream-revocation";
|
|
247
263
|
readonly area: "security";
|
|
264
|
+
}, {
|
|
265
|
+
readonly id: "cubes.delete-terminal-cascade";
|
|
266
|
+
readonly area: "cubes";
|
|
248
267
|
}];
|
|
249
268
|
export type AdapterConformanceFixtureId = (typeof ADAPTER_CONFORMANCE_FIXTURES)[number]['id'];
|
|
250
269
|
export interface AdapterConformanceResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/conformance/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/conformance/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ErrorCode, compareLogCursor, createProtocolEnvelope, decodeAssociateRepositoryCubeResponseEnvelope, decodeCreateCubeResponseEnvelope, decodeAppendLogResultEnvelope, decodeDecisionResultEnvelope, decodeDecisionsResultEnvelope, decodeEnrollmentExchangeResponseEnvelope, decodeAttachResponseEnvelope, decodeDroneRuntimeMetadataPatch, decodeEvictDroneResultEnvelope, decodeProtocolEnvelope, decodeProtocolErrorEnvelope, decodeProtocolTagPreflight, decodeReadLogResultEnvelope, decodeResolveRepositoryCubeResponseEnvelope, decodeReassignDroneResultEnvelope, decodeUpdateDroneRuntimeMetadataResponseEnvelope, decodeSseFrames, PROTOCOL_LIMIT_CEILINGS, PROTOCOL_HTTP_CONTRACT, PROTOCOL_VERSION, utf8ByteLength, } from '../protocol/index.js';
|
|
1
|
+
import { ErrorCode, compareLogCursor, createProtocolEnvelope, decodeAssociateRepositoryCubeResponseEnvelope, decodeCreateCubeResponseEnvelope, decodeDeleteCubeResponseEnvelope, decodeAppendLogResultEnvelope, decodeDecisionResultEnvelope, decodeDecisionsResultEnvelope, decodeEnrollmentExchangeResponseEnvelope, decodeAttachResponseEnvelope, decodeDroneRuntimeMetadataPatch, decodeEvictDroneResultEnvelope, decodeProtocolEnvelope, decodeProtocolErrorEnvelope, decodeProtocolTagPreflight, decodeReadLogResultEnvelope, decodeResolveRepositoryCubeResponseEnvelope, decodeReassignDroneResultEnvelope, decodeUpdateDroneRuntimeMetadataResponseEnvelope, decodeSseFrames, PROTOCOL_LIMIT_CEILINGS, PROTOCOL_HTTP_CONTRACT, PROTOCOL_VERSION, utf8ByteLength, } from '../protocol/index.js';
|
|
2
2
|
import { CREATE_CUBE_ASSOCIATION_CONFORMANCE, CREATE_CUBE_RETRY_CONFORMANCE, ENROLLMENT_RETRY_CONFORMANCE, } from './index.js';
|
|
3
3
|
export const ADAPTER_CONFORMANCE_FIXTURES = [
|
|
4
4
|
{ id: 'http.unauthenticated-liveness', area: 'http' },
|
|
@@ -28,6 +28,7 @@ export const ADAPTER_CONFORMANCE_FIXTURES = [
|
|
|
28
28
|
{ id: 'security.metadata-noninterference', area: 'security' },
|
|
29
29
|
{ id: 'security.metadata-secret-non-echo', area: 'security' },
|
|
30
30
|
{ id: 'security.active-stream-revocation', area: 'security' },
|
|
31
|
+
{ id: 'cubes.delete-terminal-cascade', area: 'cubes' },
|
|
31
32
|
];
|
|
32
33
|
const DEFAULT_STREAM_DEADLINE_MS = 5_000;
|
|
33
34
|
const DEFAULT_PENDING_PROBE_MS = 25;
|
|
@@ -1249,6 +1250,145 @@ export async function runAdapterConformance(environment, options = {}) {
|
|
|
1249
1250
|
expectError(rejected, 401, ErrorCode.SESSION_REVOKED, 'Post-revocation request');
|
|
1250
1251
|
return { stream_terminated: true, subsequent_status: 401, subsequent_code: ErrorCode.SESSION_REVOKED };
|
|
1251
1252
|
});
|
|
1253
|
+
await record('cubes.delete-terminal-cascade', async () => {
|
|
1254
|
+
const enrollParent = async (name, marker, retrySuffix) => {
|
|
1255
|
+
const principal = await environment.admin.createPrincipal(name);
|
|
1256
|
+
const invitation = await environment.admin.issueSingleUseInvitation(principal, 'client');
|
|
1257
|
+
const credential = `${marker.repeat(41)}AQ`;
|
|
1258
|
+
expectStatus(await environment.operations.enroll(createProtocolEnvelope(`delete-${name}-enroll`, {
|
|
1259
|
+
invitation,
|
|
1260
|
+
retry_key: `00000000-0000-4000-8000-${retrySuffix.padStart(12, '0')}`,
|
|
1261
|
+
client_credential: credential,
|
|
1262
|
+
client_name: name,
|
|
1263
|
+
})), 201, `${name} enrollment`);
|
|
1264
|
+
return { principal, credential };
|
|
1265
|
+
};
|
|
1266
|
+
const creator = await enrollParent('delete-creator', 'C', '701');
|
|
1267
|
+
const manager = await enrollParent('delete-manager', 'M', '702');
|
|
1268
|
+
const reader = await enrollParent('delete-reader', 'R', '703');
|
|
1269
|
+
const writer = await enrollParent('delete-writer', 'W', '704');
|
|
1270
|
+
const outsider = await enrollParent('delete-outsider', 'O', '705');
|
|
1271
|
+
await environment.admin.grantCreateCubeCapability(creator.principal);
|
|
1272
|
+
const createResponse = await environment.operations.createCube(creator.credential, createProtocolEnvelope('delete-cube-create', {
|
|
1273
|
+
retry_key: '00000000-0000-4000-8000-000000000706',
|
|
1274
|
+
name: 'Disposable Cube',
|
|
1275
|
+
working_repo_name: 'disposable-cube',
|
|
1276
|
+
repository: { kind: 'local', value: '00000000-0000-4000-8000-000000000707' },
|
|
1277
|
+
template: 'default',
|
|
1278
|
+
}));
|
|
1279
|
+
expectStatus(createResponse, 201, 'Disposable cube creation');
|
|
1280
|
+
const created = decodeCreateCubeResponseEnvelope(createResponse.body).payload;
|
|
1281
|
+
const cube = { id: created.cube_id };
|
|
1282
|
+
const role = { id: created.default_worker_role_id };
|
|
1283
|
+
await environment.admin.grantCube(manager.principal, cube, 'manage');
|
|
1284
|
+
await environment.admin.grantCube(reader.principal, cube, 'read');
|
|
1285
|
+
await environment.admin.grantCube(writer.principal, cube, 'write');
|
|
1286
|
+
const drone = await environment.admin.createDrone(creator.principal, cube, role);
|
|
1287
|
+
const droneCredential = await environment.admin.issueManagedDroneSession(drone);
|
|
1288
|
+
const append = await environment.operations.append(creator.credential, cube, createProtocolEnvelope('delete-log', { message: 'deleted with cube' }));
|
|
1289
|
+
expectStatus(append, 201, 'Deletion fixture log');
|
|
1290
|
+
const entry = decodeAppendLogResultEnvelope(append.body).payload.entry;
|
|
1291
|
+
expectStatus(await environment.operations.ack(creator.credential, cube, createProtocolEnvelope('delete-claim', { entry_id: entry.id, kind: 'claim' })), 204, 'Deletion fixture claim');
|
|
1292
|
+
expectStatus(await environment.operations.recordDecision(manager.credential, cube, createProtocolEnvelope('delete-decision', { topic: 'cleanup', decision: 'delete' })), 201, 'Deletion fixture decision');
|
|
1293
|
+
const beforeDenied = await environment.admin.inspectCubeManagementState(cube);
|
|
1294
|
+
for (const [kind, credential] of [
|
|
1295
|
+
['read', reader.credential],
|
|
1296
|
+
['write', writer.credential],
|
|
1297
|
+
['drone-session', droneCredential],
|
|
1298
|
+
]) {
|
|
1299
|
+
expectError(await environment.operations.deleteCube(credential, cube, createProtocolEnvelope(`delete-${kind}-denied`, {})), 403, ErrorCode.ACCESS_DENIED, `${kind} cube deletion`);
|
|
1300
|
+
invariant(same(await environment.admin.inspectCubeManagementState(cube), beforeDenied), `${kind} cube deletion denial mutated the cube.`);
|
|
1301
|
+
}
|
|
1302
|
+
expectError(await environment.operations.deleteCube(outsider.credential, cube, createProtocolEnvelope('delete-outsider-denied', {})), 404, ErrorCode.NOT_FOUND, 'Never-authorized cube deletion');
|
|
1303
|
+
const parentStream = await environment.operations.openStream(manager.credential, cube, null);
|
|
1304
|
+
const droneStream = await environment.operations.openStream(droneCredential, cube, null);
|
|
1305
|
+
expectStatus(parentStream, 200, 'Deletion parent stream');
|
|
1306
|
+
expectStatus(droneStream, 200, 'Deletion drone stream');
|
|
1307
|
+
invariant(parentStream.stream && droneStream.stream, 'Deletion fixture streams did not open.');
|
|
1308
|
+
const parentEvents = new SseEventReader(parentStream.stream);
|
|
1309
|
+
const droneEvents = new SseEventReader(droneStream.stream);
|
|
1310
|
+
for (const streamReader of [parentEvents, droneEvents]) {
|
|
1311
|
+
invariant((await streamReader.next()).type === 'log', 'Deletion stream omitted replay log.');
|
|
1312
|
+
const bookmark = await streamReader.next();
|
|
1313
|
+
invariant(bookmark.type === 'bookmark' && bookmark.replay_complete, 'Deletion stream omitted bookmark.');
|
|
1314
|
+
}
|
|
1315
|
+
const parentTerminal = parentEvents.next();
|
|
1316
|
+
const droneTerminal = droneEvents.next();
|
|
1317
|
+
await provePending(parentTerminal, 'Parent deletion terminal event', pendingProbeMs);
|
|
1318
|
+
await provePending(droneTerminal, 'Drone deletion terminal event', pendingProbeMs);
|
|
1319
|
+
const deleted = await environment.operations.deleteCube(manager.credential, cube, createProtocolEnvelope('delete-managed-cube', {}));
|
|
1320
|
+
expectStatus(deleted, 200, 'Managed cube deletion');
|
|
1321
|
+
invariant(same(decodeDeleteCubeResponseEnvelope(deleted.body).payload, {
|
|
1322
|
+
cube_id: cube.id,
|
|
1323
|
+
deleted: true,
|
|
1324
|
+
}), 'Cube deletion response did not identify the terminal cube.');
|
|
1325
|
+
for (const [kind, event] of [
|
|
1326
|
+
['parent', await within(parentTerminal, 'Parent deletion terminal event', streamDeadlineMs)],
|
|
1327
|
+
['drone', await within(droneTerminal, 'Drone deletion terminal event', streamDeadlineMs)],
|
|
1328
|
+
]) {
|
|
1329
|
+
invariant(event.type === 'error' && event.error.error.code === ErrorCode.CUBE_DELETED, `${kind} stream did not receive CUBE_DELETED.`);
|
|
1330
|
+
}
|
|
1331
|
+
for (const streamReader of [parentEvents, droneEvents]) {
|
|
1332
|
+
let closed = false;
|
|
1333
|
+
try {
|
|
1334
|
+
await within(streamReader.next(), 'Deleted cube stream close', streamDeadlineMs);
|
|
1335
|
+
}
|
|
1336
|
+
catch (error) {
|
|
1337
|
+
if (error instanceof Error && error.message.includes('did not settle'))
|
|
1338
|
+
throw error;
|
|
1339
|
+
closed = true;
|
|
1340
|
+
}
|
|
1341
|
+
invariant(closed, 'Deleted cube stream yielded after its terminal error.');
|
|
1342
|
+
await streamReader.close();
|
|
1343
|
+
}
|
|
1344
|
+
invariant(same(await environment.admin.inspectDeletedCube(cube), {
|
|
1345
|
+
cube_exists: false,
|
|
1346
|
+
role_count: 0,
|
|
1347
|
+
drone_count: 0,
|
|
1348
|
+
log_count: 0,
|
|
1349
|
+
claim_count: 0,
|
|
1350
|
+
decision_count: 0,
|
|
1351
|
+
grant_count: 0,
|
|
1352
|
+
cube_create_binding_count: 0,
|
|
1353
|
+
repository_association_count: 0,
|
|
1354
|
+
active_stream_count: 0,
|
|
1355
|
+
terminal_credential_count: 5,
|
|
1356
|
+
}), 'Cube deletion did not atomically remove cube-owned state and preserve only terminal credentials.');
|
|
1357
|
+
for (const [kind, credential] of [
|
|
1358
|
+
['creator', creator.credential],
|
|
1359
|
+
['manager', manager.credential],
|
|
1360
|
+
['reader', reader.credential],
|
|
1361
|
+
['writer', writer.credential],
|
|
1362
|
+
['drone', droneCredential],
|
|
1363
|
+
]) {
|
|
1364
|
+
expectError(await environment.operations.read(credential, cube, createProtocolEnvelope(`delete-${kind}-terminal`, { cursor: null, limit: 1 })), PROTOCOL_HTTP_CONTRACT.cube_deleted_status, ErrorCode.CUBE_DELETED, `${kind} post-delete request`);
|
|
1365
|
+
expectError(await environment.operations.deleteCube(credential, cube, createProtocolEnvelope(`delete-${kind}-repeat-terminal`, {})), PROTOCOL_HTTP_CONTRACT.cube_deleted_status, ErrorCode.CUBE_DELETED, `${kind} post-delete DELETE`);
|
|
1366
|
+
}
|
|
1367
|
+
expectError(await environment.operations.deleteCube(outsider.credential, cube, createProtocolEnvelope('delete-outsider-hidden-repeat', {})), 404, ErrorCode.NOT_FOUND, 'Never-authorized post-delete DELETE');
|
|
1368
|
+
expectError(await environment.operations.read(outsider.credential, cube, createProtocolEnvelope('delete-outsider-hidden', { cursor: null, limit: 1 })), 404, ErrorCode.NOT_FOUND, 'Never-authorized post-delete request');
|
|
1369
|
+
await environment.admin.restartAuthority();
|
|
1370
|
+
for (const [kind, credential] of [
|
|
1371
|
+
['creator', creator.credential],
|
|
1372
|
+
['manager', manager.credential],
|
|
1373
|
+
['reader', reader.credential],
|
|
1374
|
+
['writer', writer.credential],
|
|
1375
|
+
['drone', droneCredential],
|
|
1376
|
+
]) {
|
|
1377
|
+
expectError(await environment.operations.read(credential, cube, createProtocolEnvelope(`delete-${kind}-after-restart`, { cursor: null, limit: 1 })), PROTOCOL_HTTP_CONTRACT.cube_deleted_status, ErrorCode.CUBE_DELETED, `${kind} post-restart deleted-cube request`);
|
|
1378
|
+
expectError(await environment.operations.deleteCube(credential, cube, createProtocolEnvelope(`delete-${kind}-repeat-after-restart`, {})), PROTOCOL_HTTP_CONTRACT.cube_deleted_status, ErrorCode.CUBE_DELETED, `${kind} post-restart DELETE`);
|
|
1379
|
+
}
|
|
1380
|
+
expectError(await environment.operations.deleteCube(outsider.credential, cube, createProtocolEnvelope('delete-outsider-hidden-repeat-after-restart', {})), 404, ErrorCode.NOT_FOUND, 'Never-authorized post-restart DELETE');
|
|
1381
|
+
expectError(await environment.operations.read(outsider.credential, cube, createProtocolEnvelope('delete-outsider-hidden-after-restart', { cursor: null, limit: 1 })), 404, ErrorCode.NOT_FOUND, 'Never-authorized post-restart request');
|
|
1382
|
+
return {
|
|
1383
|
+
deletion_status: 200,
|
|
1384
|
+
cascade_complete: true,
|
|
1385
|
+
terminal_stream_error: ErrorCode.CUBE_DELETED,
|
|
1386
|
+
terminal_http_status: 410,
|
|
1387
|
+
terminal_state_durable_after_restart: true,
|
|
1388
|
+
unknown_hidden_status: 404,
|
|
1389
|
+
non_member_manager: true,
|
|
1390
|
+
};
|
|
1391
|
+
});
|
|
1252
1392
|
const normalizedTranscript = results.map(({ id, observations }) => ({ id, observations }));
|
|
1253
1393
|
return { ok: results.every((result) => result.ok), results, normalizedTranscript };
|
|
1254
1394
|
}
|