@absolutejs/vulnerabilities-witness 0.2.0 → 0.3.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/index.js CHANGED
@@ -115,7 +115,7 @@ var verifyEvidenceWitnessKeyRegistry = (input) => {
115
115
  // src/service.ts
116
116
  var EVIDENCE_WITNESS_REQUEST_CONTRACT = "absolutejs.vulnerability-evidence-witness-request/v1";
117
117
  var EVIDENCE_WITNESS_BACKUP_VERIFICATION_CONTRACT = "absolutejs.vulnerability-evidence-witness-backup-verification/v1";
118
- var EVIDENCE_WITNESS_STATUS_CONTRACT = "absolutejs.vulnerability-evidence-witness-status/v1";
118
+ var EVIDENCE_WITNESS_STATUS_CONTRACT = "absolutejs.vulnerability-evidence-witness-status/v2";
119
119
  var timestamp = (value, label) => {
120
120
  if (!Number.isFinite(Date.parse(value)))
121
121
  throw new Error(`${label} is invalid`);
@@ -155,10 +155,11 @@ var createEvidenceWitnessService = (options) => {
155
155
  await refresh();
156
156
  return evidenceWitnessKeyRegistryFrom(state);
157
157
  };
158
- const status = async () => ({
158
+ const status = async (subject) => ({
159
159
  backup: options.loadBackupVerification ? await options.loadBackupVerification().then((value) => value === null ? null : parseEvidenceWitnessBackupVerification(value)) : null,
160
160
  checkedAt: new Date().toISOString(),
161
161
  contract: EVIDENCE_WITNESS_STATUS_CONTRACT,
162
+ latestCheckpoint: await options.store.latest(subject).then((observation) => observation?.checkpoint ?? null),
162
163
  registry: await registry()
163
164
  });
164
165
  const checkpoint = async (subject, request) => {
@@ -306,7 +307,7 @@ var createEvidenceWitnessHttpHandler = (options) => async (request) => {
306
307
  const subject2 = await options.authenticate(bearer(request));
307
308
  if (!subject2)
308
309
  return json({ error: "unauthorized" }, 401);
309
- return json(await options.service.status());
310
+ return json(await options.service.status(subject2));
310
311
  }
311
312
  if (request.method !== "POST" || url.pathname !== "/v1/checkpoints")
312
313
  return json({ error: "not_found" }, 404);
package/dist/server.js CHANGED
@@ -117,7 +117,7 @@ var verifyEvidenceWitnessKeyRegistry = (input) => {
117
117
  // src/service.ts
118
118
  var EVIDENCE_WITNESS_REQUEST_CONTRACT = "absolutejs.vulnerability-evidence-witness-request/v1";
119
119
  var EVIDENCE_WITNESS_BACKUP_VERIFICATION_CONTRACT = "absolutejs.vulnerability-evidence-witness-backup-verification/v1";
120
- var EVIDENCE_WITNESS_STATUS_CONTRACT = "absolutejs.vulnerability-evidence-witness-status/v1";
120
+ var EVIDENCE_WITNESS_STATUS_CONTRACT = "absolutejs.vulnerability-evidence-witness-status/v2";
121
121
  var timestamp = (value, label) => {
122
122
  if (!Number.isFinite(Date.parse(value)))
123
123
  throw new Error(`${label} is invalid`);
@@ -157,10 +157,11 @@ var createEvidenceWitnessService = (options) => {
157
157
  await refresh();
158
158
  return evidenceWitnessKeyRegistryFrom(state);
159
159
  };
160
- const status = async () => ({
160
+ const status = async (subject) => ({
161
161
  backup: options.loadBackupVerification ? await options.loadBackupVerification().then((value) => value === null ? null : parseEvidenceWitnessBackupVerification(value)) : null,
162
162
  checkedAt: new Date().toISOString(),
163
163
  contract: EVIDENCE_WITNESS_STATUS_CONTRACT,
164
+ latestCheckpoint: await options.store.latest(subject).then((observation) => observation?.checkpoint ?? null),
164
165
  registry: await registry()
165
166
  });
166
167
  const checkpoint = async (subject, request) => {
@@ -308,7 +309,7 @@ var createEvidenceWitnessHttpHandler = (options) => async (request) => {
308
309
  const subject2 = await options.authenticate(bearer(request));
309
310
  if (!subject2)
310
311
  return json({ error: "unauthorized" }, 401);
311
- return json(await options.service.status());
312
+ return json(await options.service.status(subject2));
312
313
  }
313
314
  if (request.method !== "POST" || url.pathname !== "/v1/checkpoints")
314
315
  return json({ error: "not_found" }, 404);
@@ -439,6 +440,18 @@ var loadOrBootstrap = async (name) => {
439
440
  await secrets.put(name, bootstrap);
440
441
  return bootstrap;
441
442
  };
443
+ var loadOptionalBootstrap = async (name) => {
444
+ const stored = await secrets.fetch(name);
445
+ if (stored)
446
+ return stored;
447
+ const bootstrap = process.env[name]?.trim();
448
+ if (!bootstrap)
449
+ return null;
450
+ if (!secrets.put)
451
+ throw new Error("Encrypted secret adapter is read-only");
452
+ await secrets.put(name, bootstrap);
453
+ return bootstrap;
454
+ };
442
455
  var database = new SQL(required("DATABASE_URL"));
443
456
  await ensurePostgresEvidenceWitnessSchema(database);
444
457
  var encodedSigningState = await loadOrBootstrap(signingStateName);
@@ -447,7 +460,7 @@ var tokens = JSON.parse(await loadOrBootstrap(tokensName));
447
460
  var subjectsByToken = new Map(Object.entries(tokens).map(([subject, token]) => [token, subject]));
448
461
  var service2 = createEvidenceWitnessService({
449
462
  loadBackupVerification: async () => {
450
- const encoded = await secrets.fetch(backupVerificationName);
463
+ const encoded = await loadOptionalBootstrap(backupVerificationName);
451
464
  return encoded ? JSON.parse(encoded) : null;
452
465
  },
453
466
  loadSigningState: async () => {
package/dist/service.d.ts CHANGED
@@ -11,7 +11,7 @@ export type EvidenceWitnessResponse = {
11
11
  registry: EvidenceWitnessKeyRegistry;
12
12
  };
13
13
  export declare const EVIDENCE_WITNESS_BACKUP_VERIFICATION_CONTRACT: "absolutejs.vulnerability-evidence-witness-backup-verification/v1";
14
- export declare const EVIDENCE_WITNESS_STATUS_CONTRACT: "absolutejs.vulnerability-evidence-witness-status/v1";
14
+ export declare const EVIDENCE_WITNESS_STATUS_CONTRACT: "absolutejs.vulnerability-evidence-witness-status/v2";
15
15
  export type EvidenceWitnessBackupVerification = {
16
16
  contract: typeof EVIDENCE_WITNESS_BACKUP_VERIFICATION_CONTRACT;
17
17
  databaseArtifactDigest: `sha256:${string}`;
@@ -24,6 +24,7 @@ export type EvidenceWitnessStatus = {
24
24
  backup: EvidenceWitnessBackupVerification | null;
25
25
  checkedAt: string;
26
26
  contract: typeof EVIDENCE_WITNESS_STATUS_CONTRACT;
27
+ latestCheckpoint: EvidenceWitnessResponse["checkpoint"] | null;
27
28
  registry: EvidenceWitnessKeyRegistry;
28
29
  };
29
30
  export declare const parseEvidenceWitnessBackupVerification: (value: unknown) => EvidenceWitnessBackupVerification;
@@ -42,5 +43,5 @@ export declare const createEvidenceWitnessService: (options: {
42
43
  }) => Promise<EvidenceWitnessKeyRegistry>;
43
44
  registry: () => Promise<EvidenceWitnessKeyRegistry>;
44
45
  rotate: (rotatedAt?: string) => Promise<EvidenceWitnessKeyRegistry>;
45
- status: () => Promise<EvidenceWitnessStatus>;
46
+ status: (subject: string) => Promise<EvidenceWitnessStatus>;
46
47
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/vulnerabilities-witness",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Independent durable transparency witness with rollback, equivocation, key-rotation, and HTTP service primitives for AbsoluteJS vulnerability evidence.",
5
5
  "type": "module",
6
6
  "license": "BSL-1.1",