ds-harness-remote 0.3.8 → 0.3.13
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 +63 -67
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +20 -12
- package/dist/adapters/agent-adapter.d.ts +0 -35
- package/dist/adapters/agent-adapter.d.ts.map +0 -1
- package/dist/adapters/agent-adapter.js +0 -80
- package/dist/adapters/agent-adapter.js.map +0 -1
- package/dist/adapters/permission-adapter.d.ts +0 -13
- package/dist/adapters/permission-adapter.d.ts.map +0 -1
- package/dist/adapters/permission-adapter.js +0 -67
- package/dist/adapters/permission-adapter.js.map +0 -1
- package/dist/adapters/session-adapter.d.ts +0 -38
- package/dist/adapters/session-adapter.d.ts.map +0 -1
- package/dist/adapters/session-adapter.js +0 -230
- package/dist/adapters/session-adapter.js.map +0 -1
- package/dist/adapters/workspace-adapter.d.ts +0 -13
- package/dist/adapters/workspace-adapter.d.ts.map +0 -1
- package/dist/adapters/workspace-adapter.js +0 -21
- package/dist/adapters/workspace-adapter.js.map +0 -1
- package/dist/event-sequencer.d.ts +0 -23
- package/dist/event-sequencer.d.ts.map +0 -1
- package/dist/event-sequencer.js +0 -54
- package/dist/event-sequencer.js.map +0 -1
- package/dist/pairing-controller.d.ts +0 -52
- package/dist/pairing-controller.d.ts.map +0 -1
- package/dist/pairing-controller.js +0 -73
- package/dist/pairing-controller.js.map +0 -1
- package/dist/pending-approvals.d.ts +0 -14
- package/dist/pending-approvals.d.ts.map +0 -1
- package/dist/pending-approvals.js +0 -52
- package/dist/pending-approvals.js.map +0 -1
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { type EventPayload, type RemoteEventName, type RemoteMessage } from '@dsh-remote/protocol';
|
|
2
|
-
export interface ReplayResult {
|
|
3
|
-
events: RemoteMessage<EventPayload>[];
|
|
4
|
-
lastSeq: number;
|
|
5
|
-
hasMore: boolean;
|
|
6
|
-
}
|
|
7
|
-
export declare class FullResyncRequiredError extends Error {
|
|
8
|
-
readonly currentSeq: number;
|
|
9
|
-
readonly code = "FULL_RESYNC_REQUIRED";
|
|
10
|
-
constructor(currentSeq: number);
|
|
11
|
-
}
|
|
12
|
-
export declare class EventSequencer {
|
|
13
|
-
private readonly maxEvents;
|
|
14
|
-
private readonly maxAgeMs;
|
|
15
|
-
private seq;
|
|
16
|
-
private readonly events;
|
|
17
|
-
constructor(maxEvents?: number, maxAgeMs?: number);
|
|
18
|
-
currentSeq(): number;
|
|
19
|
-
publish<TData>(event: RemoteEventName, data: TData, sessionId?: string): RemoteMessage<EventPayload<TData>>;
|
|
20
|
-
replay(afterSeq: number, limit?: number): ReplayResult;
|
|
21
|
-
private trim;
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=event-sequencer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-sequencer.d.ts","sourceRoot":"","sources":["../src/event-sequencer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAE/G,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,CAAA;IACrC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAEpC,QAAQ,CAAC,UAAU,EAAE,MAAM;IADvC,QAAQ,CAAC,IAAI,0BAAyB;gBACjB,UAAU,EAAE,MAAM;CAGxC;AAED,qBAAa,cAAc;IAIb,OAAO,CAAC,QAAQ,CAAC,SAAS;IAAW,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAH1E,OAAO,CAAC,GAAG,CAAI;IACf,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;gBAE9B,SAAS,SAAS,EAAmB,QAAQ,SAAc;IAKxF,UAAU,IAAI,MAAM;IAEpB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAU3G,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAQ,GAAG,YAAY;IAYrD,OAAO,CAAC,IAAI;CAIb"}
|
package/dist/event-sequencer.js
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { createEvent } from '@dsh-remote/protocol';
|
|
2
|
-
export class FullResyncRequiredError extends Error {
|
|
3
|
-
currentSeq;
|
|
4
|
-
code = 'FULL_RESYNC_REQUIRED';
|
|
5
|
-
constructor(currentSeq) {
|
|
6
|
-
super('The requested event replay window is no longer available.');
|
|
7
|
-
this.currentSeq = currentSeq;
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
export class EventSequencer {
|
|
11
|
-
maxEvents;
|
|
12
|
-
maxAgeMs;
|
|
13
|
-
seq = 0;
|
|
14
|
-
events = [];
|
|
15
|
-
constructor(maxEvents = 10_000, maxAgeMs = 15 * 60_000) {
|
|
16
|
-
this.maxEvents = maxEvents;
|
|
17
|
-
this.maxAgeMs = maxAgeMs;
|
|
18
|
-
if (!Number.isSafeInteger(maxEvents) || maxEvents < 1)
|
|
19
|
-
throw new TypeError('maxEvents must be a positive safe integer');
|
|
20
|
-
if (!Number.isSafeInteger(maxAgeMs) || maxAgeMs < 1)
|
|
21
|
-
throw new TypeError('maxAgeMs must be a positive safe integer');
|
|
22
|
-
}
|
|
23
|
-
currentSeq() { return this.seq; }
|
|
24
|
-
publish(event, data, sessionId) {
|
|
25
|
-
const message = createEvent(event, data, {
|
|
26
|
-
seq: ++this.seq,
|
|
27
|
-
...(sessionId === undefined ? {} : { sessionId }),
|
|
28
|
-
});
|
|
29
|
-
this.events.push(message);
|
|
30
|
-
this.trim(message.timestamp);
|
|
31
|
-
return message;
|
|
32
|
-
}
|
|
33
|
-
replay(afterSeq, limit = 1_000) {
|
|
34
|
-
if (!Number.isSafeInteger(afterSeq) || afterSeq < 0)
|
|
35
|
-
throw new TypeError('afterSeq must be a non-negative safe integer');
|
|
36
|
-
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1_000)
|
|
37
|
-
throw new TypeError('limit must be between 1 and 1000');
|
|
38
|
-
this.trim(Date.now());
|
|
39
|
-
if (afterSeq >= this.seq)
|
|
40
|
-
return { events: [], lastSeq: this.seq, hasMore: false };
|
|
41
|
-
const firstSeq = this.events[0]?.payload.seq;
|
|
42
|
-
if (firstSeq === undefined || firstSeq > afterSeq + 1)
|
|
43
|
-
throw new FullResyncRequiredError(this.seq);
|
|
44
|
-
const events = this.events.filter(event => event.payload.seq > afterSeq).slice(0, limit);
|
|
45
|
-
const lastReturned = events.at(-1)?.payload.seq ?? afterSeq;
|
|
46
|
-
return { events, lastSeq: this.seq, hasMore: lastReturned < this.seq };
|
|
47
|
-
}
|
|
48
|
-
trim(now) {
|
|
49
|
-
const oldest = now - this.maxAgeMs;
|
|
50
|
-
while (this.events.length > this.maxEvents || (this.events[0]?.timestamp ?? now) < oldest)
|
|
51
|
-
this.events.shift();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=event-sequencer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-sequencer.js","sourceRoot":"","sources":["../src/event-sequencer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import type { HostIdentity, IdentityStore, TrustedPeer } from './identity-store.js';
|
|
2
|
-
export interface PairingClaim {
|
|
3
|
-
pairingId: string;
|
|
4
|
-
client: {
|
|
5
|
-
deviceId: string;
|
|
6
|
-
name: string;
|
|
7
|
-
platform: string;
|
|
8
|
-
identityKey: string;
|
|
9
|
-
fingerprint: string;
|
|
10
|
-
};
|
|
11
|
-
expiresAt: number;
|
|
12
|
-
}
|
|
13
|
-
export interface PairingServer {
|
|
14
|
-
create(identity: HostIdentity): Promise<{
|
|
15
|
-
pairingId: string;
|
|
16
|
-
code: string;
|
|
17
|
-
expiresAt: number;
|
|
18
|
-
pairUri: string;
|
|
19
|
-
}>;
|
|
20
|
-
confirm(input: {
|
|
21
|
-
pairingId: string;
|
|
22
|
-
decision: 'approve' | 'deny';
|
|
23
|
-
clientDeviceId: string;
|
|
24
|
-
clientFingerprint: string;
|
|
25
|
-
}): Promise<{
|
|
26
|
-
status: string;
|
|
27
|
-
membershipId?: string;
|
|
28
|
-
}>;
|
|
29
|
-
}
|
|
30
|
-
export declare class PairingController {
|
|
31
|
-
private readonly identities;
|
|
32
|
-
private readonly server;
|
|
33
|
-
private readonly claims;
|
|
34
|
-
private readonly offers;
|
|
35
|
-
constructor(identities: IdentityStore, server: PairingServer);
|
|
36
|
-
create(): Promise<{
|
|
37
|
-
pairingId: string;
|
|
38
|
-
code: string;
|
|
39
|
-
expiresAt: number;
|
|
40
|
-
pairUri: string;
|
|
41
|
-
}>;
|
|
42
|
-
receiveClaim(claim: Omit<PairingClaim, 'expiresAt'> & {
|
|
43
|
-
expiresAt?: number;
|
|
44
|
-
}): void;
|
|
45
|
-
pending(): PairingClaim[];
|
|
46
|
-
confirm(pairingId: string, decision: 'approve' | 'deny'): Promise<TrustedPeer | undefined>;
|
|
47
|
-
}
|
|
48
|
-
export declare class PairingError extends Error {
|
|
49
|
-
readonly code: string;
|
|
50
|
-
constructor(code: string, message: string);
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=pairing-controller.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pairing-controller.d.ts","sourceRoot":"","sources":["../src/pairing-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGnF,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,WAAW,EAAE,MAAM,CAAA;QACnB,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAChH,OAAO,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC3K;AAED,qBAAa,iBAAiB;IAIhB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAiB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAH/E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;gBAEtB,UAAU,EAAE,aAAa,EAAmB,MAAM,EAAE,aAAa;IAExF,MAAM;mBAVyC,MAAM;cAAQ,MAAM;mBAAa,MAAM;iBAAW,MAAM;;IAgB7G,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAWnF,OAAO,IAAI,YAAY,EAAE;IAMnB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;CA2BjG;AAED,qBAAa,YAAa,SAAQ,KAAK;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CACnD"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { fingerprint } from './identity-store.js';
|
|
2
|
-
export class PairingController {
|
|
3
|
-
identities;
|
|
4
|
-
server;
|
|
5
|
-
claims = new Map();
|
|
6
|
-
offers = new Map();
|
|
7
|
-
constructor(identities, server) {
|
|
8
|
-
this.identities = identities;
|
|
9
|
-
this.server = server;
|
|
10
|
-
}
|
|
11
|
-
async create() {
|
|
12
|
-
const created = await this.server.create(this.identities.current());
|
|
13
|
-
this.offers.set(created.pairingId, created.expiresAt);
|
|
14
|
-
return created;
|
|
15
|
-
}
|
|
16
|
-
receiveClaim(claim) {
|
|
17
|
-
const expiresAt = claim.expiresAt ?? this.offers.get(claim.pairingId);
|
|
18
|
-
if (expiresAt === undefined)
|
|
19
|
-
throw new PairingError('PAIRING_NOT_FOUND', 'The pairing request was not created by this Host process.');
|
|
20
|
-
const normalized = { ...claim, expiresAt };
|
|
21
|
-
if (normalized.expiresAt <= Date.now())
|
|
22
|
-
throw new PairingError('PAIRING_EXPIRED', 'The pairing request has expired.');
|
|
23
|
-
if (normalizeFingerprint(fingerprint(normalized.client.identityKey)) !== normalizeFingerprint(normalized.client.fingerprint)) {
|
|
24
|
-
throw new PairingError('PAIRING_FINGERPRINT_MISMATCH', 'The client fingerprint does not match its identity key.');
|
|
25
|
-
}
|
|
26
|
-
this.claims.set(normalized.pairingId, structuredClone(normalized));
|
|
27
|
-
}
|
|
28
|
-
pending() {
|
|
29
|
-
const now = Date.now();
|
|
30
|
-
for (const [id, claim] of this.claims)
|
|
31
|
-
if (claim.expiresAt <= now)
|
|
32
|
-
this.claims.delete(id);
|
|
33
|
-
return [...this.claims.values()].map(claim => structuredClone(claim));
|
|
34
|
-
}
|
|
35
|
-
async confirm(pairingId, decision) {
|
|
36
|
-
const claim = this.claims.get(pairingId);
|
|
37
|
-
if (claim === undefined)
|
|
38
|
-
throw new PairingError('PAIRING_NOT_FOUND', 'The pairing request is not pending.');
|
|
39
|
-
if (claim.expiresAt <= Date.now()) {
|
|
40
|
-
this.claims.delete(pairingId);
|
|
41
|
-
throw new PairingError('PAIRING_EXPIRED', 'The pairing request has expired.');
|
|
42
|
-
}
|
|
43
|
-
const result = await this.server.confirm({
|
|
44
|
-
pairingId,
|
|
45
|
-
decision,
|
|
46
|
-
clientDeviceId: claim.client.deviceId,
|
|
47
|
-
clientFingerprint: normalizeFingerprint(claim.client.fingerprint),
|
|
48
|
-
});
|
|
49
|
-
this.claims.delete(pairingId);
|
|
50
|
-
this.offers.delete(pairingId);
|
|
51
|
-
if (decision === 'deny')
|
|
52
|
-
return undefined;
|
|
53
|
-
if (result.membershipId === undefined || result.membershipId.length === 0) {
|
|
54
|
-
throw new PairingError('INVALID_MESSAGE', 'The Server did not return a membership for an approved pairing.');
|
|
55
|
-
}
|
|
56
|
-
return this.identities.trustPeer({
|
|
57
|
-
deviceId: claim.client.deviceId,
|
|
58
|
-
name: claim.client.name,
|
|
59
|
-
platform: claim.client.platform,
|
|
60
|
-
publicKey: claim.client.identityKey,
|
|
61
|
-
membershipId: result.membershipId,
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
export class PairingError extends Error {
|
|
66
|
-
code;
|
|
67
|
-
constructor(code, message) {
|
|
68
|
-
super(message);
|
|
69
|
-
this.code = code;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
function normalizeFingerprint(value) { return value.replaceAll(/\s/g, '').toUpperCase(); }
|
|
73
|
-
//# sourceMappingURL=pairing-controller.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pairing-controller.js","sourceRoot":"","sources":["../src/pairing-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { ApprovalOutcome } from '@deepseek-ai/dsh-user-approval';
|
|
2
|
-
import type { RemotePermissionRequest } from './types.js';
|
|
3
|
-
export declare class PendingApprovals {
|
|
4
|
-
private readonly timeoutMs;
|
|
5
|
-
private readonly onResolved;
|
|
6
|
-
private readonly pending;
|
|
7
|
-
constructor(timeoutMs: number, onResolved: (request: RemotePermissionRequest, outcome: ApprovalOutcome) => void);
|
|
8
|
-
open(request: RemotePermissionRequest, signal?: AbortSignal): Promise<ApprovalOutcome>;
|
|
9
|
-
respond(sessionId: string, requestId: string, decision: 'allow_once' | 'deny'): boolean;
|
|
10
|
-
snapshot(sessionId?: string): RemotePermissionRequest[];
|
|
11
|
-
failAll(outcome?: Extract<ApprovalOutcome, 'cancelled' | 'unavailable'>): void;
|
|
12
|
-
private settle;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=pending-approvals.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pending-approvals.d.ts","sourceRoot":"","sources":["../src/pending-approvals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AACrE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AASzD,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJ7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;gBAGvC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,CAAC,OAAO,EAAE,uBAAuB,EAAE,OAAO,EAAE,eAAe,KAAK,IAAI;IAGnG,IAAI,CAAC,OAAO,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAetF,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,OAAO;IAMvF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,uBAAuB,EAAE;IAMvD,OAAO,CAAC,OAAO,GAAE,OAAO,CAAC,eAAe,EAAE,WAAW,GAAG,aAAa,CAAiB,GAAG,IAAI;IAI7F,OAAO,CAAC,MAAM;CAUf"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
export class PendingApprovals {
|
|
2
|
-
timeoutMs;
|
|
3
|
-
onResolved;
|
|
4
|
-
pending = new Map();
|
|
5
|
-
constructor(timeoutMs, onResolved) {
|
|
6
|
-
this.timeoutMs = timeoutMs;
|
|
7
|
-
this.onResolved = onResolved;
|
|
8
|
-
}
|
|
9
|
-
open(request, signal) {
|
|
10
|
-
if (this.pending.has(request.requestId))
|
|
11
|
-
throw new Error(`approval ${request.requestId} is already pending`);
|
|
12
|
-
if (signal?.aborted)
|
|
13
|
-
return Promise.resolve('cancelled');
|
|
14
|
-
return new Promise((resolve) => {
|
|
15
|
-
const timer = setTimeout(() => this.settle(request.requestId, 'unavailable'), this.timeoutMs);
|
|
16
|
-
const entry = { request, resolve, timer };
|
|
17
|
-
if (signal !== undefined) {
|
|
18
|
-
const onAbort = () => this.settle(request.requestId, 'cancelled');
|
|
19
|
-
signal.addEventListener('abort', onAbort, { once: true });
|
|
20
|
-
entry.detachAbort = () => signal.removeEventListener('abort', onAbort);
|
|
21
|
-
}
|
|
22
|
-
this.pending.set(request.requestId, entry);
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
respond(sessionId, requestId, decision) {
|
|
26
|
-
const entry = this.pending.get(requestId);
|
|
27
|
-
if (entry === undefined || entry.request.sessionId !== sessionId)
|
|
28
|
-
return false;
|
|
29
|
-
return this.settle(requestId, decision === 'allow_once' ? 'allowed-once' : 'rejected');
|
|
30
|
-
}
|
|
31
|
-
snapshot(sessionId) {
|
|
32
|
-
return [...this.pending.values()]
|
|
33
|
-
.filter(entry => sessionId === undefined || entry.request.sessionId === sessionId)
|
|
34
|
-
.map(entry => structuredClone(entry.request));
|
|
35
|
-
}
|
|
36
|
-
failAll(outcome = 'unavailable') {
|
|
37
|
-
for (const requestId of [...this.pending.keys()])
|
|
38
|
-
this.settle(requestId, outcome);
|
|
39
|
-
}
|
|
40
|
-
settle(requestId, outcome) {
|
|
41
|
-
const entry = this.pending.get(requestId);
|
|
42
|
-
if (entry === undefined)
|
|
43
|
-
return false;
|
|
44
|
-
this.pending.delete(requestId);
|
|
45
|
-
clearTimeout(entry.timer);
|
|
46
|
-
entry.detachAbort?.();
|
|
47
|
-
entry.resolve(outcome);
|
|
48
|
-
this.onResolved(entry.request, outcome);
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=pending-approvals.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pending-approvals.js","sourceRoot":"","sources":["../src/pending-approvals.ts"],"names":[],"mappings":"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"}
|