@xyo-network/service-kit-protocol 0.0.3 → 0.2.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/README.md CHANGED
@@ -2,9 +2,24 @@
2
2
 
3
3
  Published B1 implementation of exact-hash public-object verification and
4
4
  resolution through caller-configured readers. The current public release is
5
- 0.0.2. Publication does not imply existing consumer adoption, service
5
+ 0.1.0, published October 1, 2026 and registry rechecked October 5.
6
+ Publication does not imply existing consumer adoption, service
6
7
  authority, or hosted availability.
7
8
 
9
+ The integrity-checked protocol 0.1.0 artifact has a known metadata-invariance
10
+ defect with SDK Protocol 8.0.1: its SDK Payload guard runs before top-level
11
+ metadata omission and can reject otherwise valid same-hash data because of
12
+ malformed recognized storage metadata. This violates the B1 contract below.
13
+ See the [October 5 assessment](../../docs/CODE_REVIEW_2026-10-05.md) and
14
+ [implementation status](../../docs/IMPLEMENTATION_STATUS.md) for the released
15
+ defect, local repair evidence and remaining release boundary.
16
+
17
+ The checkout declares Node `^26`, matching the selected SDK Protocol 8.0.1
18
+ dependency. Development/CI and current qualification use Node 26.9.0; other
19
+ Node 26 versions require their own recorded qualification. Historical Node 24
20
+ receipts remain dated evidence; published 0.1.0 metadata is unchanged until release.
21
+ Environment-neutral/browser outputs and the B1 data contract are unchanged.
22
+
8
23
  ## API
9
24
 
10
25
  `verifyObject(reference, candidate, limits?)` verifies one untrusted candidate.
@@ -79,4 +94,4 @@ Missing content is unavailable, not proof of nonexistence or revocation.
79
94
 
80
95
  See the [normative contract](../../papers/B1_PUBLIC_OBJECT_RESOLUTION.md) and
81
96
  [verification status](../../docs/IMPLEMENTATION_STATUS.md) for the exact B1
82
- boundary, passing local gates and remaining broader work.
97
+ boundary, dated verification results and remaining broader work.
@@ -125,7 +125,7 @@ function snapshotArray(value, budget, depth) {
125
125
  }
126
126
  function snapshotObject(value, budget, depth) {
127
127
  const prototype = Object.getPrototypeOf(value);
128
- if (prototype !== Object.prototype && prototype !== null) throw new ObjectInputError("invalid-json");
128
+ if (prototype !== null && prototype !== Object.prototype) throw new ObjectInputError("invalid-json");
129
129
  const keys = Reflect.ownKeys(value);
130
130
  if (keys.length > budget.limits.maxNodes - budget.nodes) throw new ObjectInputError("structure-limit");
131
131
  spend(budget, 2);
@@ -191,8 +191,11 @@ async function verifyObject(reference, candidate, options = {}) {
191
191
  const limits = verificationLimits(options);
192
192
  try {
193
193
  const snapshot = snapshotJson(candidate, limits);
194
- if (!isAnyPayload(snapshot)) return { status: "invalid", reason: "not-payload" };
194
+ if (snapshot === null || typeof snapshot !== "object" || Array.isArray(snapshot)) {
195
+ return { status: "invalid", reason: "not-payload" };
196
+ }
195
197
  const data = PayloadBuilder.omitMeta(snapshot);
198
+ if (!isAnyPayload(data)) return { status: "invalid", reason: "not-payload" };
196
199
  const actualHash = await PayloadBuilder.dataHash(data);
197
200
  if (actualHash !== expected.dataHash) return { status: "invalid", reason: "hash-mismatch" };
198
201
  if (data.schema !== expected.schema) return { status: "invalid", reason: "schema-mismatch" };
@@ -301,14 +304,25 @@ function attemptSeed(seed, reference, limits, outerSignal, now, totalDeadline) {
301
304
  onAbort();
302
305
  return;
303
306
  }
304
- void Promise.resolve().then(async () => await readCandidates(seed, reference, limits, controller.signal, expired)).then(finish, () => finish({ status: "reader-error" }));
307
+ queueMicrotask(() => {
308
+ void (async () => {
309
+ let result;
310
+ try {
311
+ result = await readCandidates(seed, reference, limits, controller.signal, expired);
312
+ } catch {
313
+ finish({ status: "reader-error" });
314
+ return;
315
+ }
316
+ finish(result);
317
+ })();
318
+ });
305
319
  });
306
320
  }
307
321
  function diagnostic(seedId, result) {
308
322
  return Object.freeze({
309
323
  seedId,
310
324
  status: result.status,
311
- ...result.candidateFailures === void 0 ? {} : { candidateFailures: Object.freeze([...result.candidateFailures]) }
325
+ ...result.candidateFailures !== void 0 && { candidateFailures: Object.freeze([...result.candidateFailures]) }
312
326
  });
313
327
  }
314
328
  async function resolveObject(reference, options) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/limits.ts", "../../src/resolveObject.ts", "../../src/clock.ts", "../../src/verifyObject.ts", "../../src/jsonSnapshot.ts"],
