@xyo-network/service-kit-protocol 0.1.0 → 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
|
|
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,
|
|
97
|
+
boundary, dated verification results and remaining broader work.
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -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 !==
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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": ";AAEO,IAAM,qBAAqB;AAE3B,IAAM,8BAAkD,OAAO,OAAO;AAAA,EAC3E,cAAc;AAAA,EACd,UAAU;AAAA,EACV,UAAU;AACZ,CAAC;AAEM,IAAM,4BAA8C,OAAO,OAAO;AAAA,EACvE,GAAG;AAAA,EACH,UAAU;AAAA,EACV,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,gBAAgB;AAClB,CAAC;AAED,SAAS,gBAAgB,OAAe,MAAc;AACpD,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GAAG;AAC9C,UAAM,IAAI,WAAW,OAAO,kCAAkC;AAAA,EAChE;AACF;AAEO,SAAS,mBAAmB,UAAuC,CAAC,GAAuB;AAChG,QAAM,SAAS,EAAE,GAAG,6BAA6B,GAAG,QAAQ;AAC5D,kBAAgB,OAAO,cAAc,cAAc;AACnD,kBAAgB,OAAO,UAAU,UAAU;AAC3C,kBAAgB,OAAO,UAAU,UAAU;AAC3C,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEO,SAAS,iBAAiB,UAAqC,CAAC,GAAqB;AAC1F,QAAM,SAAS,EAAE,GAAG,2BAA2B,GAAG,QAAQ;AAC1D,qBAAmB,MAAM;AACzB,kBAAgB,OAAO,UAAU,UAAU;AAC3C,kBAAgB,OAAO,sBAAsB,sBAAsB;AACnE,kBAAgB,OAAO,kBAAkB,kBAAkB;AAC3D,kBAAgB,OAAO,gBAAgB,gBAAgB;AACvD,MAAI,OAAO,mBAAmB,sBAAsB,OAAO,iBAAiB,oBAAoB;AAC9F,UAAM,IAAI,WAAW,qDAAqD;AAAA,EAC5E;AACA,SAAO,OAAO,OAAO,MAAM;AAC7B;;;AC1CA,SAAS,sBAAAA,2BAA0B;;;ACA5B,SAAS,iBAA+B;AAC7C,QAAM,QAAiB,iBAAiB,aAAa,WAAW,cAAc;AAC9E,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,EAAE,SAAS,UAAU,OAAO,MAAM,QAAQ,YAAY;AACvG,UAAM,IAAI,UAAU,8CAA8C;AAAA,EACpE;AACA,QAAM,OAAO,MAAM,IAAI,KAAK,KAAK;AACjC,SAAO,MAAM;AACX,UAAM,MAAM,KAAK;AACjB,QAAI,OAAO,QAAQ,YAAY,CAAC,OAAO,SAAS,GAAG,EAAG,OAAM,IAAI,UAAU,yBAAyB;AACnG,WAAO;AAAA,EACT;AACF;AAGO,SAAS,iBAAiB,KAAmB,UAAkB,SAAiC;AACrG,MAAI,YAAY;AAChB,MAAI;AACJ,QAAM,OAAO,MAAM;AACjB,QAAI,UAAW;AACf,QAAI,IAAI,KAAK,UAAU;AACrB,kBAAY;AACZ,cAAQ;AAAA,IACV,OAAO;AACL,UAAI;AAAA,IACN;AAAA,EACF;AACA,QAAM,MAAM,MAAM;AAEhB,UAAM,QAAQ,KAAK,IAAI,oBAAoB,KAAK,IAAI,GAAG,KAAK,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC;AACnF,YAAQ,WAAW,MAAM,KAAK;AAAA,EAChC;AACA,MAAI;AACJ,SAAO,MAAM;AACX,gBAAY;AACZ,iBAAa,KAAK;AAAA,EACpB;AACF;;;ACrCA,SAAS,cAAc,sBAAsB;AAE7C;AAAA,EACE;AAAA,EAAuB;AAAA,EACvB;AAAA,EACA;AAAA,EAA4B;AAAA,OACvB;;;ACFA,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACjC;AAAA,EAET,YAAY,QAAyC;AACnD,UAAM,MAAM;AACZ,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AACF;AASA,IAAM,UAAU,IAAI,YAAY;AAEhC,SAAS,MAAM,QAAgB,OAAe;AAC5C,SAAO,SAAS;AAChB,MAAI,OAAO,QAAQ,OAAO,OAAO,aAAc,OAAM,IAAI,iBAAiB,gBAAgB;AAC5F;AAEA,SAAS,SAAS,QAAgB,MAAc;AAE9C,MAAI,KAAK,SAAS,OAAO,OAAO,eAAe,OAAO,MAAO,OAAM,IAAI,iBAAiB,gBAAgB;AACxG,QAAM,QAAQ,QAAQ,OAAO,KAAK,UAAU,IAAI,CAAC,EAAE,UAAU;AAC/D;AAEA,SAAS,cAAc,QAAgB,KAAsB;AAC3D,QAAM,aAAa,OAAO,yBAAyB,QAAQ,GAAG;AAC9D,MAAI,YAAY,eAAe,QAAQ,EAAE,WAAW,aAAa;AAC/D,UAAM,IAAI,iBAAiB,cAAc;AAAA,EAC3C;AACA,SAAO,WAAW;AACpB;AAEA,SAAS,cAAc,OAAkB,QAAgB,OAAqC;AAC5F,MAAI,OAAO,eAAe,KAAK,MAAM,MAAM,UAAW,OAAM,IAAI,iBAAiB,cAAc;AAC/F,MAAI,MAAM,SAAS,OAAO,OAAO,WAAW,OAAO,MAAO,OAAM,IAAI,iBAAiB,iBAAiB;AAEtG,MAAI,QAAQ,QAAQ,KAAK,EAAE,WAAW,MAAM,SAAS,EAAG,OAAM,IAAI,iBAAiB,cAAc;AACjG,QAAM,QAAQ,CAAC;AACf,QAAM,SAAsB,CAAC;AAC7B,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,QAAI,QAAQ,EAAG,OAAM,QAAQ,CAAC;AAC9B,WAAO,KAAK,cAAc,cAAc,OAAO,OAAO,KAAK,CAAC,GAAG,QAAQ,QAAQ,CAAC,CAAC;AAAA,EACnF;AACA,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEA,SAAS,eAAe,OAAe,QAAgB,OAA0B;AAC/E,QAAM,YAAqB,OAAO,eAAe,KAAK;AACtD,MAAI,cAAc,QAAQ,cAAc,OAAO,UAAW,OAAM,IAAI,iBAAiB,cAAc;AACnG,QAAM,OAAO,QAAQ,QAAQ,KAAK;AAClC,MAAI,KAAK,SAAS,OAAO,OAAO,WAAW,OAAO,MAAO,OAAM,IAAI,iBAAiB,iBAAiB;AACrG,QAAM,QAAQ,CAAC;AACf,QAAM,UAAiC,CAAC;AACxC,aAAW,OAAO,MAAM;AAEtB,QAAI,OAAO,QAAQ,YAAY,QAAQ,YAAa,OAAM,IAAI,iBAAiB,cAAc;AAC7F,QAAI,QAAQ,SAAS,EAAG,OAAM,QAAQ,CAAC;AACvC,aAAS,QAAQ,GAAG;AACpB,UAAM,QAAQ,CAAC;AACf,YAAQ,KAAK,CAAC,KAAK,cAAc,cAAc,OAAO,GAAG,GAAG,QAAQ,QAAQ,CAAC,CAAC,CAAC;AAAA,EACjF;AAEA,SAAO,OAAO,OAAO,OAAO,YAAY,OAAO,CAAC;AAClD;AAEA,SAAS,cAAc,OAAgB,QAAgB,OAA0B;AAC/E,SAAO;AACP,MAAI,QAAQ,OAAO,OAAO,YAAY,OAAO,QAAQ,OAAO,OAAO,UAAU;AAC3E,UAAM,IAAI,iBAAiB,iBAAiB;AAAA,EAC9C;AACA,MAAI,UAAU,MAAM;AAClB,UAAM,QAAQ,CAAC;AACf,WAAO;AAAA,EACT;AACA,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK,UAAU;AACb,eAAS,QAAQ,KAAK;AACtB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,WAAW;AACd,YAAM,QAAQ,QAAQ,IAAI,CAAC;AAC3B,aAAO;AAAA,IACT;AAAA,IACA,KAAK,UAAU;AACb,UAAI,CAAC,OAAO,SAAS,KAAK,EAAG,OAAM,IAAI,iBAAiB,cAAc;AACtE,YAAM,QAAQ,KAAK,UAAU,KAAK,EAAE,MAAM;AAC1C,aAAO;AAAA,IACT;AAAA,IACA,KAAK,UAAU;AACb,UAAI,OAAO,UAAU,IAAI,KAAK,EAAG,OAAM,IAAI,iBAAiB,cAAc;AAC1E,aAAO,UAAU,IAAI,KAAK;AAC1B,UAAI;AACF,eAAO,MAAM,QAAQ,KAAK,IACtB,cAAc,OAAO,QAAQ,KAAK,IAClC,eAAe,OAAO,QAAQ,KAAK;AAAA,MACzC,UAAE;AACA,eAAO,UAAU,OAAO,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,SAAS;AACP,YAAM,IAAI,iBAAiB,cAAc;AAAA,IAC3C;AAAA,EACF;AACF;AAGO,SAAS,aAAa,WAAoB,QAAuC;AACtF,SAAO,cAAc,WAAW;AAAA,IAC9B;AAAA,IAAQ,WAAW,oBAAI,QAAgB;AAAA,IAAG,OAAO;AAAA,IAAG,OAAO;AAAA,EAC7D,GAAG,CAAC;AACN;;;ADzGA,eAAsB,aACpB,WACA,WACA,UAAuC,CAAC,GACL;AACnC,QAAM,WAAW,OAAO,OAAO,mBAAmB,MAAM,SAAS,CAAC;AAClE,QAAM,SAAS,mBAAmB,OAAO;AACzC,MAAI;AACF,UAAM,WAAW,aAAa,WAAW,MAAM;AAC/C,QAAI,aAAa,QAAQ,OAAO,aAAa,YAAY,MAAM,QAAQ,QAAQ,GAAG;AAChF,aAAO,EAAE,QAAQ,WAAW,QAAQ,cAAc;AAAA,IACpD;AAEA,UAAM,OAAO,eAAe,SAAS,QAAQ;AAE7C,QAAI,CAAC,aAAa,IAAI,EAAG,QAAO,EAAE,QAAQ,WAAW,QAAQ,cAAc;AAC3E,UAAM,aAAa,MAAM,eAAe,SAAS,IAAI;AACrD,QAAI,eAAe,SAAS,SAAU,QAAO,EAAE,QAAQ,WAAW,QAAQ,gBAAgB;AAC1F,QAAI,KAAK,WAAW,SAAS,OAAQ,QAAO,EAAE,QAAQ,WAAW,QAAQ,kBAAkB;AAI3F,QAAI,KAAK,WAAW,8BAA8B,CAAC,wBAAwB,UAAU,IAAI,EAAE,SAAS;AAClG,aAAO,EAAE,QAAQ,WAAW,QAAQ,qBAAqB;AAAA,IAC3D;AACA,QAAI,KAAK,WAAW,yBAAyB,CAAC,mBAAmB,UAAU,IAAI,EAAE,SAAS;AACxF,aAAO,EAAE,QAAQ,WAAW,QAAQ,qBAAqB;AAAA,IAC3D;AACA,UAAM,UAAU,aAAa,MAAM,MAAM;AACzC,WAAO,OAAO,OAAO;AAAA,MACnB,QAAQ;AAAA,MAAY,WAAW;AAAA,MAAyB,WAAW;AAAA,MAAU;AAAA,IAC/E,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,iBAAiB,mBAAmB,MAAM,SAAS;AAAA,IAC7D;AAAA,EACF;AACF;;;AF9BA,SAAS,gBAAgB,OAAkC,QAA0B;AACnF,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,KAAK,MAAM,SAAS,OAAO,UAAU;AACjF,UAAM,IAAI,WAAW,qDAAqD;AAAA,EAC5E;AACA,QAAM,MAAM,oBAAI,IAAY;AAC5B,QAAM,aAAa,MAAM,IAAI,CAAC,SAAyC;AACrE,QAAI,OAAO,KAAK,OAAO,YAAY,KAAK,GAAG,WAAW,KAAK,KAAK,GAAG,SAAS,OAAO,KAAK,GAAG,KAAK,MAAM,KAAK,IAAI;AAC7G,YAAM,IAAI,UAAU,sEAAsE;AAAA,IAC5F;AACA,QAAI,IAAI,IAAI,KAAK,EAAE,EAAG,OAAM,IAAI,UAAU,yBAAyB;AACnE,QAAI,OAAO,KAAK,QAAQ,QAAQ,WAAY,OAAM,IAAI,UAAU,wCAAwC;AACxG,QAAI,IAAI,KAAK,EAAE;AAEf,WAAO,OAAO,OAAO;AAAA,MACnB,IAAI,KAAK;AAAA,MACT,QAAQ,OAAO,OAAO,EAAE,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;AAAA,IAClE,CAAC;AAAA,EACH,CAAC;AACD,WAAS,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS;AACtD,QAAI,CAAC,OAAO,OAAO,YAAY,KAAK,EAAG,OAAM,IAAI,UAAU,kDAAkD;AAAA,EAC/G;AACA,SAAO;AACT;AAEA,eAAe,eACb,MACA,WACA,QACA,QACA,SACqB;AACrB,MAAI,OAAO,QAAS,QAAO,EAAE,QAAQ,UAAU;AAC/C,MAAI,QAAQ,EAAG,QAAO,EAAE,QAAQ,UAAU;AAC1C,QAAM,WAAoB,MAAM,KAAK,OAAO,IAAI,CAAC,UAAU,QAAQ,GAAG,EAAE,QAAQ,cAAc,OAAO,aAAa,CAAC;AACnH,MAAI,OAAO,QAAS,QAAO,EAAE,QAAQ,UAAU;AAC/C,MAAI,QAAQ,EAAG,QAAO,EAAE,QAAQ,UAAU;AAC1C,MAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,QAAO,EAAE,QAAQ,qBAAqB;AACpE,QAAM,iBAAiB,SAAS;AAChC,MAAI,CAAC,OAAO,cAAc,cAAc,KAAK,iBAAiB,EAAG,QAAO,EAAE,QAAQ,qBAAqB;AACvG,MAAI,iBAAiB,OAAO,qBAAsB,QAAO,EAAE,QAAQ,sBAAsB;AACzF,MAAI,mBAAmB,EAAG,QAAO,EAAE,QAAQ,UAAU;AAErD,QAAM,aAAa,MAAM,KAAK,EAAE,QAAQ,eAAe,GAAG,CAAC,GAAG,UAAU,OAAO,yBAAyB,UAAU,OAAO,KAAK,CAAC,CAAC;AAChI,QAAM,oBAAuD,CAAC;AAC9D,aAAW,cAAc,YAAY;AACnC,QAAI,OAAO,QAAS,QAAO,EAAE,QAAQ,UAAU;AAC/C,QAAI,QAAQ,EAAG,QAAO,EAAE,QAAQ,UAAU;AAC1C,QAAI,eAAe,UAAa,EAAE,WAAW,aAAa;AACxD,wBAAkB,KAAK,cAAc;AACrC;AAAA,IACF;AACA,UAAM,YAAqB,WAAW;AACtC,UAAM,SAAS,MAAM,aAAa,WAAW,WAAW,MAAM;AAC9D,QAAI,OAAO,QAAS,QAAO,EAAE,QAAQ,UAAU;AAC/C,QAAI,QAAQ,EAAG,QAAO,EAAE,QAAQ,UAAU;AAC1C,QAAI,OAAO,WAAW,WAAY,QAAO;AAAA,MACvC,QAAQ;AAAA,MAAY,QAAQ;AAAA,MAAQ;AAAA,IACtC;AACA,sBAAkB,KAAK,OAAO,MAAM;AAAA,EACtC;AACA,SAAO,EAAE,QAAQ,kBAAkB,kBAAkB;AACvD;AAEA,SAAS,YACP,MACA,WACA,QACA,aACA,KACA,eACqB;AACrB,QAAM,WAAW,KAAK,IAAI,IAAI,IAAI,OAAO,kBAAkB,aAAa;AACxE,QAAM,UAAU,MAAM,IAAI,KAAK;AAC/B,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,aAAa,IAAI,gBAAgB;AACvC,QAAI,YAAY;AAChB,UAAM,SAAS,CAAC,WAAuB;AACrC,UAAI,UAAW;AAGf,YAAM,UAAsB,OAAO,WAAW,aAAa,QAAQ,IAAI,EAAE,QAAQ,UAAU,IAAI;AAC/F,kBAAY;AACZ,kBAAY;AACZ,kBAAY,oBAAoB,SAAS,OAAO;AAChD,UAAI,QAAQ,WAAW,UAAW,YAAW,MAAM;AACnD,cAAQ,OAAO;AAAA,IACjB;AACA,UAAM,UAAU,MAAM;AACpB,iBAAW,MAAM;AACjB,aAAO,EAAE,QAAQ,UAAU,CAAC;AAAA,IAC9B;AACA,UAAM,cAAc,iBAAiB,KAAK,UAAU,MAAM;AACxD,iBAAW,MAAM;AACjB,aAAO,EAAE,QAAQ,UAAU,CAAC;AAAA,IAC9B,CAAC;AACD,gBAAY,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAC7D,QAAI,YAAY,SAAS;AACvB,cAAQ;AACR;AAAA,IACF;AAGA,mBAAe,MAAM;AACnB,YAAM,YAAY;AAChB,YAAI;AACJ,YAAI;AACF,mBAAS,MAAM,eAAe,MAAM,WAAW,QAAQ,WAAW,QAAQ,OAAO;AAAA,QACnF,QAAQ;AACN,iBAAO,EAAE,QAAQ,eAAe,CAAC;AACjC;AAAA,QACF;AACA,eAAO,MAAM;AAAA,MACf,GAAG;AAAA,IACL,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,WAAW,QAAgB,QAAuC;AACzE,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,GAAI,OAAO,sBAAsB,UAAa,EAAE,mBAAmB,OAAO,OAAO,CAAC,GAAG,OAAO,iBAAiB,CAAC,EAAE;AAAA,EAClH,CAAC;AACH;AAGA,eAAsB,cACpB,WACA,SACiC;AACjC,QAAM,WAAW,OAAO,OAAOC,oBAAmB,MAAM,SAAS,CAAC;AAClE,QAAM,SAAS,iBAAiB,QAAQ,MAAM;AAC9C,QAAM,QAAQ,gBAAgB,QAAQ,OAAO,MAAM;AACnD,QAAM,SAAS,QAAQ;AACvB,QAAM,WAAgC,CAAC;AACvC,MAAI,QAAQ,YAAY,KAAM,QAAO,EAAE,QAAQ,WAAW,UAAU,OAAO,OAAO,QAAQ,EAAE;AAE5F,QAAM,MAAM,eAAe;AAC3B,QAAM,WAAW,IAAI,IAAI,OAAO;AAChC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAwD,CAAC;AAC/D,QAAM,YAAY,CAAC,WAA4C;AAC7D,QAAI,MAAM,aAAa,OAAW;AAClC,UAAM,WAAW;AACjB,eAAW,MAAM;AAAA,EACnB;AACA,QAAM,UAAU,MAAM,UAAU,SAAS;AACzC,UAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACzD,QAAM,cAAc,iBAAiB,KAAK,UAAU,MAAM,UAAU,mBAAmB,CAAC;AACxF,MAAI;AACF,eAAW,QAAQ,OAAO;AACxB,UAAI,IAAI,KAAK,SAAU,WAAU,mBAAmB;AACpD,UAAI,MAAM,aAAa,OAAW;AAClC,YAAM,SAAS,MAAM,YAAY,MAAM,UAAU,QAAQ,WAAW,QAAQ,KAAK,QAAQ;AACzF,eAAS,KAAK,WAAW,KAAK,IAAI,MAAM,CAAC;AACzC,UAAI,IAAI,KAAK,SAAU,WAAU,mBAAmB;AACpD,UAAI,MAAM,aAAa,OAAW;AAClC,UAAI,OAAO,WAAW,QAAW;AAC/B,eAAO,OAAO,OAAO;AAAA,UACnB,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,WAAW,OAAO,OAAO;AAAA,UACzB,SAAS,OAAO,OAAO;AAAA,UACvB,QAAQ,KAAK;AAAA,UACb,UAAU,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC;AAAA,QACvC,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,MAAM,aAAa,UAAW,QAAO,EAAE,QAAQ,WAAW,UAAU,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AACrG,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,MAAM,aAAa,sBAAsB,sBAAsB;AAAA,MACvE,UAAU,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC;AAAA,IACvC;AAAA,EACF,UAAE;AACA,gBAAY;AACZ,YAAQ,oBAAoB,SAAS,OAAO;AAAA,EAC9C;AACF;",
|
|
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;
|
|
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,
|
|
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.
|
|
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,17 +18,17 @@
|
|
|
18
18
|
"README.md"
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@xyo-network/service-kit-schemas": "~0.
|
|
21
|
+
"@xyo-network/service-kit-schemas": "~0.2.0"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@ariestools/lib-neutral": "~10.0
|
|
25
|
-
"@ariestools/toolchain": "~10.0
|
|
26
|
-
"@ariestools/tsconfig": "~10.0
|
|
24
|
+
"@ariestools/lib-neutral": "~10.1.0",
|
|
25
|
+
"@ariestools/toolchain": "~10.1.0",
|
|
26
|
+
"@ariestools/tsconfig": "~10.1.0",
|
|
27
27
|
"@xyo-network/sdk-protocol": "~8.0.1",
|
|
28
|
-
"eslint": "~10.
|
|
28
|
+
"eslint": "~10.12.0",
|
|
29
29
|
"eslint-import-resolver-typescript": "~4.4.5",
|
|
30
30
|
"typescript": "~6.0.3",
|
|
31
|
-
"vite": "~8.3.
|
|
31
|
+
"vite": "~8.3.2",
|
|
32
32
|
"vitest": "~5.0.3",
|
|
33
33
|
"zod": "~4.6.5"
|
|
34
34
|
},
|
|
@@ -36,6 +36,9 @@
|
|
|
36
36
|
"@xyo-network/sdk-protocol": "^8.0",
|
|
37
37
|
"zod": "^4.6"
|
|
38
38
|
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": "^26"
|
|
41
|
+
},
|
|
39
42
|
"publishConfig": {
|
|
40
43
|
"access": "public"
|
|
41
44
|
},
|