@substrat-run/contract-tests 0.116.0 → 0.118.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.
- package/dist/capability-expiry-suite.d.ts +8 -0
- package/dist/capability-expiry-suite.d.ts.map +1 -0
- package/dist/capability-expiry-suite.js +131 -0
- package/dist/capability-expiry-suite.js.map +1 -0
- package/dist/capability-suite.d.ts +3 -0
- package/dist/capability-suite.d.ts.map +1 -0
- package/dist/capability-suite.js +498 -0
- package/dist/capability-suite.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/job-run-suite.d.ts.map +1 -1
- package/dist/job-run-suite.js +250 -2
- package/dist/job-run-suite.js.map +1 -1
- package/dist/modules.d.ts +126 -0
- package/dist/modules.d.ts.map +1 -1
- package/dist/modules.js +273 -1
- package/dist/modules.js.map +1 -1
- package/dist/permission-suite.d.ts.map +1 -1
- package/dist/permission-suite.js +150 -2
- package/dist/permission-suite.js.map +1 -1
- package/dist/schedule-suite.d.ts +14 -0
- package/dist/schedule-suite.d.ts.map +1 -1
- package/dist/schedule-suite.js +22 -1
- package/dist/schedule-suite.js.map +1 -1
- package/dist/scope-host-suite.d.ts.map +1 -1
- package/dist/scope-host-suite.js +1032 -12
- package/dist/scope-host-suite.js.map +1 -1
- package/dist/system-switch-suite.d.ts +16 -0
- package/dist/system-switch-suite.d.ts.map +1 -0
- package/dist/system-switch-suite.js +215 -0
- package/dist/system-switch-suite.js.map +1 -0
- package/package.json +5 -4
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ManualClock, type ScopeHost } from '@substrat-run/kernel';
|
|
2
|
+
export interface CapabilityExpiryFixture {
|
|
3
|
+
host: ScopeHost;
|
|
4
|
+
clock: ManualClock;
|
|
5
|
+
cleanup: () => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare function capabilityExpiryContractSuite(adapterName: string, makeFixture: () => Promise<CapabilityExpiryFixture>): void;
|
|
8
|
+
//# sourceMappingURL=capability-expiry-suite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-expiry-suite.d.ts","sourceRoot":"","sources":["../src/capability-expiry-suite.ts"],"names":[],"mappings":"AA6BA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAU9B,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAQD,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,GAClD,IAAI,CAiHN"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability expiry under an injected clock (#1672) — the TRANSITION from live to expired,
|
|
3
|
+
* which `capabilityContractSuite` cannot reach without waiting for it.
|
|
4
|
+
*
|
|
5
|
+
* Held to the contract on the pure host only, for the reason `grantExpiryContractSuite`
|
|
6
|
+
* gives: the Durable-Object host takes no clock (`clock?: never`, #956), because the
|
|
7
|
+
* instant that matters is read inside the ScopeDO. What makes the DO's answer the same
|
|
8
|
+
* is that both hosts call ONE predicate — `capabilityLive` / `capabilityExchangeable` in
|
|
9
|
+
* the kernel — for the checker, the session door and the exchange alike; the kernel's
|
|
10
|
+
* evaluator tests pin that predicate against an expired row directly.
|
|
11
|
+
*
|
|
12
|
+
* Three clocks run out here, and each has a positive twin one step before it:
|
|
13
|
+
* the capability's own `expiresAt`, a session's TTL, and a platform `become`'s expiry.
|
|
14
|
+
* The bounded prune lives here too: it needs a thousand sessions to expire at once.
|
|
15
|
+
*/
|
|
16
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
17
|
+
import { CAPABILITY_SESSION_TTL_MS, errorCodeOf, permissionKey, platformActorId, principalId, scopeId, tenantId, } from '@substrat-run/contracts';
|
|
18
|
+
import { CAPABILITY_SESSION_PRUNE_BATCH, ulid, } from '@substrat-run/kernel';
|
|
19
|
+
import { capMod } from './modules.js';
|
|
20
|
+
const CAP_READ = permissionKey.parse('cap:read');
|
|
21
|
+
const START = '2026-03-01T09:00:00.000Z';
|
|
22
|
+
const MINUTE = 60_000;
|
|
23
|
+
const HOUR = 60 * MINUTE;
|
|
24
|
+
const folder = (id) => ({ entityType: 'folder', entityId: id });
|
|
25
|
+
const refusal = (p) => p.then(() => undefined, (e) => e);
|
|
26
|
+
export function capabilityExpiryContractSuite(adapterName, makeFixture) {
|
|
27
|
+
describe(`capability expiry under an injected clock (#1672): ${adapterName}`, () => {
|
|
28
|
+
let fixture;
|
|
29
|
+
let host;
|
|
30
|
+
let clock;
|
|
31
|
+
const t1 = tenantId.parse(ulid());
|
|
32
|
+
const s1 = scopeId.parse(ulid());
|
|
33
|
+
const alice = principalId.parse(ulid());
|
|
34
|
+
const seat = principalId.parse(ulid());
|
|
35
|
+
const staff = platformActorId.parse(ulid());
|
|
36
|
+
const at = (ms) => new Date(Date.parse(clock.now()) + ms).toISOString();
|
|
37
|
+
const share = async (spec) => (await host.getScope(alice, t1, s1)).invoke('cap/share', spec);
|
|
38
|
+
const read = async (token) => (await host.getCapabilityScope(token, t1, s1)).invoke('cap/read', { entity: folder('F') });
|
|
39
|
+
const session = async (secret) => {
|
|
40
|
+
const ex = await host.exchangeCapability(t1, s1, secret);
|
|
41
|
+
if (ex?.kind !== 'session')
|
|
42
|
+
throw new Error(`expected a session, got ${JSON.stringify(ex)}`);
|
|
43
|
+
return { token: ex.sessionToken, expiresAt: ex.expiresAt };
|
|
44
|
+
};
|
|
45
|
+
beforeAll(async () => {
|
|
46
|
+
fixture = await makeFixture();
|
|
47
|
+
host = fixture.host;
|
|
48
|
+
clock = fixture.clock;
|
|
49
|
+
clock.set(START);
|
|
50
|
+
host.registerModule(capMod);
|
|
51
|
+
await host.admin.createTenant(staff, { id: t1, slug: 'cap-expiry', name: 'Cap Expiry' });
|
|
52
|
+
await host.admin.grantEntitlement(staff, t1, 'cap');
|
|
53
|
+
await host.provisionScope(staff, { tenantId: t1, scopeId: s1, vertical: 'cap-vertical' });
|
|
54
|
+
await host.admin.activateScope(staff, t1, s1);
|
|
55
|
+
await host.admin.defineRole(staff, t1, { key: 'owner', permissions: [CAP_READ], source: 'vertical' });
|
|
56
|
+
await host.admin.assignRole(staff, {
|
|
57
|
+
principalId: alice,
|
|
58
|
+
roleKey: 'owner',
|
|
59
|
+
node: { tenantId: t1, scopeId: null },
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
afterAll(async () => {
|
|
63
|
+
await fixture.cleanup();
|
|
64
|
+
});
|
|
65
|
+
it('a capability acts until its expiry and not a moment after — and cannot be exchanged after it', async () => {
|
|
66
|
+
const minted = await share({ entity: folder('F'), permissions: [CAP_READ], expiresAt: at(HOUR) });
|
|
67
|
+
const { token, expiresAt } = await session(minted.secret);
|
|
68
|
+
// A session never outlives its capability.
|
|
69
|
+
expect(expiresAt).toBe(minted.expiresAt);
|
|
70
|
+
clock.advance(HOUR - MINUTE);
|
|
71
|
+
await expect(read(token)).resolves.toBeTruthy();
|
|
72
|
+
clock.advance(2 * MINUTE);
|
|
73
|
+
expect(errorCodeOf(await refusal(read(token)))).toBe('unauthenticated');
|
|
74
|
+
expect(await host.exchangeCapability(t1, s1, minted.secret)).toBeNull();
|
|
75
|
+
});
|
|
76
|
+
it('a session lives its TTL and no longer; the link itself exchanges again', async () => {
|
|
77
|
+
const minted = await share({ entity: folder('F'), permissions: [CAP_READ] });
|
|
78
|
+
const { token } = await session(minted.secret);
|
|
79
|
+
clock.advance(CAPABILITY_SESSION_TTL_MS - MINUTE);
|
|
80
|
+
await expect(read(token)).resolves.toBeTruthy();
|
|
81
|
+
clock.advance(2 * MINUTE);
|
|
82
|
+
expect(errorCodeOf(await refusal(read(token)))).toBe('unauthenticated');
|
|
83
|
+
const fresh = await session(minted.secret);
|
|
84
|
+
await expect(read(fresh.token)).resolves.toBeTruthy();
|
|
85
|
+
});
|
|
86
|
+
it('an exchange prunes at most one batch of expired sessions, and later exchanges drain the rest', async () => {
|
|
87
|
+
// A scope of its own, so no other test's sessions are in the count.
|
|
88
|
+
const s2 = scopeId.parse(ulid());
|
|
89
|
+
await host.provisionScope(staff, { tenantId: t1, scopeId: s2, vertical: 'cap-vertical' });
|
|
90
|
+
await host.admin.activateScope(staff, t1, s2);
|
|
91
|
+
const stub = await host.getScope(alice, t1, s2);
|
|
92
|
+
const count = () => stub.invoke('cap/session-count');
|
|
93
|
+
const minted = await stub.invoke('cap/share', {
|
|
94
|
+
entity: folder('F'),
|
|
95
|
+
permissions: [CAP_READ],
|
|
96
|
+
});
|
|
97
|
+
const exchange = () => host.exchangeCapability(t1, s2, minted.secret);
|
|
98
|
+
for (let i = 0; i < 1000; i++)
|
|
99
|
+
await exchange();
|
|
100
|
+
expect(await count()).toBe(1000);
|
|
101
|
+
clock.advance(CAPABILITY_SESSION_TTL_MS + MINUTE); // every one of them is now expired
|
|
102
|
+
await exchange();
|
|
103
|
+
// One batch gone, one live session added — not the thousand an unbounded prune takes.
|
|
104
|
+
expect(await count()).toBe(1000 - CAPABILITY_SESSION_PRUNE_BATCH + 1);
|
|
105
|
+
const exchangesToDrain = 1000 / CAPABILITY_SESSION_PRUNE_BATCH;
|
|
106
|
+
for (let i = 1; i < exchangesToDrain; i++)
|
|
107
|
+
await exchange();
|
|
108
|
+
// Drained: only the live sessions those exchanges handed out remain.
|
|
109
|
+
expect(await count()).toBe(exchangesToDrain);
|
|
110
|
+
await exchange();
|
|
111
|
+
expect(await count()).toBe(exchangesToDrain + 1);
|
|
112
|
+
});
|
|
113
|
+
it('a platform `become` exchanges until its expiry, and not after', async () => {
|
|
114
|
+
const early = await host.admin.mintCapability(staff, t1, s1, {
|
|
115
|
+
principal: seat,
|
|
116
|
+
expiresAt: at(10 * MINUTE),
|
|
117
|
+
maxUses: 5,
|
|
118
|
+
});
|
|
119
|
+
const late = await host.admin.mintCapability(staff, t1, s1, {
|
|
120
|
+
principal: seat,
|
|
121
|
+
expiresAt: at(10 * MINUTE),
|
|
122
|
+
maxUses: 5,
|
|
123
|
+
});
|
|
124
|
+
clock.advance(9 * MINUTE);
|
|
125
|
+
expect((await host.exchangeCapability(t1, s1, early.secret))?.kind).toBe('principal');
|
|
126
|
+
clock.advance(2 * MINUTE);
|
|
127
|
+
expect(await host.exchangeCapability(t1, s1, late.secret)).toBeNull();
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=capability-expiry-suite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-expiry-suite.js","sourceRoot":"","sources":["../src/capability-expiry-suite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-suite.d.ts","sourceRoot":"","sources":["../src/capability-suite.ts"],"names":[],"mappings":"AAuDA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAkC9D,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAC3C,IAAI,CAmiBN"}
|