4
- "sourcesContent": ["import type { ResolutionLimits, VerificationLimits } from './types.js'\n\nexport const MAX_TIMER_DELAY_MS = 2_147_483_647\n\nexport const DEFAULT_VERIFICATION_LIMITS: VerificationLimits = Object.freeze({\n maxBodyBytes: 65_536,\n maxDepth: 32,\n maxNodes: 10_000,\n})\n\nexport const DEFAULT_RESOLUTION_LIMITS: ResolutionLimits = Object.freeze({\n ...DEFAULT_VERIFICATION_LIMITS,\n maxSeeds: 16,\n maxCandidatesPerSeed: 16,\n attemptTimeoutMs: 2000,\n totalTimeoutMs: 10_000,\n})\n\nfunction positiveInteger(value: number, name: string) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(name + ' must be a positive safe integer')\n }\n}\n\nexport function verificationLimits(options: Partial<VerificationLimits> = {}): VerificationLimits {\n const limits = { ...DEFAULT_VERIFICATION_LIMITS, ...options }\n positiveInteger(limits.maxBodyBytes, 'maxBodyBytes')\n positiveInteger(limits.maxDepth, 'maxDepth')\n positiveInteger(limits.maxNodes, 'maxNodes')\n return Object.freeze(limits)\n}\n\nexport function resolutionLimits(options: Partial<ResolutionLimits> = {}): ResolutionLimits {\n const limits = { ...DEFAULT_RESOLUTION_LIMITS, ...options }\n verificationLimits(limits)\n positiveInteger(limits.maxSeeds, 'maxSeeds')\n positiveInteger(limits.maxCandidatesPerSeed, 'maxCandidatesPerSeed')\n positiveInteger(limits.attemptTimeoutMs, 'attemptTimeoutMs')\n positiveInteger(limits.totalTimeoutMs, 'totalTimeoutMs')\n if (limits.attemptTimeoutMs > MAX_TIMER_DELAY_MS || limits.totalTimeoutMs > MAX_TIMER_DELAY_MS) {\n throw new RangeError('Timeouts must fit a signed 32-bit millisecond timer')\n }\n return Object.freeze(limits)\n}\n", "import type { ObjectReference } from '@xyo-network/service-kit-schemas'\nimport { ObjectReferenceZod } from '@xyo-network/service-kit-schemas'\n\nimport { monotonicClock, scheduleDeadline } from './clock.js'\nimport { resolutionLimits } from './limits.js'\nimport type {\n AttemptStatus,\n ConfiguredSeed,\n ObjectResolutionResult,\n ObjectVerificationFailureReason,\n ResolutionAttempt,\n ResolutionLimits,\n ResolveObjectOptions,\n VerifiedObject,\n} from './types.js'\nimport { verifyObject } from './verifyObject.js'\n\ninterface SeedResult {\n readonly candidateFailures?: readonly ObjectVerificationFailureReason[]\n readonly object?: VerifiedObject\n readonly status: AttemptStatus\n}\n\nfunction configuredSeeds(seeds: readonly ConfiguredSeed[], limits: ResolutionLimits) {\n if (!Array.isArray(seeds) || seeds.length === 0 || seeds.length > limits.maxSeeds) {\n throw new RangeError('Configure between one and maxSeeds explicit readers')\n }\n const ids = new Set<string>()\n const configured = seeds.map((seed: ConfiguredSeed): ConfiguredSeed => {\n if (typeof seed.id !== 'string' || seed.id.length === 0 || seed.id.length > 128 || seed.id.trim() !== seed.id) {\n throw new TypeError('Seed IDs must be nonempty, trimmed strings of at most 128 characters')\n }\n if (ids.has(seed.id)) throw new TypeError('Seed IDs must be unique')\n if (typeof seed.reader?.get !== 'function') throw new TypeError('Each seed requires a reader.get method')\n ids.add(seed.id)\n // Pin the reader and label before the first await; do not consult mutable seed configuration later.\n return Object.freeze({\n id: seed.id,\n reader: Object.freeze({ get: seed.reader.get.bind(seed.reader) }),\n })\n })\n for (let index = 0; index < configured.length; index++) {\n if (!Object.hasOwn(configured, index)) throw new TypeError('Seed configuration must not contain sparse slots')\n }\n return configured\n}\n\nasync function readCandidates(\n seed: ConfiguredSeed,\n reference: ObjectReference,\n limits: ResolutionLimits,\n signal: AbortSignal,\n expired: () => boolean,\n): Promise<SeedResult> {\n if (signal.aborted) return { status: 'aborted' }\n if (expired()) return { status: 'timeout' }\n const response: unknown = await seed.reader.get([reference.dataHash], { signal, maxBodyBytes: limits.maxBodyBytes })\n if (signal.aborted) return { status: 'aborted' }\n if (expired()) return { status: 'timeout' }\n if (!Array.isArray(response)) return { status: 'malformed-response' }\n const candidateCount = response.length\n if (!Number.isSafeInteger(candidateCount) || candidateCount < 0) return { status: 'malformed-response' }\n if (candidateCount > limits.maxCandidatesPerSeed) return { status: 'too-many-candidates' }\n if (candidateCount === 0) return { status: 'missing' }\n // Pin the bounded slots before verification yields; a reader must not enlarge the work budget.\n const candidates = Array.from({ length: candidateCount }, (_, index) => Object.getOwnPropertyDescriptor(response, String(index)))\n const candidateFailures: ObjectVerificationFailureReason[] = []\n for (const descriptor of candidates) {\n if (signal.aborted) return { status: 'aborted' }\n if (expired()) return { status: 'timeout' }\n if (descriptor === undefined || !('value' in descriptor)) {\n candidateFailures.push('invalid-json')\n continue\n }\n const candidate: unknown = descriptor.value\n const result = await verifyObject(reference, candidate, limits)\n if (signal.aborted) return { status: 'aborted' }\n if (expired()) return { status: 'timeout' }\n if (result.status === 'verified') return {\n status: 'resolved', object: result, candidateFailures,\n }\n candidateFailures.push(result.reason)\n }\n return { status: 'invalid-object', candidateFailures }\n}\n\nfunction attemptSeed(\n seed: ConfiguredSeed,\n reference: ObjectReference,\n limits: ResolutionLimits,\n outerSignal: AbortSignal,\n now: () => number,\n totalDeadline: number,\n): Promise<SeedResult> {\n const deadline = Math.min(now() + limits.attemptTimeoutMs, totalDeadline)\n const expired = () => now() >= deadline\n return new Promise((resolve) => {\n const controller = new AbortController()\n let isSettled = false\n const finish = (result: SeedResult) => {\n if (isSettled) return\n // Timer callbacks may be delayed by synchronous work or a busy microtask queue.\n // Reject late completions even when the timer has not had a chance to run.\n const outcome: SeedResult = result.status !== 'aborted' && expired() ? { status: 'timeout' } : result\n isSettled = true\n cancelTimer()\n outerSignal.removeEventListener('abort', onAbort)\n if (outcome.status === 'timeout') controller.abort()\n resolve(outcome)\n }\n const onAbort = () => {\n controller.abort()\n finish({ status: 'aborted' })\n }\n const cancelTimer = scheduleDeadline(now, deadline, () => {\n controller.abort()\n finish({ status: 'timeout' })\n })\n outerSignal.addEventListener('abort', onAbort, { once: true })\n if (outerSignal.aborted) {\n onAbort()\n return\n }\n // Both fulfillment and rejection are handled even if a reader ignores abort and settles late.\n void Promise.resolve()\n .then(async () => await readCandidates(seed, reference, limits, controller.signal, expired))\n .then(finish, () => finish({ status: 'reader-error' }))\n })\n}\n\nfunction diagnostic(seedId: string, result: SeedResult): ResolutionAttempt {\n return Object.freeze({\n seedId,\n status: result.status,\n ...(result.candidateFailures === undefined\n ? {}\n : { candidateFailures: Object.freeze([...result.candidateFailures]) }),\n })\n}\n\n/** Resolve exact content through configured readers only; never infer service absence or authority. */\nexport async function resolveObject(\n reference: ObjectReference,\n options: ResolveObjectOptions,\n): Promise<ObjectResolutionResult> {\n const expected = Object.freeze(ObjectReferenceZod.parse(reference))\n const limits = resolutionLimits(options.limits)\n const seeds = configuredSeeds(options.seeds, limits)\n const signal = options.signal\n const attempts: ResolutionAttempt[] = []\n if (signal?.aborted === true) return { status: 'aborted', attempts: Object.freeze(attempts) }\n\n const now = monotonicClock()\n const deadline = now() + limits.totalTimeoutMs\n const controller = new AbortController()\n const state: { terminal?: 'aborted' | 'deadline-exceeded' } = {}\n const terminate = (reason: 'aborted' | 'deadline-exceeded') => {\n if (state.terminal !== undefined) return\n state.terminal = reason\n controller.abort()\n }\n const onAbort = () => terminate('aborted')\n signal?.addEventListener('abort', onAbort, { once: true })\n const cancelTimer = scheduleDeadline(now, deadline, () => terminate('deadline-exceeded'))\n try {\n for (const seed of seeds) {\n if (now() >= deadline) terminate('deadline-exceeded')\n if (state.terminal !== undefined) break\n const result = await attemptSeed(seed, expected, limits, controller.signal, now, deadline)\n attempts.push(diagnostic(seed.id, result))\n if (now() >= deadline) terminate('deadline-exceeded')\n if (state.terminal !== undefined) break\n if (result.object !== undefined) {\n return Object.freeze({\n status: 'resolved',\n assurance: 'content-hash-verified',\n reference: result.object.reference,\n payload: result.object.payload,\n seedId: seed.id,\n attempts: Object.freeze([...attempts]),\n })\n }\n }\n if (state.terminal === 'aborted') return { status: 'aborted', attempts: Object.freeze([...attempts]) }\n return {\n status: 'unavailable',\n reason: state.terminal === 'deadline-exceeded' ? 'deadline-exceeded' : 'seeds-exhausted',\n attempts: Object.freeze([...attempts]),\n }\n } finally {\n cancelTimer()\n signal?.removeEventListener('abort', onAbort)\n }\n}\n", "/** Use the common runtime clock without introducing Node- or DOM-only ambient types. */\nexport function monotonicClock(): () => number {\n const clock: unknown = 'performance' in globalThis ? globalThis.performance : undefined\n if (typeof clock !== 'object' || clock === null || !('now' in clock) || typeof clock.now !== 'function') {\n throw new TypeError('Object resolution requires performance.now()')\n }\n const read = clock.now.bind(clock) as () => unknown\n return () => {\n const now = read()\n if (typeof now !== 'number' || !Number.isFinite(now)) throw new TypeError('Invalid monotonic clock')\n return now\n }\n}\n\n/** Native timers are wake-ups to check a deadline, not proof that its monotonic time has arrived. */\nexport function scheduleDeadline(now: () => number, deadline: number, expired: () => void): () => void {\n let cancelled = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const tick = () => {\n if (cancelled) return\n if (now() >= deadline) {\n cancelled = true\n expired()\n } else {\n arm()\n }\n }\n const arm = () => {\n // Round up and recheck: timer implementations may truncate delays or wake before the deadline.\n const delay = Math.min(MAX_TIMER_DELAY_MS, Math.max(1, Math.ceil(deadline - now())))\n timer = setTimeout(tick, delay)\n }\n arm()\n return () => {\n cancelled = true\n clearTimeout(timer)\n }\n}\nimport { MAX_TIMER_DELAY_MS } from './limits.js'\n", "import { isAnyPayload, PayloadBuilder } from '@xyo-network/sdk-protocol'\nimport type { ObjectReference } from '@xyo-network/service-kit-schemas'\nimport {\n DataLakeLocatorSchema, DataLakeLocatorZod,\n ObjectReferenceZod,\n ServiceAdvertisementSchema, ServiceAdvertisementZod,\n} from '@xyo-network/service-kit-schemas'\n\nimport { ObjectInputError, snapshotJson } from './jsonSnapshot.js'\nimport { verificationLimits } from './limits.js'\nimport type {\n ContentPayload, ObjectVerificationResult, VerificationLimits,\n} from './types.js'\n\n/** Verify content only. No Claim, lifecycle, publisher authority, or freshness is established. */\nexport async function verifyObject(\n reference: ObjectReference,\n candidate: unknown,\n options: Partial<VerificationLimits> = {},\n): Promise<ObjectVerificationResult> {\n const expected = Object.freeze(ObjectReferenceZod.parse(reference))\n const limits = verificationLimits(options)\n try {\n const snapshot = snapshotJson(candidate, limits)\n // Use a guard, never a parser that strips unknown fields before hashing.\n if (!isAnyPayload(snapshot)) return { status: 'invalid', reason: 'not-payload' }\n const data = PayloadBuilder.omitMeta(snapshot)\n const actualHash = await PayloadBuilder.dataHash(data)\n if (actualHash !== expected.dataHash) return { status: 'invalid', reason: 'hash-mismatch' }\n if (data.schema !== expected.schema) return { status: 'invalid', reason: 'schema-mismatch' }\n\n // These are strict validators without coercion, defaults, or transformations.\n // Hash the complete data first, and return the data rather than a parser projection.\n if (data.schema === ServiceAdvertisementSchema && !ServiceAdvertisementZod.safeParse(data).success) {\n return { status: 'invalid', reason: 'invalid-descriptor' }\n }\n if (data.schema === DataLakeLocatorSchema && !DataLakeLocatorZod.safeParse(data).success) {\n return { status: 'invalid', reason: 'invalid-descriptor' }\n }\n const payload = snapshotJson(data, limits) as ContentPayload\n return Object.freeze({\n status: 'verified', assurance: 'content-hash-verified', reference: expected, payload,\n })\n } catch (error) {\n return {\n status: 'invalid',\n reason: error instanceof ObjectInputError ? error.reason : 'invalid-json',\n }\n }\n}\n", "import type {\n JsonValue, ObjectVerificationFailureReason, VerificationLimits,\n} from './types.js'\n\nexport class ObjectInputError extends Error {\n readonly reason: ObjectVerificationFailureReason\n\n constructor(reason: ObjectVerificationFailureReason) {\n super(reason)\n this.name = 'ObjectInputError'\n this.reason = reason\n }\n}\n\ninterface Budget {\n readonly ancestors: WeakSet<object>\n bytes: number\n readonly limits: VerificationLimits\n nodes: number\n}\n\nconst encoder = new TextEncoder()\n\nfunction spend(budget: Budget, bytes: number) {\n budget.bytes += bytes\n if (budget.bytes > budget.limits.maxBodyBytes) throw new ObjectInputError('body-too-large')\n}\n\nfunction textSize(budget: Budget, text: string) {\n // Reject an oversized string before allocating its serialized/encoded copy.\n if (text.length > budget.limits.maxBodyBytes - budget.bytes) throw new ObjectInputError('body-too-large')\n spend(budget, encoder.encode(JSON.stringify(text)).byteLength)\n}\n\nfunction propertyValue(object: object, key: string): unknown {\n const descriptor = Object.getOwnPropertyDescriptor(object, key)\n if (descriptor?.enumerable !== true || !('value' in descriptor)) {\n throw new ObjectInputError('invalid-json')\n }\n return descriptor.value\n}\n\nfunction snapshotArray(value: unknown[], budget: Budget, depth: number): readonly JsonValue[] {\n if (Object.getPrototypeOf(value) !== Array.prototype) throw new ObjectInputError('invalid-json')\n if (value.length > budget.limits.maxNodes - budget.nodes) throw new ObjectInputError('structure-limit')\n // JSON arrays cannot carry holes, symbols, accessors, or extra object fields.\n if (Reflect.ownKeys(value).length !== value.length + 1) throw new ObjectInputError('invalid-json')\n spend(budget, 2)\n const output: JsonValue[] = []\n for (let index = 0; index < value.length; index++) {\n if (index > 0) spend(budget, 1)\n output.push(snapshotValue(propertyValue(value, String(index)), budget, depth + 1))\n }\n return Object.freeze(output)\n}\n\nfunction snapshotObject(value: object, budget: Budget, depth: number): JsonValue {\n const prototype: unknown = Object.getPrototypeOf(value)\n if (prototype !== Object.prototype && prototype !== null) throw new ObjectInputError('invalid-json')\n const keys = Reflect.ownKeys(value)\n if (keys.length > budget.limits.maxNodes - budget.nodes) throw new ObjectInputError('structure-limit')\n spend(budget, 2)\n const entries: [string, JsonValue][] = []\n for (const key of keys) {\n // The SDK's object reconstruction cannot bind a literal __proto__ key reliably.\n if (typeof key !== 'string' || key === '__proto__') throw new ObjectInputError('invalid-json')\n if (entries.length > 0) spend(budget, 1)\n textSize(budget, key)\n spend(budget, 1)\n entries.push([key, snapshotValue(propertyValue(value, key), budget, depth + 1)])\n }\n // Construct own data properties without interpreting object keys as setters.\n return Object.freeze(Object.fromEntries(entries))\n}\n\nfunction snapshotValue(value: unknown, budget: Budget, depth: number): JsonValue {\n budget.nodes++\n if (depth > budget.limits.maxDepth || budget.nodes > budget.limits.maxNodes) {\n throw new ObjectInputError('structure-limit')\n }\n if (value === null) {\n spend(budget, 4)\n return null\n }\n switch (typeof value) {\n case 'string': {\n textSize(budget, value)\n return value\n }\n case 'boolean': {\n spend(budget, value ? 4 : 5)\n return value\n }\n case 'number': {\n if (!Number.isFinite(value)) throw new ObjectInputError('invalid-json')\n spend(budget, JSON.stringify(value).length)\n return value\n }\n case 'object': {\n if (budget.ancestors.has(value)) throw new ObjectInputError('invalid-json')\n budget.ancestors.add(value)\n try {\n return Array.isArray(value)\n ? snapshotArray(value, budget, depth)\n : snapshotObject(value, budget, depth)\n } finally {\n budget.ancestors.delete(value)\n }\n }\n default: {\n throw new ObjectInputError('invalid-json')\n }\n }\n}\n\n/** Bounded, immutable JSON copy. This is not a replacement canonicalization algorithm. */\nexport function snapshotJson(candidate: unknown, limits: VerificationLimits): JsonValue {\n return snapshotValue(candidate, {\n limits, ancestors: new WeakSet<object>(), bytes: 0, nodes: 0,\n }, 0)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { ResolutionLimits, VerificationLimits } from './types.js'\n\nexport const MAX_TIMER_DELAY_MS = 2_147_483_647\n\nexport const DEFAULT_VERIFICATION_LIMITS: VerificationLimits = Object.freeze({\n maxBodyBytes: 65_536,\n maxDepth: 32,\n maxNodes: 10_000,\n})\n\nexport const DEFAULT_RESOLUTION_LIMITS: ResolutionLimits = Object.freeze({\n ...DEFAULT_VERIFICATION_LIMITS,\n maxSeeds: 16,\n maxCandidatesPerSeed: 16,\n attemptTimeoutMs: 2000,\n totalTimeoutMs: 10_000,\n})\n\nfunction positiveInteger(value: number, name: string) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(name + ' must be a positive safe integer')\n }\n}\n\nexport function verificationLimits(options: Partial<VerificationLimits> = {}): VerificationLimits {\n const limits = { ...DEFAULT_VERIFICATION_LIMITS, ...options }\n positiveInteger(limits.maxBodyBytes, 'maxBodyBytes')\n positiveInteger(limits.maxDepth, 'maxDepth')\n positiveInteger(limits.maxNodes, 'maxNodes')\n return Object.freeze(limits)\n}\n\nexport function resolutionLimits(options: Partial<ResolutionLimits> = {}): ResolutionLimits {\n const limits = { ...DEFAULT_RESOLUTION_LIMITS, ...options }\n verificationLimits(limits)\n positiveInteger(limits.maxSeeds, 'maxSeeds')\n positiveInteger(limits.maxCandidatesPerSeed, 'maxCandidatesPerSeed')\n positiveInteger(limits.attemptTimeoutMs, 'attemptTimeoutMs')\n positiveInteger(limits.totalTimeoutMs, 'totalTimeoutMs')\n if (limits.attemptTimeoutMs > MAX_TIMER_DELAY_MS || limits.totalTimeoutMs > MAX_TIMER_DELAY_MS) {\n throw new RangeError('Timeouts must fit a signed 32-bit millisecond timer')\n }\n return Object.freeze(limits)\n}\n", "import type { ObjectReference } from '@xyo-network/service-kit-schemas'\nimport { ObjectReferenceZod } from '@xyo-network/service-kit-schemas'\n\nimport { monotonicClock, scheduleDeadline } from './clock.js'\nimport { resolutionLimits } from './limits.js'\nimport type {\n AttemptStatus,\n ConfiguredSeed,\n ObjectResolutionResult,\n ObjectVerificationFailureReason,\n ResolutionAttempt,\n ResolutionLimits,\n ResolveObjectOptions,\n VerifiedObject,\n} from './types.js'\nimport { verifyObject } from './verifyObject.js'\n\ninterface SeedResult {\n readonly candidateFailures?: readonly ObjectVerificationFailureReason[]\n readonly object?: VerifiedObject\n readonly status: AttemptStatus\n}\n\nfunction configuredSeeds(seeds: readonly ConfiguredSeed[], limits: ResolutionLimits) {\n if (!Array.isArray(seeds) || seeds.length === 0 || seeds.length > limits.maxSeeds) {\n throw new RangeError('Configure between one and maxSeeds explicit readers')\n }\n const ids = new Set<string>()\n const configured = seeds.map((seed: ConfiguredSeed): ConfiguredSeed => {\n if (typeof seed.id !== 'string' || seed.id.length === 0 || seed.id.length > 128 || seed.id.trim() !== seed.id) {\n throw new TypeError('Seed IDs must be nonempty, trimmed strings of at most 128 characters')\n }\n if (ids.has(seed.id)) throw new TypeError('Seed IDs must be unique')\n if (typeof seed.reader?.get !== 'function') throw new TypeError('Each seed requires a reader.get method')\n ids.add(seed.id)\n // Pin the reader and label before the first await; do not consult mutable seed configuration later.\n return Object.freeze({\n id: seed.id,\n reader: Object.freeze({ get: seed.reader.get.bind(seed.reader) }),\n })\n })\n for (let index = 0; index < configured.length; index++) {\n if (!Object.hasOwn(configured, index)) throw new TypeError('Seed configuration must not contain sparse slots')\n }\n return configured\n}\n\nasync function readCandidates(\n seed: ConfiguredSeed,\n reference: ObjectReference,\n limits: ResolutionLimits,\n signal: AbortSignal,\n expired: () => boolean,\n): Promise<SeedResult> {\n if (signal.aborted) return { status: 'aborted' }\n if (expired()) return { status: 'timeout' }\n const response: unknown = await seed.reader.get([reference.dataHash], { signal, maxBodyBytes: limits.maxBodyBytes })\n if (signal.aborted) return { status: 'aborted' }\n if (expired()) return { status: 'timeout' }\n if (!Array.isArray(response)) return { status: 'malformed-response' }\n const candidateCount = response.length\n if (!Number.isSafeInteger(candidateCount) || candidateCount < 0) return { status: 'malformed-response' }\n if (candidateCount > limits.maxCandidatesPerSeed) return { status: 'too-many-candidates' }\n if (candidateCount === 0) return { status: 'missing' }\n // Pin the bounded slots before verification yields; a reader must not enlarge the work budget.\n const candidates = Array.from({ length: candidateCount }, (_, index) => Object.getOwnPropertyDescriptor(response, String(index)))\n const candidateFailures: ObjectVerificationFailureReason[] = []\n for (const descriptor of candidates) {\n if (signal.aborted) return { status: 'aborted' }\n if (expired()) return { status: 'timeout' }\n if (descriptor === undefined || !('value' in descriptor)) {\n candidateFailures.push('invalid-json')\n continue\n }\n const candidate: unknown = descriptor.value\n const result = await verifyObject(reference, candidate, limits)\n if (signal.aborted) return { status: 'aborted' }\n if (expired()) return { status: 'timeout' }\n if (result.status === 'verified') return {\n status: 'resolved', object: result, candidateFailures,\n }\n candidateFailures.push(result.reason)\n }\n return { status: 'invalid-object', candidateFailures }\n}\n\nfunction attemptSeed(\n seed: ConfiguredSeed,\n reference: ObjectReference,\n limits: ResolutionLimits,\n outerSignal: AbortSignal,\n now: () => number,\n totalDeadline: number,\n): Promise<SeedResult> {\n const deadline = Math.min(now() + limits.attemptTimeoutMs, totalDeadline)\n const expired = () => now() >= deadline\n return new Promise((resolve) => {\n const controller = new AbortController()\n let isSettled = false\n const finish = (result: SeedResult) => {\n if (isSettled) return\n // Timer callbacks may be delayed by synchronous work or a busy microtask queue.\n // Reject late completions even when the timer has not had a chance to run.\n const outcome: SeedResult = result.status !== 'aborted' && expired() ? { status: 'timeout' } : result\n isSettled = true\n cancelTimer()\n outerSignal.removeEventListener('abort', onAbort)\n if (outcome.status === 'timeout') controller.abort()\n resolve(outcome)\n }\n const onAbort = () => {\n controller.abort()\n finish({ status: 'aborted' })\n }\n const cancelTimer = scheduleDeadline(now, deadline, () => {\n controller.abort()\n finish({ status: 'timeout' })\n })\n outerSignal.addEventListener('abort', onAbort, { once: true })\n if (outerSignal.aborted) {\n onAbort()\n return\n }\n // Defer the read one microtask so abort and deadline checks win, then settle either outcome.\n // Keep finish outside the rejection path so a failure inside finish is not reported as a reader error.\n queueMicrotask(() => {\n void (async () => {\n let result: SeedResult\n try {\n result = await readCandidates(seed, reference, limits, controller.signal, expired)\n } catch {\n finish({ status: 'reader-error' })\n return\n }\n finish(result)\n })()\n })\n })\n}\n\nfunction diagnostic(seedId: string, result: SeedResult): ResolutionAttempt {\n return Object.freeze({\n seedId,\n status: result.status,\n ...(result.candidateFailures !== undefined && { candidateFailures: Object.freeze([...result.candidateFailures]) }),\n })\n}\n\n/** Resolve exact content through configured readers only; never infer service absence or authority. */\nexport async function resolveObject(\n reference: ObjectReference,\n options: ResolveObjectOptions,\n): Promise<ObjectResolutionResult> {\n const expected = Object.freeze(ObjectReferenceZod.parse(reference))\n const limits = resolutionLimits(options.limits)\n const seeds = configuredSeeds(options.seeds, limits)\n const signal = options.signal\n const attempts: ResolutionAttempt[] = []\n if (signal?.aborted === true) return { status: 'aborted', attempts: Object.freeze(attempts) }\n\n const now = monotonicClock()\n const deadline = now() + limits.totalTimeoutMs\n const controller = new AbortController()\n const state: { terminal?: 'aborted' | 'deadline-exceeded' } = {}\n const terminate = (reason: 'aborted' | 'deadline-exceeded') => {\n if (state.terminal !== undefined) return\n state.terminal = reason\n controller.abort()\n }\n const onAbort = () => terminate('aborted')\n signal?.addEventListener('abort', onAbort, { once: true })\n const cancelTimer = scheduleDeadline(now, deadline, () => terminate('deadline-exceeded'))\n try {\n for (const seed of seeds) {\n if (now() >= deadline) terminate('deadline-exceeded')\n if (state.terminal !== undefined) break\n const result = await attemptSeed(seed, expected, limits, controller.signal, now, deadline)\n attempts.push(diagnostic(seed.id, result))\n if (now() >= deadline) terminate('deadline-exceeded')\n if (state.terminal !== undefined) break\n if (result.object !== undefined) {\n return Object.freeze({\n status: 'resolved',\n assurance: 'content-hash-verified',\n reference: result.object.reference,\n payload: result.object.payload,\n seedId: seed.id,\n attempts: Object.freeze([...attempts]),\n })\n }\n }\n if (state.terminal === 'aborted') return { status: 'aborted', attempts: Object.freeze([...attempts]) }\n return {\n status: 'unavailable',\n reason: state.terminal === 'deadline-exceeded' ? 'deadline-exceeded' : 'seeds-exhausted',\n attempts: Object.freeze([...attempts]),\n }\n } finally {\n cancelTimer()\n signal?.removeEventListener('abort', onAbort)\n }\n}\n", "/** Use the common runtime clock without introducing Node- or DOM-only ambient types. */\nexport function monotonicClock(): () => number {\n const clock: unknown = 'performance' in globalThis ? globalThis.performance : undefined\n if (typeof clock !== 'object' || clock === null || !('now' in clock) || typeof clock.now !== 'function') {\n throw new TypeError('Object resolution requires performance.now()')\n }\n const read = clock.now.bind(clock) as () => unknown\n return () => {\n const now = read()\n if (typeof now !== 'number' || !Number.isFinite(now)) throw new TypeError('Invalid monotonic clock')\n return now\n }\n}\n\n/** Native timers are wake-ups to check a deadline, not proof that its monotonic time has arrived. */\nexport function scheduleDeadline(now: () => number, deadline: number, expired: () => void): () => void {\n let cancelled = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const tick = () => {\n if (cancelled) return\n if (now() >= deadline) {\n cancelled = true\n expired()\n } else {\n arm()\n }\n }\n const arm = () => {\n // Round up and recheck: timer implementations may truncate delays or wake before the deadline.\n const delay = Math.min(MAX_TIMER_DELAY_MS, Math.max(1, Math.ceil(deadline - now())))\n timer = setTimeout(tick, delay)\n }\n arm()\n return () => {\n cancelled = true\n clearTimeout(timer)\n }\n}\nimport { MAX_TIMER_DELAY_MS } from './limits.js'\n", "import { isAnyPayload, PayloadBuilder } from '@xyo-network/sdk-protocol'\nimport type { ObjectReference } from '@xyo-network/service-kit-schemas'\nimport {\n DataLakeLocatorSchema, DataLakeLocatorZod,\n ObjectReferenceZod,\n ServiceAdvertisementSchema, ServiceAdvertisementZod,\n} from '@xyo-network/service-kit-schemas'\n\nimport { ObjectInputError, snapshotJson } from './jsonSnapshot.js'\nimport { verificationLimits } from './limits.js'\nimport type {\n ContentPayload, ObjectVerificationResult, VerificationLimits,\n} from './types.js'\n\n/** Verify content only. No Claim, lifecycle, publisher authority, or freshness is established. */\nexport async function verifyObject(\n reference: ObjectReference,\n candidate: unknown,\n options: Partial<VerificationLimits> = {},\n): Promise<ObjectVerificationResult> {\n const expected = Object.freeze(ObjectReferenceZod.parse(reference))\n const limits = verificationLimits(options)\n try {\n const snapshot = snapshotJson(candidate, limits)\n if (snapshot === null || typeof snapshot !== 'object' || Array.isArray(snapshot)) {\n return { status: 'invalid', reason: 'not-payload' }\n }\n // Metadata is bounded JSON input, but cannot decide the committed Payload representation.\n const data = PayloadBuilder.omitMeta(snapshot)\n // Use a guard, never a parser that strips unknown fields before hashing.\n if (!isAnyPayload(data)) return { status: 'invalid', reason: 'not-payload' }\n const actualHash = await PayloadBuilder.dataHash(data)\n if (actualHash !== expected.dataHash) return { status: 'invalid', reason: 'hash-mismatch' }\n if (data.schema !== expected.schema) return { status: 'invalid', reason: 'schema-mismatch' }\n\n // These are strict validators without coercion, defaults, or transformations.\n // Hash the complete data first, and return the data rather than a parser projection.\n if (data.schema === ServiceAdvertisementSchema && !ServiceAdvertisementZod.safeParse(data).success) {\n return { status: 'invalid', reason: 'invalid-descriptor' }\n }\n if (data.schema === DataLakeLocatorSchema && !DataLakeLocatorZod.safeParse(data).success) {\n return { status: 'invalid', reason: 'invalid-descriptor' }\n }\n const payload = snapshotJson(data, limits) as ContentPayload\n return Object.freeze({\n status: 'verified', assurance: 'content-hash-verified', reference: expected, payload,\n })\n } catch (error) {\n return {\n status: 'invalid',\n reason: error instanceof ObjectInputError ? error.reason : 'invalid-json',\n }\n }\n}\n", "import type {\n JsonValue, ObjectVerificationFailureReason, VerificationLimits,\n} from './types.js'\n\nexport class ObjectInputError extends Error {\n readonly reason: ObjectVerificationFailureReason\n\n constructor(reason: ObjectVerificationFailureReason) {\n super(reason)\n this.name = 'ObjectInputError'\n this.reason = reason\n }\n}\n\ninterface Budget {\n readonly ancestors: WeakSet<object>\n bytes: number\n readonly limits: VerificationLimits\n nodes: number\n}\n\nconst encoder = new TextEncoder()\n\nfunction spend(budget: Budget, bytes: number) {\n budget.bytes += bytes\n if (budget.bytes > budget.limits.maxBodyBytes) throw new ObjectInputError('body-too-large')\n}\n\nfunction textSize(budget: Budget, text: string) {\n // Reject an oversized string before allocating its serialized/encoded copy.\n if (text.length > budget.limits.maxBodyBytes - budget.bytes) throw new ObjectInputError('body-too-large')\n spend(budget, encoder.encode(JSON.stringify(text)).byteLength)\n}\n\nfunction propertyValue(object: object, key: string): unknown {\n const descriptor = Object.getOwnPropertyDescriptor(object, key)\n if (descriptor?.enumerable !== true || !('value' in descriptor)) {\n throw new ObjectInputError('invalid-json')\n }\n return descriptor.value\n}\n\nfunction snapshotArray(value: unknown[], budget: Budget, depth: number): readonly JsonValue[] {\n if (Object.getPrototypeOf(value) !== Array.prototype) throw new ObjectInputError('invalid-json')\n if (value.length > budget.limits.maxNodes - budget.nodes) throw new ObjectInputError('structure-limit')\n // JSON arrays cannot carry holes, symbols, accessors, or extra object fields.\n if (Reflect.ownKeys(value).length !== value.length + 1) throw new ObjectInputError('invalid-json')\n spend(budget, 2)\n const output: JsonValue[] = []\n for (let index = 0; index < value.length; index++) {\n if (index > 0) spend(budget, 1)\n output.push(snapshotValue(propertyValue(value, String(index)), budget, depth + 1))\n }\n return Object.freeze(output)\n}\n\nfunction snapshotObject(value: object, budget: Budget, depth: number): JsonValue {\n const prototype: unknown = Object.getPrototypeOf(value)\n if (prototype !== null && prototype !== Object.prototype) throw new ObjectInputError('invalid-json')\n const keys = Reflect.ownKeys(value)\n if (keys.length > budget.limits.maxNodes - budget.nodes) throw new ObjectInputError('structure-limit')\n spend(budget, 2)\n const entries: [string, JsonValue][] = []\n for (const key of keys) {\n // The SDK's object reconstruction cannot bind a literal __proto__ key reliably.\n if (typeof key !== 'string' || key === '__proto__') throw new ObjectInputError('invalid-json')\n if (entries.length > 0) spend(budget, 1)\n textSize(budget, key)\n spend(budget, 1)\n entries.push([key, snapshotValue(propertyValue(value, key), budget, depth + 1)])\n }\n // Construct own data properties without interpreting object keys as setters.\n return Object.freeze(Object.fromEntries(entries))\n}\n\nfunction snapshotValue(value: unknown, budget: Budget, depth: number): JsonValue {\n budget.nodes++\n if (depth > budget.limits.maxDepth || budget.nodes > budget.limits.maxNodes) {\n throw new ObjectInputError('structure-limit')\n }\n if (value === null) {\n spend(budget, 4)\n return null\n }\n switch (typeof value) {\n case 'string': {\n textSize(budget, value)\n return value\n }\n case 'boolean': {\n spend(budget, value ? 4 : 5)\n return value\n }\n case 'number': {\n if (!Number.isFinite(value)) throw new ObjectInputError('invalid-json')\n spend(budget, JSON.stringify(value).length)\n return value\n }\n case 'object': {\n if (budget.ancestors.has(value)) throw new ObjectInputError('invalid-json')\n budget.ancestors.add(value)\n try {\n return Array.isArray(value)\n ? snapshotArray(value, budget, depth)\n : snapshotObject(value, budget, depth)\n } finally {\n budget.ancestors.delete(value)\n }\n }\n default: {\n throw new ObjectInputError('invalid-json')\n }\n }\n}\n\n/** Bounded, immutable JSON copy. This is not a replacement canonicalization algorithm. */\nexport function snapshotJson(candidate: unknown, limits: VerificationLimits): JsonValue {\n return snapshotValue(candidate, {\n limits, ancestors: new WeakSet<object>(), bytes: 0, nodes: 0,\n }, 0)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["ObjectReferenceZod", "ObjectReferenceZod"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resolveObject.d.ts","sourceRoot":"","sources":["../../src/resolveObject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAKvE,OAAO,KAAK,EAGV,sBAAsB,EAItB,oBAAoB,EAErB,MAAM,YAAY,CAAA;AA8HnB,uGAAuG;AACvG,wBAAsB,aAAa,CACjC,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,sBAAsB,CAAC,CAiDjC"}
1
+ {"version":3,"file":"resolveObject.d.ts","sourceRoot":"","sources":["../../src/resolveObject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAKvE,OAAO,KAAK,EAGV,sBAAsB,EAItB,oBAAoB,EAErB,MAAM,YAAY,CAAA;AAsInB,uGAAuG;AACvG,wBAAsB,aAAa,CACjC,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,sBAAsB,CAAC,CAiDjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"verifyObject.d.ts","sourceRoot":"","sources":["../../src/verifyObject.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AASvE,OAAO,KAAK,EACM,wBAAwB,EAAE,kBAAkB,EAC7D,MAAM,YAAY,CAAA;AAEnB,kGAAkG;AAClG,wBAAsB,YAAY,CAChC,SAAS,EAAE,eAAe,EAC1B,SAAS,EAAE,OAAO,EAClB,OAAO,GAAE,OAAO,CAAC,kBAAkB,CAAM,GACxC,OAAO,CAAC,wBAAwB,CAAC,CA8BnC"}
1
+ {"version":3,"file":"verifyObject.d.ts","sourceRoot":"","sources":["../../src/verifyObject.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AASvE,OAAO,KAAK,EACM,wBAAwB,EAAE,kBAAkB,EAC7D,MAAM,YAAY,CAAA;AAEnB,kGAAkG;AAClG,wBAAsB,YAAY,CAChC,SAAS,EAAE,eAAe,EAC1B,SAAS,EAAE,OAAO,EAClB,OAAO,GAAE,OAAO,CAAC,kBAAkB,CAAM,GACxC,OAAO,CAAC,wBAAwB,CAAC,CAkCnC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/service-kit-protocol",
3
- "version": "0.0.3",
3
+ "version": "0.2.0",
4
4
  "description": "Hash-verified public-object resolution through explicit seed readers",
5
5
  "license": "LGPL-3.0-only",
6
6
  "sideEffects": false,
@@ -18,23 +18,26 @@
18
18
  "README.md"
19
19
  ],
20
20
  "dependencies": {
21
- "@xyo-network/service-kit-schemas": "~0.0.3"
21
+ "@xyo-network/service-kit-schemas": "~0.2.0"
22
22
  },
23
23
  "devDependencies": {
24
- "@ariestools/lib-neutral": "~9.1.2",
25
- "@ariestools/toolchain": "~9.1.2",
26
- "@ariestools/tsconfig": "~9.1.2",
27
- "@xyo-network/sdk-protocol": "~7.3.3",
28
- "eslint": "~10.9.1",
24
+ "@ariestools/lib-neutral": "~10.1.0",
25
+ "@ariestools/toolchain": "~10.1.0",
26
+ "@ariestools/tsconfig": "~10.1.0",
27
+ "@xyo-network/sdk-protocol": "~8.0.1",
28
+ "eslint": "~10.12.0",
29
29
  "eslint-import-resolver-typescript": "~4.4.5",
30
30
  "typescript": "~6.0.3",
31
- "vite": "~8.2.2",
32
- "vitest": "~4.1.11",
33
- "zod": "~4.4.3"
31
+ "vite": "~8.3.2",
32
+ "vitest": "~5.0.3",
33
+ "zod": "~4.6.5"
34
34
  },
35
35
  "peerDependencies": {
36
- "@xyo-network/sdk-protocol": "^7.3",
37
- "zod": "^4.4"
36
+ "@xyo-network/sdk-protocol": "^8.0",
37
+ "zod": "^4.6"
38
+ },
39
+ "engines": {
40
+ "node": "^26"
38
41
  },
39
42
  "publishConfig": {
40
43
  "access": "public"