@kya-os/mcp-i-cloudflare 1.12.4 → 1.13.2
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 -1
- package/dist/agent.d.ts +1 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +23 -24
- package/dist/agent.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +10 -5
- package/dist/app.js.map +1 -1
- package/dist/audit/assurance.d.ts +12 -0
- package/dist/audit/assurance.d.ts.map +1 -0
- package/dist/audit/assurance.js +21 -0
- package/dist/audit/assurance.js.map +1 -0
- package/dist/audit/deployment-binding.d.ts +513 -0
- package/dist/audit/deployment-binding.d.ts.map +1 -0
- package/dist/audit/deployment-binding.js +364 -0
- package/dist/audit/deployment-binding.js.map +1 -0
- package/dist/audit/durable-producer.d.ts +151 -0
- package/dist/audit/durable-producer.d.ts.map +1 -0
- package/dist/audit/durable-producer.js +953 -0
- package/dist/audit/durable-producer.js.map +1 -0
- package/dist/audit/verified-recorder-client.d.ts +34 -0
- package/dist/audit/verified-recorder-client.d.ts.map +1 -0
- package/dist/audit/verified-recorder-client.js +192 -0
- package/dist/audit/verified-recorder-client.js.map +1 -0
- package/dist/config.d.ts +4 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/delegation-http/pickup-routes.d.ts.map +1 -1
- package/dist/delegation-http/pickup-routes.js +36 -3
- package/dist/delegation-http/pickup-routes.js.map +1 -1
- package/dist/delegation-http/well-known-capability.d.ts +2 -1
- package/dist/delegation-http/well-known-capability.d.ts.map +1 -1
- package/dist/delegation-http/well-known-capability.js +2 -1
- package/dist/delegation-http/well-known-capability.js.map +1 -1
- package/dist/helpers/env-mapper.d.ts.map +1 -1
- package/dist/helpers/env-mapper.js +31 -0
- package/dist/helpers/env-mapper.js.map +1 -1
- package/dist/index.d.ts +8 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/dist/runtime/invoke-tool-handler.d.ts +10 -0
- package/dist/runtime/invoke-tool-handler.d.ts.map +1 -0
- package/dist/runtime/invoke-tool-handler.js +11 -0
- package/dist/runtime/invoke-tool-handler.js.map +1 -0
- package/dist/runtime/oauth-handler.d.ts.map +1 -1
- package/dist/runtime/oauth-handler.js +12 -1
- package/dist/runtime/oauth-handler.js.map +1 -1
- package/dist/runtime/oidc/idp-scopes.d.ts +26 -0
- package/dist/runtime/oidc/idp-scopes.d.ts.map +1 -0
- package/dist/runtime/oidc/idp-scopes.js +24 -0
- package/dist/runtime/oidc/idp-scopes.js.map +1 -0
- package/dist/runtime.d.ts +1 -6
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +72 -72
- package/dist/runtime.js.map +1 -1
- package/dist/services/batch-queue.d.ts +103 -0
- package/dist/services/batch-queue.d.ts.map +1 -0
- package/dist/services/batch-queue.js +180 -0
- package/dist/services/batch-queue.js.map +1 -0
- package/dist/services/consent-audit.service.d.ts +3 -10
- package/dist/services/consent-audit.service.d.ts.map +1 -1
- package/dist/services/consent-audit.service.js +44 -77
- package/dist/services/consent-audit.service.js.map +1 -1
- package/dist/services/consent.service.d.ts +7 -0
- package/dist/services/consent.service.d.ts.map +1 -1
- package/dist/services/consent.service.js +122 -69
- package/dist/services/consent.service.js.map +1 -1
- package/dist/services/kya-os-events.service.d.ts +131 -0
- package/dist/services/kya-os-events.service.d.ts.map +1 -0
- package/dist/services/kya-os-events.service.js +135 -0
- package/dist/services/kya-os-events.service.js.map +1 -0
- package/dist/services/proof-batch-queue.d.ts +15 -67
- package/dist/services/proof-batch-queue.d.ts.map +1 -1
- package/dist/services/proof-batch-queue.js +12 -147
- package/dist/services/proof-batch-queue.js.map +1 -1
- package/dist/services/proof.service.d.ts +7 -0
- package/dist/services/proof.service.d.ts.map +1 -1
- package/dist/services/proof.service.js +55 -4
- package/dist/services/proof.service.js.map +1 -1
- package/dist/services/vault-resolver.d.ts +0 -8
- package/dist/services/vault-resolver.d.ts.map +1 -1
- package/dist/services/vault-resolver.js +0 -22
- package/dist/services/vault-resolver.js.map +1 -1
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -6
- package/dist/runtime/audit-logger.d.ts +0 -96
- package/dist/runtime/audit-logger.d.ts.map +0 -1
- package/dist/runtime/audit-logger.js +0 -276
- package/dist/runtime/audit-logger.js.map +0 -1
package/dist/runtime.js
CHANGED
|
@@ -12,15 +12,14 @@ import { MCPIRuntimeBase, ToolProtectionService, } from "@kya-os/mcp-i-runtime";
|
|
|
12
12
|
import { CloudflareProofGenerator } from "./proof-generator";
|
|
13
13
|
import { KVToolProtectionCache, } from "./cache/kv-tool-protection-cache";
|
|
14
14
|
import { ProofService } from "./services/proof.service";
|
|
15
|
-
import { CloudflareAuditLogger } from "./runtime/audit-logger";
|
|
16
15
|
export class CloudflareRuntime extends MCPIRuntimeBase {
|
|
17
16
|
proofGenerator;
|
|
18
17
|
lastDetachedProof;
|
|
19
18
|
lastToolCallContext;
|
|
19
|
+
proofByInvocation = new Map();
|
|
20
20
|
serverUrl; // Store server URL for consent URL building
|
|
21
21
|
proofService; // Proof submission service
|
|
22
22
|
// accessControlService is inherited from MCPIRuntimeBase (protected), no need to redeclare
|
|
23
|
-
auditLogger; // Audit logger instance
|
|
24
23
|
// proofVerifier is inherited from MCPIRuntimeBase (protected), no need to redeclare
|
|
25
24
|
/**
|
|
26
25
|
* Store pending proof submission promises for Cloudflare waitUntil()
|
|
@@ -54,12 +53,6 @@ export class CloudflareRuntime extends MCPIRuntimeBase {
|
|
|
54
53
|
// Protected members are accessible from subclasses in TypeScript
|
|
55
54
|
this.proofVerifier = verifier;
|
|
56
55
|
}
|
|
57
|
-
/**
|
|
58
|
-
* Get audit logger instance
|
|
59
|
-
*/
|
|
60
|
-
getAuditLogger() {
|
|
61
|
-
return this.auditLogger;
|
|
62
|
-
}
|
|
63
56
|
/**
|
|
64
57
|
* Get identity - uses cached identity from base class for performance
|
|
65
58
|
* The base class caches identity during initialize() to avoid repeated provider calls
|
|
@@ -72,21 +65,10 @@ export class CloudflareRuntime extends MCPIRuntimeBase {
|
|
|
72
65
|
*/
|
|
73
66
|
async initialize() {
|
|
74
67
|
await super.initialize();
|
|
75
|
-
// Initialize CloudflareAuditLogger if audit is enabled
|
|
76
|
-
// Uses Web Crypto API instead of Node.js crypto for Cloudflare Workers compatibility
|
|
77
|
-
if (this.config.audit?.enabled) {
|
|
78
|
-
this.auditLogger = new CloudflareAuditLogger({
|
|
79
|
-
enabled: true,
|
|
80
|
-
logFunction: this.config.audit.logFunction || console.log,
|
|
81
|
-
includePayloads: false,
|
|
82
|
-
// rotation is optional and may not be in the config type
|
|
83
|
-
rotation: this.config.audit.rotation,
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
68
|
// Initialize CloudflareProofGenerator with identity
|
|
87
69
|
const identity = await this.getIdentity();
|
|
88
70
|
this.proofGenerator = new CloudflareProofGenerator(identity);
|
|
89
|
-
if (this.config.
|
|
71
|
+
if (this.config.environment === "development") {
|
|
90
72
|
console.error("[MCP-I] CloudflareRuntime initialized with CloudflareProofGenerator");
|
|
91
73
|
console.error("[MCP-I] DID:", identity.did);
|
|
92
74
|
}
|
|
@@ -140,7 +122,7 @@ export class CloudflareRuntime extends MCPIRuntimeBase {
|
|
|
140
122
|
else if (session?.toolName) {
|
|
141
123
|
scopeId = `${session.toolName}:execute`;
|
|
142
124
|
}
|
|
143
|
-
if (this.config.
|
|
125
|
+
if (this.config.environment === "development" && scopeId) {
|
|
144
126
|
console.error(`[MCP-I] Proof scopeId for tool "${session.toolName}": ${scopeId}`);
|
|
145
127
|
}
|
|
146
128
|
// ✅ Generate full JWS proof WITH scopeId using CloudflareProofGenerator
|
|
@@ -148,8 +130,16 @@ export class CloudflareRuntime extends MCPIRuntimeBase {
|
|
|
148
130
|
scopeId, // ← ADDED: Pass scopeId for tool auto-discovery
|
|
149
131
|
clientDid: session.clientDid, // ← ADDED: Pass clientDid from session
|
|
150
132
|
});
|
|
151
|
-
//
|
|
133
|
+
// Keep the legacy latest-value accessor for compatibility, but route the
|
|
134
|
+
// active request through an invocation-keyed map so concurrent calls never
|
|
135
|
+
// submit or attach another request's proof.
|
|
152
136
|
this.lastDetachedProof = detachedProof;
|
|
137
|
+
const auditInvocationId = typeof session.auditInvocationId === "string"
|
|
138
|
+
? session.auditInvocationId
|
|
139
|
+
: undefined;
|
|
140
|
+
if (auditInvocationId) {
|
|
141
|
+
this.proofByInvocation.set(auditInvocationId, detachedProof);
|
|
142
|
+
}
|
|
153
143
|
// ✅ Store tool call context for AgentShield dashboard
|
|
154
144
|
this.lastToolCallContext = {
|
|
155
145
|
tool: session.toolName || "unknown",
|
|
@@ -158,7 +148,7 @@ export class CloudflareRuntime extends MCPIRuntimeBase {
|
|
|
158
148
|
scopeId: scopeId || "unknown",
|
|
159
149
|
userId: session.userId, // Optional user identifier
|
|
160
150
|
};
|
|
161
|
-
if (this.config.
|
|
151
|
+
if (this.config.environment === "development") {
|
|
162
152
|
console.error("[MCP-I] Proof generated:", {
|
|
163
153
|
did: detachedProof.meta.did,
|
|
164
154
|
sessionId: detachedProof.meta.sessionId,
|
|
@@ -184,6 +174,9 @@ export class CloudflareRuntime extends MCPIRuntimeBase {
|
|
|
184
174
|
* Note: Creates a new session object to avoid mutating the input session.
|
|
185
175
|
*/
|
|
186
176
|
async processToolCall(toolName, args, handler, session) {
|
|
177
|
+
const invocationId = typeof session?.auditInvocationId === "string"
|
|
178
|
+
? session.auditInvocationId
|
|
179
|
+
: crypto.randomUUID();
|
|
187
180
|
// Enhance session with tool metadata for proof generation
|
|
188
181
|
// Create a new session object to avoid mutating the input (immutability contract)
|
|
189
182
|
const enhancedSession = session
|
|
@@ -191,62 +184,69 @@ export class CloudflareRuntime extends MCPIRuntimeBase {
|
|
|
191
184
|
...session,
|
|
192
185
|
toolName,
|
|
193
186
|
toolParams: args,
|
|
187
|
+
auditInvocationId: invocationId,
|
|
194
188
|
}
|
|
195
189
|
: undefined;
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
190
|
+
try {
|
|
191
|
+
// Call parent implementation with enhanced session (generates proof)
|
|
192
|
+
const result = await super.processToolCall(toolName, args, handler, enhancedSession);
|
|
193
|
+
// Resolve only the proof created for this invocation. `lastDetachedProof`
|
|
194
|
+
// is retained solely as a legacy observational accessor.
|
|
195
|
+
const proof = this.proofByInvocation.get(invocationId);
|
|
196
|
+
// Automatically submit proof to AgentShield if available
|
|
197
|
+
// CRITICAL FIX: Await the proof submission directly instead of using ctx.waitUntil()
|
|
198
|
+
// In Durable Objects (McpAgent), ctx.waitUntil() doesn't reliably extend lifetime,
|
|
199
|
+
// causing proof submissions to be cancelled before completion.
|
|
200
|
+
if (proof && this.proofService && enhancedSession) {
|
|
201
|
+
try {
|
|
202
|
+
// Determine MCP server URL from session or stored serverUrl
|
|
203
|
+
// Ensure URL has protocol (https://) for AgentShield tool discovery
|
|
204
|
+
let mcpServerUrl = enhancedSession.serverOrigin || this.serverUrl;
|
|
205
|
+
if (mcpServerUrl &&
|
|
206
|
+
!mcpServerUrl.startsWith("http://") &&
|
|
207
|
+
!mcpServerUrl.startsWith("https://")) {
|
|
208
|
+
// Auto-add https:// if protocol missing
|
|
209
|
+
mcpServerUrl = `https://${mcpServerUrl}`;
|
|
210
|
+
}
|
|
211
|
+
// Submit proof synchronously (await to ensure completion)
|
|
212
|
+
// This adds ~200-400ms latency but guarantees proof submission
|
|
213
|
+
console.error("[CloudflareRuntime] Submitting proof synchronously...");
|
|
214
|
+
await this.proofService.submitProof(proof, {
|
|
215
|
+
session: {
|
|
216
|
+
id: enhancedSession.id || "unknown",
|
|
217
|
+
delegationId: enhancedSession.delegationId,
|
|
218
|
+
},
|
|
219
|
+
toolName,
|
|
220
|
+
args,
|
|
221
|
+
result,
|
|
222
|
+
mcpServerUrl,
|
|
223
|
+
});
|
|
224
|
+
console.error("[CloudflareRuntime] ✅ Proof submission completed");
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
// Log error but don't fail the tool execution
|
|
228
|
+
console.error("[CloudflareRuntime] Failed to submit proof:", error);
|
|
214
229
|
}
|
|
215
|
-
// Submit proof synchronously (await to ensure completion)
|
|
216
|
-
// This adds ~200-400ms latency but guarantees proof submission
|
|
217
|
-
console.error("[CloudflareRuntime] Submitting proof synchronously...");
|
|
218
|
-
await this.proofService.submitProof(proof, {
|
|
219
|
-
session: {
|
|
220
|
-
id: enhancedSession.id || "unknown",
|
|
221
|
-
delegationId: enhancedSession.delegationId,
|
|
222
|
-
},
|
|
223
|
-
toolName,
|
|
224
|
-
args,
|
|
225
|
-
result,
|
|
226
|
-
mcpServerUrl,
|
|
227
|
-
});
|
|
228
|
-
console.error("[CloudflareRuntime] ✅ Proof submission completed");
|
|
229
230
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
231
|
+
// Attach proof to result for MCP Inspector (if result is an object)
|
|
232
|
+
if (proof &&
|
|
233
|
+
result &&
|
|
234
|
+
typeof result === "object" &&
|
|
235
|
+
!Array.isArray(result)) {
|
|
236
|
+
// Attach proof to _meta field for MCP Inspector compatibility
|
|
237
|
+
if (!result._meta) {
|
|
238
|
+
result._meta = {};
|
|
239
|
+
}
|
|
240
|
+
result._meta.proof = {
|
|
241
|
+
jws: proof.jws,
|
|
242
|
+
meta: proof.meta,
|
|
243
|
+
};
|
|
233
244
|
}
|
|
245
|
+
return result;
|
|
234
246
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
result &&
|
|
238
|
-
typeof result === "object" &&
|
|
239
|
-
!Array.isArray(result)) {
|
|
240
|
-
// Attach proof to _meta field for MCP Inspector compatibility
|
|
241
|
-
if (!result._meta) {
|
|
242
|
-
result._meta = {};
|
|
243
|
-
}
|
|
244
|
-
result._meta.proof = {
|
|
245
|
-
jws: proof.jws,
|
|
246
|
-
meta: proof.meta,
|
|
247
|
-
};
|
|
247
|
+
finally {
|
|
248
|
+
this.proofByInvocation.delete(invocationId);
|
|
248
249
|
}
|
|
249
|
-
return result;
|
|
250
250
|
}
|
|
251
251
|
/**
|
|
252
252
|
* Get the CloudflareProofGenerator instance (for advanced usage)
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,eAAe,EAEf,qBAAqB,GAItB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EACL,qBAAqB,GAEtB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic Batch Queue (Cloudflare Workers Implementation)
|
|
3
|
+
*
|
|
4
|
+
* Platform-agnostic, type-generic batching for Cloudflare Workers. Collects
|
|
5
|
+
* items in memory and submits them in batches to one or more destinations,
|
|
6
|
+
* without blocking request handling.
|
|
7
|
+
*
|
|
8
|
+
* This is the shared engine behind both the proof batch queue
|
|
9
|
+
* (`proof-batch-queue.ts`) and the KYA-OS activity events emitter
|
|
10
|
+
* (`kya-os-events.service.ts`) so the batching, retry, and flush semantics
|
|
11
|
+
* live in exactly one place.
|
|
12
|
+
*
|
|
13
|
+
* Performance:
|
|
14
|
+
* - Batch size: 10 items (configurable)
|
|
15
|
+
* - Fire-and-forget submission (does not block the caller)
|
|
16
|
+
*
|
|
17
|
+
* Retry Strategy:
|
|
18
|
+
* - Exponential backoff: 1s, 2s, 4s, 8s, 16s
|
|
19
|
+
* - Max retries: 5 (configurable)
|
|
20
|
+
* - Failed items logged and dropped after max retries
|
|
21
|
+
*
|
|
22
|
+
* Note: In Cloudflare Workers, timers do not persist across requests, so
|
|
23
|
+
* automatic flush timers are disabled. Flush is driven by two triggers:
|
|
24
|
+
* within a request when the batch size is reached, and across requests via
|
|
25
|
+
* a scheduled (cron) `flush()` call.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* A batch submission destination.
|
|
29
|
+
*/
|
|
30
|
+
export interface BatchDestination<T> {
|
|
31
|
+
/** Destination name (for logging). */
|
|
32
|
+
name: string;
|
|
33
|
+
/** Submit a batch of items. Must reject on failure so the queue can retry. */
|
|
34
|
+
submit(items: T[]): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Batch queue configuration.
|
|
38
|
+
*/
|
|
39
|
+
export interface BatchQueueConfig<T> {
|
|
40
|
+
/** Destinations to submit items to. */
|
|
41
|
+
destinations: BatchDestination<T>[];
|
|
42
|
+
/** Maximum batch size before auto-flush. */
|
|
43
|
+
maxBatchSize?: number;
|
|
44
|
+
/** Flush interval in milliseconds (unused in Cloudflare Workers - rely on cron). */
|
|
45
|
+
flushIntervalMs?: number;
|
|
46
|
+
/** Maximum retry attempts for failed batches. */
|
|
47
|
+
maxRetries?: number;
|
|
48
|
+
/** Enable debug logging. */
|
|
49
|
+
debug?: boolean;
|
|
50
|
+
/** Log prefix, e.g. "ProofBatchQueue". Defaults to "BatchQueue". */
|
|
51
|
+
logPrefix?: string;
|
|
52
|
+
/** Singular noun for log messages, e.g. "proof". Defaults to "item". */
|
|
53
|
+
noun?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Generic Batch Queue.
|
|
57
|
+
*
|
|
58
|
+
* Collects items and submits them in batches to multiple destinations.
|
|
59
|
+
*
|
|
60
|
+
* Note: In Cloudflare Workers, timers don't persist across requests, so
|
|
61
|
+
* automatic flush timers are disabled. Use manual `flush()` calls via cron.
|
|
62
|
+
*/
|
|
63
|
+
export declare class BatchQueue<T> {
|
|
64
|
+
private queue;
|
|
65
|
+
private pendingBatches;
|
|
66
|
+
private config;
|
|
67
|
+
private closed;
|
|
68
|
+
private stats;
|
|
69
|
+
constructor(config: BatchQueueConfig<T>);
|
|
70
|
+
/** The log prefix, e.g. "[ProofBatchQueue]". */
|
|
71
|
+
private get tag();
|
|
72
|
+
/**
|
|
73
|
+
* Add an item to the queue.
|
|
74
|
+
*/
|
|
75
|
+
enqueue(item: T): void;
|
|
76
|
+
/**
|
|
77
|
+
* Flush queue immediately (submit all queued items).
|
|
78
|
+
*/
|
|
79
|
+
flush(): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Submit a batch to a destination (with retries).
|
|
82
|
+
*/
|
|
83
|
+
private submitBatch;
|
|
84
|
+
/**
|
|
85
|
+
* Retry pending batches that are ready.
|
|
86
|
+
* Called by cron job or manually.
|
|
87
|
+
*/
|
|
88
|
+
retryPending(): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Close queue and flush remaining items.
|
|
91
|
+
*/
|
|
92
|
+
close(): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Get queue statistics.
|
|
95
|
+
*/
|
|
96
|
+
getStats(): {
|
|
97
|
+
queued: number;
|
|
98
|
+
submitted: number;
|
|
99
|
+
failed: number;
|
|
100
|
+
batchesSubmitted: number;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=batch-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-queue.d.ts","sourceRoot":"","sources":["../../src/services/batch-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IAEb,8EAA8E;IAC9E,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,uCAAuC;IACvC,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AASD;;;;;;;GAOG;AACH,qBAAa,UAAU,CAAC,CAAC;IACvB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,KAAK,CAKX;gBAEU,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAevC,gDAAgD;IAChD,OAAO,KAAK,GAAG,GAEd;IAED;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAqBtB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB5B;;OAEG;YACW,WAAW;IA4CzB;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B5B;;OAEG;IACH,QAAQ;;;;;;CAGT"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic Batch Queue (Cloudflare Workers Implementation)
|
|
3
|
+
*
|
|
4
|
+
* Platform-agnostic, type-generic batching for Cloudflare Workers. Collects
|
|
5
|
+
* items in memory and submits them in batches to one or more destinations,
|
|
6
|
+
* without blocking request handling.
|
|
7
|
+
*
|
|
8
|
+
* This is the shared engine behind both the proof batch queue
|
|
9
|
+
* (`proof-batch-queue.ts`) and the KYA-OS activity events emitter
|
|
10
|
+
* (`kya-os-events.service.ts`) so the batching, retry, and flush semantics
|
|
11
|
+
* live in exactly one place.
|
|
12
|
+
*
|
|
13
|
+
* Performance:
|
|
14
|
+
* - Batch size: 10 items (configurable)
|
|
15
|
+
* - Fire-and-forget submission (does not block the caller)
|
|
16
|
+
*
|
|
17
|
+
* Retry Strategy:
|
|
18
|
+
* - Exponential backoff: 1s, 2s, 4s, 8s, 16s
|
|
19
|
+
* - Max retries: 5 (configurable)
|
|
20
|
+
* - Failed items logged and dropped after max retries
|
|
21
|
+
*
|
|
22
|
+
* Note: In Cloudflare Workers, timers do not persist across requests, so
|
|
23
|
+
* automatic flush timers are disabled. Flush is driven by two triggers:
|
|
24
|
+
* within a request when the batch size is reached, and across requests via
|
|
25
|
+
* a scheduled (cron) `flush()` call.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Generic Batch Queue.
|
|
29
|
+
*
|
|
30
|
+
* Collects items and submits them in batches to multiple destinations.
|
|
31
|
+
*
|
|
32
|
+
* Note: In Cloudflare Workers, timers don't persist across requests, so
|
|
33
|
+
* automatic flush timers are disabled. Use manual `flush()` calls via cron.
|
|
34
|
+
*/
|
|
35
|
+
export class BatchQueue {
|
|
36
|
+
queue = [];
|
|
37
|
+
pendingBatches = [];
|
|
38
|
+
config;
|
|
39
|
+
closed = false;
|
|
40
|
+
// Stats
|
|
41
|
+
stats = {
|
|
42
|
+
queued: 0,
|
|
43
|
+
submitted: 0,
|
|
44
|
+
failed: 0,
|
|
45
|
+
batchesSubmitted: 0,
|
|
46
|
+
};
|
|
47
|
+
constructor(config) {
|
|
48
|
+
this.config = {
|
|
49
|
+
destinations: config.destinations,
|
|
50
|
+
maxBatchSize: config.maxBatchSize || 10,
|
|
51
|
+
flushIntervalMs: config.flushIntervalMs || 5000,
|
|
52
|
+
maxRetries: config.maxRetries || 5,
|
|
53
|
+
debug: config.debug || false,
|
|
54
|
+
logPrefix: config.logPrefix || "BatchQueue",
|
|
55
|
+
noun: config.noun || "item",
|
|
56
|
+
};
|
|
57
|
+
// Note: Timers are disabled in Cloudflare Workers.
|
|
58
|
+
// Flush must be called manually via cron jobs.
|
|
59
|
+
}
|
|
60
|
+
/** The log prefix, e.g. "[ProofBatchQueue]". */
|
|
61
|
+
get tag() {
|
|
62
|
+
return `[${this.config.logPrefix}]`;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Add an item to the queue.
|
|
66
|
+
*/
|
|
67
|
+
enqueue(item) {
|
|
68
|
+
if (this.closed) {
|
|
69
|
+
console.warn(`${this.tag} Queue is closed, dropping ${this.config.noun}`);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this.queue.push(item);
|
|
73
|
+
this.stats.queued++;
|
|
74
|
+
if (this.config.debug) {
|
|
75
|
+
console.error(`${this.tag} Enqueued ${this.config.noun} (queue size: ${this.queue.length})`);
|
|
76
|
+
}
|
|
77
|
+
// Flush immediately if batch size reached (Cloudflare Workers compatible)
|
|
78
|
+
if (this.queue.length >= this.config.maxBatchSize) {
|
|
79
|
+
this.flush();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Flush queue immediately (submit all queued items).
|
|
84
|
+
*/
|
|
85
|
+
async flush() {
|
|
86
|
+
if (this.queue.length === 0) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const items = this.queue.splice(0, this.config.maxBatchSize);
|
|
90
|
+
if (this.config.debug) {
|
|
91
|
+
console.error(`${this.tag} Flushing ${items.length} ${this.config.noun}s to ${this.config.destinations.length} destinations`);
|
|
92
|
+
}
|
|
93
|
+
// Submit to all destinations
|
|
94
|
+
for (const destination of this.config.destinations) {
|
|
95
|
+
const batch = {
|
|
96
|
+
items: [...items], // Copy items for each destination
|
|
97
|
+
destination,
|
|
98
|
+
retryCount: 0,
|
|
99
|
+
};
|
|
100
|
+
this.submitBatch(batch); // Fire-and-forget
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Submit a batch to a destination (with retries).
|
|
105
|
+
*/
|
|
106
|
+
async submitBatch(batch) {
|
|
107
|
+
try {
|
|
108
|
+
await batch.destination.submit(batch.items);
|
|
109
|
+
this.stats.submitted += batch.items.length;
|
|
110
|
+
this.stats.batchesSubmitted++;
|
|
111
|
+
if (this.config.debug) {
|
|
112
|
+
console.error(`${this.tag} Successfully submitted ${batch.items.length} ${this.config.noun}s to ${batch.destination.name}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.error(`${this.tag} Failed to submit to ${batch.destination.name}:`, error);
|
|
117
|
+
// Retry with exponential backoff
|
|
118
|
+
if (batch.retryCount < this.config.maxRetries) {
|
|
119
|
+
batch.retryCount++;
|
|
120
|
+
const backoffMs = Math.min(1000 * Math.pow(2, batch.retryCount - 1), 16000);
|
|
121
|
+
batch.nextRetryAt = Date.now() + backoffMs;
|
|
122
|
+
this.pendingBatches.push(batch);
|
|
123
|
+
if (this.config.debug) {
|
|
124
|
+
console.error(`${this.tag} Scheduling retry ${batch.retryCount}/${this.config.maxRetries} in ${backoffMs}ms`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// Max retries exceeded, drop batch
|
|
129
|
+
this.stats.failed += batch.items.length;
|
|
130
|
+
console.error(`${this.tag} Max retries exceeded for ${batch.destination.name}, dropping ${batch.items.length} ${this.config.noun}s`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Retry pending batches that are ready.
|
|
136
|
+
* Called by cron job or manually.
|
|
137
|
+
*/
|
|
138
|
+
async retryPending() {
|
|
139
|
+
const now = Date.now();
|
|
140
|
+
const retryBatches = this.pendingBatches.filter((batch) => batch.nextRetryAt && batch.nextRetryAt <= now);
|
|
141
|
+
if (retryBatches.length > 0) {
|
|
142
|
+
// Remove from pending
|
|
143
|
+
this.pendingBatches = this.pendingBatches.filter((batch) => !retryBatches.includes(batch));
|
|
144
|
+
// Retry each batch
|
|
145
|
+
for (const batch of retryBatches) {
|
|
146
|
+
this.submitBatch(batch); // Fire-and-forget
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Close queue and flush remaining items.
|
|
152
|
+
*/
|
|
153
|
+
async close() {
|
|
154
|
+
if (this.closed) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
this.closed = true;
|
|
158
|
+
// Flush remaining items
|
|
159
|
+
if (this.queue.length > 0) {
|
|
160
|
+
await this.flush();
|
|
161
|
+
}
|
|
162
|
+
// Wait for pending batches (with timeout)
|
|
163
|
+
const timeout = 5000; // 5 seconds
|
|
164
|
+
const startTime = Date.now();
|
|
165
|
+
while (this.pendingBatches.length > 0 && Date.now() - startTime < timeout) {
|
|
166
|
+
await this.retryPending();
|
|
167
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
168
|
+
}
|
|
169
|
+
if (this.pendingBatches.length > 0) {
|
|
170
|
+
console.warn(`${this.tag} Closing with ${this.pendingBatches.length} pending batches (timed out)`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get queue statistics.
|
|
175
|
+
*/
|
|
176
|
+
getStats() {
|
|
177
|
+
return { ...this.stats };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=batch-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-queue.js","sourceRoot":"","sources":["../../src/services/batch-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAwCH;;;;;;;GAOG;AACH,MAAM,OAAO,UAAU;IACb,KAAK,GAAQ,EAAE,CAAC;IAChB,cAAc,GAAe,EAAE,CAAC;IAChC,MAAM,CAAgC;IACtC,MAAM,GAAG,KAAK,CAAC;IAEvB,QAAQ;IACA,KAAK,GAAG;QACd,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC;QACT,gBAAgB,EAAE,CAAC;KACpB,CAAC;IAEF,YAAY,MAA2B;QACrC,IAAI,CAAC,MAAM,GAAG;YACZ,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;YACvC,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI;YAC/C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YAClC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;YAC5B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,YAAY;YAC3C,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM;SAC5B,CAAC;QAEF,mDAAmD;QACnD,+CAA+C;IACjD,CAAC;IAED,gDAAgD;IAChD,IAAY,GAAG;QACb,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAO;QACb,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,8BAA8B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAEpB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CACX,GAAG,IAAI,CAAC,GAAG,aAAa,IAAI,CAAC,MAAM,CAAC,IAAI,iBAAiB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAC9E,CAAC;QACJ,CAAC;QAED,0EAA0E;QAC1E,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAClD,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAE7D,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CACX,GAAG,IAAI,CAAC,GAAG,aAAa,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,eAAe,CAC/G,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACnD,MAAM,KAAK,GAAa;gBACtB,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,kCAAkC;gBACrD,WAAW;gBACX,UAAU,EAAE,CAAC;aACd,CAAC;YAEF,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CAAC,KAAe;QACvC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAE5C,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAE9B,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CACX,GAAG,IAAI,CAAC,GAAG,2BAA2B,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,QAAQ,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAC7G,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,GAAG,IAAI,CAAC,GAAG,wBAAwB,KAAK,CAAC,WAAW,CAAC,IAAI,GAAG,EAC5D,KAAK,CACN,CAAC;YAEF,iCAAiC;YACjC,IAAI,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC9C,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,EACxC,KAAK,CACN,CAAC;gBACF,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAE3C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEhC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,KAAK,CACX,GAAG,IAAI,CAAC,GAAG,qBAAqB,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,OAAO,SAAS,IAAI,CAC/F,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,mCAAmC;gBACnC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;gBACxC,OAAO,CAAC,KAAK,CACX,GAAG,IAAI,CAAC,GAAG,6BAA6B,KAAK,CAAC,WAAW,CAAC,IAAI,cAAc,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CACtH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,IAAI,GAAG,CACzD,CAAC;QAEF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,sBAAsB;YACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAC9C,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CACzC,CAAC;YAEF,mBAAmB;YACnB,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;gBACjC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,wBAAwB;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAED,0CAA0C;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,YAAY;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;YAC1E,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CACV,GAAG,IAAI,CAAC,GAAG,iBAAiB,IAAI,CAAC,cAAc,CAAC,MAAM,8BAA8B,CACrF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -1,27 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Consent Audit Service
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Coordinates two independent consent lifecycle outputs:
|
|
5
|
+
* canonical audit trail events and proof submission.
|
|
6
6
|
*/
|
|
7
7
|
import type { ProofService } from "./proof.service";
|
|
8
|
-
import type { IAuditLogger } from "@kya-os/mcp-i-runtime/runtime/audit-logger";
|
|
9
8
|
import { CloudflareProofGenerator } from "../proof-generator";
|
|
10
9
|
import type { CloudflareRuntimeConfig } from "../config";
|
|
11
10
|
import type { CloudflareRuntime } from "../runtime";
|
|
12
11
|
export declare class ConsentAuditService {
|
|
13
12
|
private proofService;
|
|
14
|
-
private auditLogger;
|
|
15
13
|
private proofGenerator;
|
|
16
14
|
private config;
|
|
17
15
|
private runtime;
|
|
18
16
|
private logger;
|
|
19
|
-
constructor(proofService: ProofService,
|
|
20
|
-
/**
|
|
21
|
-
* Create a minimal SessionContext for audit logging
|
|
22
|
-
* Only sessionId and audience are used by logEvent, but TypeScript requires full SessionContext
|
|
23
|
-
*/
|
|
24
|
-
private createSessionContext;
|
|
17
|
+
constructor(proofService: ProofService, proofGenerator: CloudflareProofGenerator, config: CloudflareRuntimeConfig, runtime: CloudflareRuntime);
|
|
25
18
|
/**
|
|
26
19
|
* Log consent page view event
|
|
27
20
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consent-audit.service.d.ts","sourceRoot":"","sources":["../../src/services/consent-audit.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"consent-audit.service.d.ts","sourceRoot":"","sources":["../../src/services/consent-audit.service.ts"],"names":[],"mappings":"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"}
|