@xyo-network/domain-payload-plugin 6.1.0 → 7.0.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.
@@ -1,18 +1,86 @@
1
+ // src/DomainConfigPayload.ts
2
+ import {
3
+ zodAsFactory as zodAsFactory2,
4
+ zodIsFactory as zodIsFactory2,
5
+ zodToFactory as zodToFactory2
6
+ } from "@xylabs/sdk-js";
7
+ import { PayloadZodOfSchema as PayloadZodOfSchema2 } from "@xyo-network/payload-model";
8
+ import * as z2 from "zod/mini";
9
+
10
+ // src/DomainConfigSchema.ts
11
+ import { asSchema } from "@xyo-network/payload-model";
12
+ var DomainConfigSchema = asSchema("network.xyo.domain.config", true);
13
+
1
14
  // src/Payload.ts
2
- import { isPayloadOfSchemaType } from "@xyo-network/payload-model";
15
+ import {
16
+ zodAsFactory,
17
+ zodIsFactory,
18
+ zodToFactory
19
+ } from "@xylabs/sdk-js";
20
+ import { PayloadZodOfSchema } from "@xyo-network/payload-model";
21
+ import * as z from "zod/mini";
3
22
 
4
23
  // src/Schema.ts
5
- import { asSchema } from "@xyo-network/payload-model";
6
- var DomainSchema = asSchema("network.xyo.domain", true);
24
+ import { asSchema as asSchema2 } from "@xyo-network/payload-model";
25
+ var DomainSchema = asSchema2("network.xyo.domain", true);
7
26
 
8
27
  // src/Payload.ts
9
- var isDomainPayload = isPayloadOfSchemaType(DomainSchema);
28
+ var AliasZod = z.object({
29
+ /** huri to the aliased payload */
30
+ huri: z.string(),
31
+ /** canonical name (ex. network.xyo.example) */
32
+ name: z.optional(z.string())
33
+ });
34
+ var SchemaDefinitionZod = z.looseObject({ $id: z.optional(z.string()) });
35
+ var SchemaMapEntryZod = z.union([z.string(), SchemaDefinitionZod]);
36
+ var DomainConfigFieldsZod = z.object({
37
+ /** Additional config files [huri] [out] */
38
+ additional: z.optional(z.array(z.string())),
39
+ /** Values associated with this domain [out] */
40
+ aliases: z.optional(z.record(z.string(), AliasZod)),
41
+ /** Known networks [out] */
42
+ networks: z.optional(z.array(z.custom())),
43
+ /** Official schemas published by this domain, keyed by schema name [out] */
44
+ schemas: z.optional(z.record(z.string(), SchemaMapEntryZod))
45
+ });
46
+ var DomainPayloadZod = z.extend(PayloadZodOfSchema(DomainSchema), DomainConfigFieldsZod.shape);
47
+ var isDomainPayload = zodIsFactory(DomainPayloadZod);
48
+ var asDomainPayload = zodAsFactory(DomainPayloadZod, "asDomainPayload");
49
+ var toDomainPayload = zodToFactory(DomainPayloadZod, "toDomainPayload");
10
50
 
11
- // src/Plugin.ts
51
+ // src/DomainConfigPayload.ts
52
+ var DomainConfigPayloadZod = z2.extend(PayloadZodOfSchema2(DomainConfigSchema), DomainConfigFieldsZod.shape);
53
+ var isDomainConfigPayload = zodIsFactory2(DomainConfigPayloadZod);
54
+ var asDomainConfigPayload = zodAsFactory2(DomainConfigPayloadZod, "asDomainConfigPayload");
55
+ var toDomainConfigPayload = zodToFactory2(DomainConfigPayloadZod, "toDomainConfigPayload");
56
+
57
+ // src/DomainConfigPlugin.ts
12
58
  import { createPayloadPlugin } from "@xyo-network/payload-plugin";
13
59
 
60
+ // src/DomainConfigTemplate.ts
61
+ var domainConfigPayloadTemplate = () => ({
62
+ schema: DomainConfigSchema,
63
+ schemas: {
64
+ "com.example.inline": {
65
+ properties: { value: { type: "string" } },
66
+ type: "object"
67
+ },
68
+ "com.example.referenced": ""
69
+ }
70
+ });
71
+
72
+ // src/DomainConfigPlugin.ts
73
+ var DomainConfigPayloadPlugin = () => createPayloadPlugin({
74
+ schema: DomainConfigSchema,
75
+ template: domainConfigPayloadTemplate,
76
+ zod: DomainConfigPayloadZod
77
+ });
78
+
79
+ // src/Plugin.ts
80
+ import { createPayloadPlugin as createPayloadPlugin2 } from "@xyo-network/payload-plugin";
81
+
14
82
  // src/Template.ts
15
- import { asSchema as asSchema2 } from "@xyo-network/payload-model";
83
+ import { asSchema as asSchema3 } from "@xyo-network/payload-model";
16
84
  var domainConfigTemplate = () => ({
17
85
  aliases: { "com.example.id": { huri: "" } },
18
86
  networks: [
@@ -21,13 +89,13 @@ var domainConfigTemplate = () => ({
21
89
  nodes: [
22
90
  {
23
91
  name: "",
24
- schema: asSchema2("network.xyo.network.node", true),
92
+ schema: asSchema3("network.xyo.network.node", true),
25
93
  slug: "",
26
94
  type: "archivist",
27
95
  uri: ""
28
96
  }
29
97
  ],
30
- schema: asSchema2("network.xyo.network", true),
98
+ schema: asSchema3("network.xyo.network", true),
31
99
  slug: ""
32
100
  }
33
101
  ],
@@ -42,11 +110,53 @@ import {
42
110
  isBrowser,
43
111
  isString
44
112
  } from "@xylabs/sdk-js";
45
- import { isHash } from "@xylabs/sdk-js";
113
+ import { isHash as isHash2 } from "@xylabs/sdk-js";
46
114
  import { DnsRecordType, domainResolve } from "@xyo-network/dns";
47
115
  import { Huri } from "@xyo-network/huri";
48
116
  import { PayloadBuilder } from "@xyo-network/payload-builder";
49
117
  import { PayloadWrapper } from "@xyo-network/payload-wrapper";
118
+
119
+ // src/Resolution/XyoDnsRecords.ts
120
+ import { isHash } from "@xylabs/sdk-js";
121
+ var SCHEMA_KEY_PREFIX = "schema.";
122
+ function normalizeTxtData(data) {
123
+ const trimmed = data.trim();
124
+ if (trimmed.includes('"')) {
125
+ return [...trimmed.matchAll(/"([^"]*)"/g)].map((match) => match[1]).join("") || trimmed;
126
+ }
127
+ return trimmed;
128
+ }
129
+ function parseXyoTxtRecords(answers) {
130
+ const entries = (answers ?? []).map((answer) => answer.data).filter((data) => typeof data === "string").map(normalizeTxtData).toSorted();
131
+ const records = { legacyHashes: [], schemas: {} };
132
+ for (const entry of entries) {
133
+ if (isHash(entry)) {
134
+ records.legacyHashes.push(entry);
135
+ } else if (entry.startsWith(SCHEMA_KEY_PREFIX)) {
136
+ const separatorIndex = entry.indexOf("=");
137
+ if (separatorIndex > SCHEMA_KEY_PREFIX.length) {
138
+ const name = entry.slice(SCHEMA_KEY_PREFIX.length, separatorIndex);
139
+ const value = entry.slice(separatorIndex + 1);
140
+ if (name.length > 0 && value.length > 0) {
141
+ records.schemas[name] ??= value;
142
+ }
143
+ }
144
+ } else if (entry.startsWith("domain=")) {
145
+ const value = entry.slice("domain=".length);
146
+ if (value.length > 0) {
147
+ records.domain ??= value;
148
+ }
149
+ } else if (entry.startsWith("config=")) {
150
+ const value = entry.slice("config=".length);
151
+ if (value.length > 0) {
152
+ records.config ??= value;
153
+ }
154
+ }
155
+ }
156
+ return records;
157
+ }
158
+
159
+ // src/Wrapper.ts
50
160
  var DomainPayloadWrapper = class _DomainPayloadWrapper extends PayloadWrapper {
51
161
  aliases;
52
162
  static async discover(reverseDomainName, proxy) {
@@ -61,11 +171,13 @@ var DomainPayloadWrapper = class _DomainPayloadWrapper extends PayloadWrapper {
61
171
  }
62
172
  static async discoverDNSEntry(domain) {
63
173
  try {
64
- const hash = (await domainResolve(`_xyo.${domain}`, DnsRecordType.TXT))?.Answer?.[0]?.data;
65
- if (isHash(hash)) {
66
- const huri = new Huri(hash);
174
+ const answers = (await domainResolve(`_xyo.${domain}`, DnsRecordType.TXT))?.Answer;
175
+ const records = parseXyoTxtRecords(answers);
176
+ const candidates = [records.config, ...records.legacyHashes].filter((element) => isString(element));
177
+ for (const candidate of candidates) {
178
+ const huri = new Huri(candidate);
67
179
  const payload = await huri.fetch();
68
- if (isDomainPayload(payload)) {
180
+ if (isDomainPayload(payload) || isDomainConfigPayload(payload)) {
69
181
  return new _DomainPayloadWrapper(payload);
70
182
  }
71
183
  }
@@ -74,16 +186,19 @@ var DomainPayloadWrapper = class _DomainPayloadWrapper extends PayloadWrapper {
74
186
  }
75
187
  }
76
188
  static async discoverRootFile(domain, proxy) {
77
- return isBrowser() || isString(proxy) ? await this.discoverRootFileWithProxy(domain, proxy) : await this.discoverRootFileDirect(domain);
189
+ return await this.discoverRootFileDirect(domain) ?? (isBrowser() || isString(proxy) ? await this.discoverRootFileWithProxy(domain, proxy) : void 0);
78
190
  }
79
191
  static async discoverRootFileDirect(domain) {
80
- try {
81
- const response = await fetchJson(`https://${domain}/xyo-config.json`);
82
- if (response.data) {
83
- return new _DomainPayloadWrapper(response.data);
192
+ const urls = [`https://${domain}/xyo.json`, `https://xyo.${domain}/`, `https://${domain}/xyo-config.json`];
193
+ for (const url of urls) {
194
+ try {
195
+ const response = await fetchJson(url);
196
+ if (response.data) {
197
+ return new _DomainPayloadWrapper(response.data);
198
+ }
199
+ } catch {
200
+ console.log(`DomainConfig root file not found [${url}]`);
84
201
  }
85
- } catch {
86
- console.log(`DomainConfig root file not found [${domain}]`);
87
202
  }
88
203
  }
89
204
  static async discoverRootFileWithProxy(domain, proxy = "https://api.archivist.xyo.network/domain") {
@@ -126,22 +241,235 @@ var DomainPayloadWrapper = class _DomainPayloadWrapper extends PayloadWrapper {
126
241
  return (await this.getNetwork(hash))?.nodes?.find((payload) => payload.type === "archivist" ? payload : void 0)?.uri;
127
242
  }
128
243
  async getNetwork(hash) {
129
- return isHash(hash) ? await PayloadBuilder.findByDataHash(this.payload.networks, hash) : this.payload.networks?.[0];
244
+ return isHash2(hash) ? await PayloadBuilder.findByDataHash(this.payload.networks, hash) : this.payload.networks?.[0];
130
245
  }
131
246
  };
132
247
 
133
248
  // src/Plugin.ts
134
- var DomainPayloadPlugin = () => createPayloadPlugin({
249
+ var DomainPayloadPlugin = () => createPayloadPlugin2({
135
250
  schema: DomainSchema,
136
251
  template: domainConfigTemplate,
137
252
  wrap: (payload) => DomainPayloadWrapper.wrap(payload)
138
253
  });
254
+
255
+ // src/Resolution/DomainSchemaResolver.ts
256
+ import {
257
+ fetchJson as fetchJson2,
258
+ isBrowser as isBrowser2,
259
+ isString as isString2
260
+ } from "@xylabs/sdk-js";
261
+ import { DnsRecordType as DnsRecordType2, domainResolve as domainResolve2 } from "@xyo-network/dns";
262
+ import { Huri as Huri2 } from "@xyo-network/huri";
263
+ import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
264
+ import { isSchemaPayload, SchemaSchema } from "@xyo-network/schema-payload-plugin";
265
+ var DEFAULT_MAX_INDIRECTION_DEPTH = 3;
266
+ var DEFAULT_PROXY = "https://api.archivist.xyo.network/domain";
267
+ function candidateDomains(schemaName) {
268
+ const parts = schemaName.split(".");
269
+ const domains = [];
270
+ for (let i = 2; i <= parts.length; i++) {
271
+ domains.push(parts.slice(0, i).toReversed().join("."));
272
+ }
273
+ return domains;
274
+ }
275
+ function isSchemaInDomainNamespace(schemaName, domain) {
276
+ return candidateDomains(schemaName).some((candidate) => candidate === domain || domain.endsWith(`.${candidate}`));
277
+ }
278
+ function isValidSchemaName(schemaName) {
279
+ return schemaName.length > 0 && schemaName === schemaName.toLowerCase() && schemaName.split(".").length >= 3;
280
+ }
281
+ var DomainSchemaResolver = class {
282
+ async resolve(schemaName, options = {}) {
283
+ if (!isValidSchemaName(schemaName)) {
284
+ return { status: "not-published" };
285
+ }
286
+ const context = {
287
+ anyCleanAnswer: false,
288
+ archivistUri: options.archivistUri,
289
+ proxy: options.proxy,
290
+ visited: /* @__PURE__ */ new Set()
291
+ };
292
+ const depth = options.maxIndirectionDepth ?? DEFAULT_MAX_INDIRECTION_DEPTH;
293
+ for (const domain of candidateDomains(schemaName)) {
294
+ const resolved = await this.resolveAtDomain(domain, schemaName, depth, context);
295
+ if (resolved) {
296
+ return {
297
+ payload: resolved.payload,
298
+ source: resolved.source,
299
+ status: "resolved"
300
+ };
301
+ }
302
+ }
303
+ return { status: context.anyCleanAnswer ? "not-published" : "unreachable" };
304
+ }
305
+ /** Fetch a payload by hash (or HURI href) and verify it against the referenced hash */
306
+ async fetchPayload(hashOrHref, context, configFields) {
307
+ try {
308
+ const archivistUri = context.archivistUri ?? findArchivistUri(configFields);
309
+ const huri = new Huri2(hashOrHref, { archivistUri });
310
+ const payload = await huri.fetch();
311
+ if (!payload) {
312
+ context.anyCleanAnswer = true;
313
+ return void 0;
314
+ }
315
+ if (await PayloadBuilder2.dataHash(payload) !== huri.hash && await PayloadBuilder2.hash(payload) !== huri.hash) {
316
+ console.warn(`DomainSchemaResolver: hash mismatch for [${huri.hash}]`);
317
+ context.anyCleanAnswer = true;
318
+ return void 0;
319
+ }
320
+ return payload;
321
+ } catch {
322
+ return void 0;
323
+ }
324
+ }
325
+ async fetchSchemaPayloadByHash(hashOrHref, schemaName, context, configFields) {
326
+ const payload = await this.fetchPayload(hashOrHref, context, configFields);
327
+ if (isSchemaPayload(payload) && payload.definition.$id === schemaName) {
328
+ return payload;
329
+ }
330
+ }
331
+ lookupHash(fields, schemaName) {
332
+ const entry = fields.schemas?.[schemaName];
333
+ if (isString2(entry)) return entry;
334
+ const alias = fields.aliases?.[schemaName];
335
+ if (isString2(alias?.huri) && alias.huri.length > 0) return alias.huri;
336
+ }
337
+ /** Find the schema in a domain config document (schemas map first, then legacy aliases) */
338
+ async lookupInConfig(fields, schemaName, domain, mechanism, context, url) {
339
+ if (!fields) return void 0;
340
+ context.anyCleanAnswer = true;
341
+ const entry = fields.schemas?.[schemaName];
342
+ if (entry !== void 0 && !isString2(entry)) {
343
+ const payload = { definition: { ...entry, $id: schemaName }, schema: SchemaSchema };
344
+ return {
345
+ payload,
346
+ source: {
347
+ domain,
348
+ mechanism,
349
+ url
350
+ }
351
+ };
352
+ }
353
+ const hash = this.lookupHash(fields, schemaName);
354
+ if (isString2(hash)) {
355
+ const payload = await this.fetchSchemaPayloadByHash(hash, schemaName, context, fields);
356
+ if (payload) {
357
+ return {
358
+ payload,
359
+ source: {
360
+ domain,
361
+ hash: new Huri2(hash).hash,
362
+ mechanism,
363
+ url
364
+ }
365
+ };
366
+ }
367
+ }
368
+ }
369
+ async resolveAtDomain(domain, schemaName, depth, context) {
370
+ if (context.visited.has(domain)) return void 0;
371
+ context.visited.add(domain);
372
+ const dnsResolved = await this.resolveViaDns(domain, schemaName, depth, context);
373
+ if (dnsResolved) return dnsResolved;
374
+ const fileCandidates = [
375
+ [`https://${domain}/xyo.json`, "file-root"],
376
+ [`https://xyo.${domain}/`, "file-subdomain"],
377
+ [`https://${domain}/xyo-config.json`, "file-legacy"]
378
+ ];
379
+ let anyDirectTransportFailure = false;
380
+ for (const [url, mechanism] of fileCandidates) {
381
+ try {
382
+ const response = await fetchJson2(url);
383
+ context.anyCleanAnswer = true;
384
+ const resolved = await this.lookupInConfig(response.data ?? void 0, schemaName, domain, mechanism, context, url);
385
+ if (resolved) return resolved;
386
+ } catch {
387
+ anyDirectTransportFailure = true;
388
+ }
389
+ }
390
+ if (isString2(context.proxy) || isBrowser2() && anyDirectTransportFailure) {
391
+ const url = `${context.proxy ?? DEFAULT_PROXY}/${domain.split(".").toReversed().join(".")}`;
392
+ try {
393
+ const response = await fetchJson2(url);
394
+ context.anyCleanAnswer = true;
395
+ const resolved = await this.lookupInConfig(response.data?.data, schemaName, domain, "file-proxy", context, url);
396
+ if (resolved) return resolved;
397
+ } catch {
398
+ }
399
+ }
400
+ }
401
+ async resolveViaDns(domain, schemaName, depth, context) {
402
+ try {
403
+ const result = await domainResolve2(`_xyo.${domain}`, DnsRecordType2.TXT);
404
+ if (!result) return void 0;
405
+ context.anyCleanAnswer = true;
406
+ const records = parseXyoTxtRecords(result.Answer);
407
+ const schemaHash = records.schemas[schemaName];
408
+ if (isString2(schemaHash)) {
409
+ const payload = await this.fetchSchemaPayloadByHash(schemaHash, schemaName, context);
410
+ if (payload) {
411
+ return {
412
+ payload,
413
+ source: {
414
+ domain,
415
+ hash: new Huri2(schemaHash).hash,
416
+ mechanism: "dns-schema"
417
+ }
418
+ };
419
+ }
420
+ }
421
+ if (isString2(records.config)) {
422
+ const configPayload = await this.fetchPayload(records.config, context);
423
+ if (isDomainConfigPayload(configPayload) || isDomainPayload(configPayload)) {
424
+ const resolved = await this.lookupInConfig(configPayload, schemaName, domain, "dns-config", context);
425
+ if (resolved) return resolved;
426
+ }
427
+ }
428
+ if (isString2(records.domain) && depth > 0 && !context.visited.has(records.domain)) {
429
+ const resolved = await this.resolveAtDomain(records.domain, schemaName, depth - 1, context);
430
+ if (resolved) {
431
+ return { payload: resolved.payload, source: { ...resolved.source, mechanism: "dns-domain" } };
432
+ }
433
+ }
434
+ for (const legacyHash of records.legacyHashes) {
435
+ const legacyPayload = await this.fetchPayload(legacyHash, context);
436
+ if (isDomainPayload(legacyPayload) || isDomainConfigPayload(legacyPayload)) {
437
+ const resolved = await this.lookupInConfig(legacyPayload, schemaName, domain, "dns-legacy", context);
438
+ if (resolved) return resolved;
439
+ }
440
+ }
441
+ } catch {
442
+ }
443
+ }
444
+ };
445
+ function findArchivistUri(fields) {
446
+ return fields?.networks?.[0]?.nodes?.find((node) => node.type === "archivist")?.uri;
447
+ }
139
448
  export {
449
+ AliasZod,
450
+ DomainConfigFieldsZod,
451
+ DomainConfigPayloadPlugin,
452
+ DomainConfigPayloadZod,
453
+ DomainConfigSchema,
140
454
  DomainPayloadPlugin,
141
455
  DomainPayloadWrapper,
456
+ DomainPayloadZod,
142
457
  DomainSchema,
458
+ DomainSchemaResolver,
459
+ SchemaDefinitionZod,
460
+ SchemaMapEntryZod,
461
+ asDomainConfigPayload,
462
+ asDomainPayload,
463
+ candidateDomains,
143
464
  DomainPayloadPlugin as default,
465
+ domainConfigPayloadTemplate,
144
466
  domainConfigTemplate,
145
- isDomainPayload
467
+ isDomainConfigPayload,
468
+ isDomainPayload,
469
+ isSchemaInDomainNamespace,
470
+ normalizeTxtData,
471
+ parseXyoTxtRecords,
472
+ toDomainConfigPayload,
473
+ toDomainPayload
146
474
  };
147
475
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/Payload.ts", "../../src/Schema.ts", "../../src/Plugin.ts", "../../src/Template.ts", "../../src/Wrapper.ts"],
4
- "sourcesContent": ["import type { NetworkPayload } from '@xyo-network/network'\nimport { isPayloadOfSchemaType, type Payload } from '@xyo-network/payload-model'\n\nimport { DomainSchema } from './Schema.ts'\n\nexport interface Alias {\n /** @field huri to the aliased payload */\n huri: string\n /** @field canonical name (ex. network.xyo.example) */\n name?: string\n}\n\nexport type DomainPayload = Payload<{\n /** @field Additional config files [huri] [out] */\n additional?: string[]\n /** @field Values associated with this domain [out] */\n aliases?: Record<string, Alias>\n /** @field Known networks [out] */\n networks?: NetworkPayload[]\n}, DomainSchema>\n\nexport const isDomainPayload = isPayloadOfSchemaType<DomainPayload>(DomainSchema)\n", "import { asSchema } from '@xyo-network/payload-model'\n\nexport const DomainSchema = asSchema('network.xyo.domain', true)\nexport type DomainSchema = typeof DomainSchema\n", "import type { Payload } from '@xyo-network/payload-model'\nimport { createPayloadPlugin } from '@xyo-network/payload-plugin'\n\nimport type { DomainPayload } from './Payload.ts'\nimport { DomainSchema } from './Schema.ts'\nimport { domainConfigTemplate } from './Template.ts'\nimport { DomainPayloadWrapper } from './Wrapper.ts'\n\nexport const DomainPayloadPlugin = () =>\n createPayloadPlugin<DomainPayload>({\n schema: DomainSchema,\n template: domainConfigTemplate,\n wrap: (payload: Payload) => DomainPayloadWrapper.wrap(payload as DomainPayload),\n })\n", "import { asSchema } from '@xyo-network/payload-model'\n\nimport type { DomainPayload } from './Payload.ts'\nimport { DomainSchema } from './Schema.ts'\n\nexport const domainConfigTemplate = (): DomainPayload => ({\n aliases: { 'com.example.id': { huri: '' } },\n networks: [\n {\n name: '',\n nodes: [\n {\n name: '',\n schema: asSchema('network.xyo.network.node', true),\n slug: '',\n type: 'archivist',\n uri: '',\n },\n ],\n schema: asSchema('network.xyo.network', true),\n slug: '',\n },\n ],\n schema: DomainSchema,\n})\n", "import {\n Base, FetchClientError, fetchJson, isBrowser,\n isString,\n} from '@xylabs/sdk-js'\nimport { type Hash, isHash } from '@xylabs/sdk-js'\nimport type { ApiEnvelope } from '@xyo-network/api-models'\nimport { DnsRecordType, domainResolve } from '@xyo-network/dns'\nimport type { FetchedPayload, HuriOptions } from '@xyo-network/huri'\nimport { Huri } from '@xyo-network/huri'\nimport type { NetworkPayload } from '@xyo-network/network'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport {\n type Alias, type DomainPayload, isDomainPayload,\n} from './Payload.ts'\n\nexport interface FetchedAlias extends FetchedPayload {\n alias: Alias\n}\n\nexport class DomainPayloadWrapper<T extends DomainPayload = DomainPayload> extends PayloadWrapper<T> {\n aliases?: FetchedAlias[] | null\n\n static async discover(reverseDomainName: string, proxy?: string) {\n const parts = reverseDomainName.split('.')\n for (let i = 2; i <= parts.length; i++) {\n const domainToCheck = parts.filter((_, index) => index < i).toReversed().join('.')\n const result = (await this.discoverDNSEntry(domainToCheck)) ?? (await this.discoverRootFile(domainToCheck, proxy))\n if (result) {\n return result\n }\n }\n }\n\n static async discoverDNSEntry(domain: string) {\n try {\n const hash = (await domainResolve(`_xyo.${domain}`, DnsRecordType.TXT))?.Answer?.[0]?.data\n if (isHash(hash)) {\n const huri = new Huri(hash)\n const payload = (await huri.fetch())\n if (isDomainPayload(payload)) {\n return new DomainPayloadWrapper(payload)\n }\n }\n } catch {\n Base.defaultLogger?.log(`DomainConfig dns reading error entry not found [${domain}]`)\n }\n }\n\n static async discoverRootFile(domain: string, proxy?: string) {\n return isBrowser() || isString(proxy) ? await this.discoverRootFileWithProxy(domain, proxy) : await this.discoverRootFileDirect(domain)\n }\n\n static async discoverRootFileDirect(domain: string) {\n try {\n const response = await fetchJson<DomainPayload>(`https://${domain}/xyo-config.json`)\n if (response.data) {\n return new DomainPayloadWrapper(response.data)\n }\n } catch {\n console.log(`DomainConfig root file not found [${domain}]`)\n }\n }\n\n static async discoverRootFileWithProxy(domain: string, proxy = 'https://api.archivist.xyo.network/domain') {\n try {\n const requestUrl = `${proxy}/${domain.split('.').toReversed().join('.')}`\n const response = await fetchJson<ApiEnvelope<DomainPayload>>(requestUrl)\n if (response.data?.data) {\n return new DomainPayloadWrapper(response.data.data)\n }\n } catch (ex) {\n const status = ex instanceof FetchClientError ? ex.response.status : 'unknown'\n console.log(`DomainConfig root file not found using proxy [${domain}] [${status}]`)\n }\n }\n\n async fetch(networkSlug?: Hash) {\n await this.fetchAliases(networkSlug)\n }\n\n async fetchAliases(networkSlug?: Hash) {\n // set it to null to signify fetch ran\n this.aliases = null\n\n const archivistUri = await this.findArchivistUri(networkSlug)\n if (this.payload.aliases) {\n const fetchedAliases = await Promise.all(\n Object.entries(this.payload.aliases ?? {}).map(([, alias]) => {\n return this.fetchAlias(alias, { archivistUri })\n }),\n )\n // cast to FetchedPayload[] after we filter out any null/undefined entries\n this.aliases = fetchedAliases.filter(Boolean) as FetchedAlias[]\n }\n }\n\n private async fetchAlias(alias: Alias, huriOptions?: HuriOptions): Promise<FetchedAlias | null> {\n const huri = new Huri(alias.huri, huriOptions)\n const payload = await huri.fetch()\n return payload\n ? {\n alias, huri, payload: payload,\n }\n : null\n }\n\n private async findArchivistUri(hash?: Hash): Promise<string | undefined> {\n return (await this.getNetwork(hash))?.nodes?.find(payload => (payload.type === 'archivist' ? payload : undefined))?.uri\n }\n\n private async getNetwork(hash?: Hash): Promise<NetworkPayload | undefined> {\n return isHash(hash) ? await PayloadBuilder.findByDataHash(this.payload.networks, hash) : this.payload.networks?.[0]\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["asSchema", "asSchema"]
3
+ "sources": ["../../src/DomainConfigPayload.ts", "../../src/DomainConfigSchema.ts", "../../src/Payload.ts", "../../src/Schema.ts", "../../src/DomainConfigPlugin.ts", "../../src/DomainConfigTemplate.ts", "../../src/Plugin.ts", "../../src/Template.ts", "../../src/Wrapper.ts", "../../src/Resolution/XyoDnsRecords.ts", "../../src/Resolution/DomainSchemaResolver.ts"],
4
+ "sourcesContent": ["import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport { PayloadZodOfSchema } from '@xyo-network/payload-model'\nimport * as z from 'zod/mini'\n\nimport { DomainConfigSchema } from './DomainConfigSchema.ts'\nimport { DomainConfigFieldsZod } from './Payload.ts'\n\n/**\n * A domain's xyo config stored as an on-network payload, so it can be referenced from a\n * DNS TXT record by hash (config={hash}). Shares its field set with DomainPayload.\n */\nexport const DomainConfigPayloadZod = z.extend(PayloadZodOfSchema(DomainConfigSchema), DomainConfigFieldsZod.shape)\nexport type DomainConfigPayload = z.infer<typeof DomainConfigPayloadZod>\n\nexport const isDomainConfigPayload = zodIsFactory(DomainConfigPayloadZod)\nexport const asDomainConfigPayload = zodAsFactory(DomainConfigPayloadZod, 'asDomainConfigPayload')\nexport const toDomainConfigPayload = zodToFactory(DomainConfigPayloadZod, 'toDomainConfigPayload')\n", "import { asSchema } from '@xyo-network/payload-model'\n\nexport const DomainConfigSchema = asSchema('network.xyo.domain.config', true)\nexport type DomainConfigSchema = typeof DomainConfigSchema\n", "import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport type { NetworkPayload } from '@xyo-network/network'\nimport { PayloadZodOfSchema } from '@xyo-network/payload-model'\nimport * as z from 'zod/mini'\n\nimport { DomainSchema } from './Schema.ts'\n\nexport const AliasZod = z.object({\n /** huri to the aliased payload */\n huri: z.string(),\n /** canonical name (ex. network.xyo.example) */\n name: z.optional(z.string()),\n})\nexport type Alias = z.infer<typeof AliasZod>\n\n/**\n * An inline JSON Schema (draft-07) definition body. If $id is present it must equal the\n * schemas map key; resolvers overwrite $id from the key (the key is authoritative).\n */\nexport const SchemaDefinitionZod = z.looseObject({ $id: z.optional(z.string()) })\nexport type SchemaDefinition = z.infer<typeof SchemaDefinitionZod>\n\n/**\n * One entry in the schemas map: a string is a hash (or HURI href) of a\n * network.xyo.schema payload; an object is an inline JSON Schema definition.\n */\nexport const SchemaMapEntryZod = z.union([z.string(), SchemaDefinitionZod])\nexport type SchemaMapEntry = z.infer<typeof SchemaMapEntryZod>\n\nexport const DomainConfigFieldsZod = z.object({\n /** Additional config files [huri] [out] */\n additional: z.optional(z.array(z.string())),\n /** Values associated with this domain [out] */\n aliases: z.optional(z.record(z.string(), AliasZod)),\n /** Known networks [out] */\n networks: z.optional(z.array(z.custom<NetworkPayload>())),\n /** Official schemas published by this domain, keyed by schema name [out] */\n schemas: z.optional(z.record(z.string(), SchemaMapEntryZod)),\n})\nexport type DomainConfigFields = z.infer<typeof DomainConfigFieldsZod>\n\nexport const DomainPayloadZod = z.extend(PayloadZodOfSchema(DomainSchema), DomainConfigFieldsZod.shape)\nexport type DomainPayload = z.infer<typeof DomainPayloadZod>\n\nexport const isDomainPayload = zodIsFactory(DomainPayloadZod)\nexport const asDomainPayload = zodAsFactory(DomainPayloadZod, 'asDomainPayload')\nexport const toDomainPayload = zodToFactory(DomainPayloadZod, 'toDomainPayload')\n", "import { asSchema } from '@xyo-network/payload-model'\n\nexport const DomainSchema = asSchema('network.xyo.domain', true)\nexport type DomainSchema = typeof DomainSchema\n", "import { createPayloadPlugin } from '@xyo-network/payload-plugin'\n\nimport type { DomainConfigPayload } from './DomainConfigPayload.ts'\nimport { DomainConfigPayloadZod } from './DomainConfigPayload.ts'\nimport { DomainConfigSchema } from './DomainConfigSchema.ts'\nimport { domainConfigPayloadTemplate } from './DomainConfigTemplate.ts'\n\nexport const DomainConfigPayloadPlugin = () =>\n createPayloadPlugin<DomainConfigPayload>({\n schema: DomainConfigSchema,\n template: domainConfigPayloadTemplate,\n zod: DomainConfigPayloadZod,\n })\n", "import type { DomainConfigPayload } from './DomainConfigPayload.ts'\nimport { DomainConfigSchema } from './DomainConfigSchema.ts'\n\nexport const domainConfigPayloadTemplate = (): DomainConfigPayload => ({\n schema: DomainConfigSchema,\n schemas: {\n 'com.example.inline': {\n properties: { value: { type: 'string' } },\n type: 'object',\n },\n 'com.example.referenced': '',\n },\n})\n", "import type { Payload } from '@xyo-network/payload-model'\nimport { createPayloadPlugin } from '@xyo-network/payload-plugin'\n\nimport type { DomainPayload } from './Payload.ts'\nimport { DomainSchema } from './Schema.ts'\nimport { domainConfigTemplate } from './Template.ts'\nimport { DomainPayloadWrapper } from './Wrapper.ts'\n\nexport const DomainPayloadPlugin = () =>\n createPayloadPlugin<DomainPayload>({\n schema: DomainSchema,\n template: domainConfigTemplate,\n wrap: (payload: Payload) => DomainPayloadWrapper.wrap(payload as DomainPayload),\n })\n", "import { asSchema } from '@xyo-network/payload-model'\n\nimport type { DomainPayload } from './Payload.ts'\nimport { DomainSchema } from './Schema.ts'\n\nexport const domainConfigTemplate = (): DomainPayload => ({\n aliases: { 'com.example.id': { huri: '' } },\n networks: [\n {\n name: '',\n nodes: [\n {\n name: '',\n schema: asSchema('network.xyo.network.node', true),\n slug: '',\n type: 'archivist',\n uri: '',\n },\n ],\n schema: asSchema('network.xyo.network', true),\n slug: '',\n },\n ],\n schema: DomainSchema,\n})\n", "import {\n Base, FetchClientError, fetchJson, isBrowser,\n isString,\n} from '@xylabs/sdk-js'\nimport { type Hash, isHash } from '@xylabs/sdk-js'\nimport type { ApiEnvelope } from '@xyo-network/api-models'\nimport { DnsRecordType, domainResolve } from '@xyo-network/dns'\nimport type { FetchedPayload, HuriOptions } from '@xyo-network/huri'\nimport { Huri } from '@xyo-network/huri'\nimport type { NetworkPayload } from '@xyo-network/network'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport type { DomainConfigPayload } from './DomainConfigPayload.ts'\nimport { isDomainConfigPayload } from './DomainConfigPayload.ts'\nimport {\n type Alias, type DomainPayload, isDomainPayload,\n} from './Payload.ts'\nimport { parseXyoTxtRecords } from './Resolution/XyoDnsRecords.ts'\n\nexport interface FetchedAlias extends FetchedPayload {\n alias: Alias\n}\n\nexport class DomainPayloadWrapper<T extends DomainPayload | DomainConfigPayload = DomainPayload> extends PayloadWrapper<T> {\n aliases?: FetchedAlias[] | null\n\n static async discover(reverseDomainName: string, proxy?: string) {\n const parts = reverseDomainName.split('.')\n for (let i = 2; i <= parts.length; i++) {\n const domainToCheck = parts.filter((_, index) => index < i).toReversed().join('.')\n const result = (await this.discoverDNSEntry(domainToCheck)) ?? (await this.discoverRootFile(domainToCheck, proxy))\n if (result) {\n return result\n }\n }\n }\n\n static async discoverDNSEntry(domain: string) {\n try {\n const answers = (await domainResolve(`_xyo.${domain}`, DnsRecordType.TXT))?.Answer\n const records = parseXyoTxtRecords(answers)\n // a config={hash} record takes precedence over legacy bare-hash records (SPEC.md \u00A73.3)\n const candidates = [records.config, ...records.legacyHashes].filter(element => isString(element))\n for (const candidate of candidates) {\n const huri = new Huri(candidate)\n const payload = await huri.fetch()\n if (isDomainPayload(payload) || isDomainConfigPayload(payload)) {\n return new DomainPayloadWrapper(payload)\n }\n }\n } catch {\n Base.defaultLogger?.log(`DomainConfig dns reading error entry not found [${domain}]`)\n }\n }\n\n static async discoverRootFile(domain: string, proxy?: string) {\n // direct fetch first (xyo.json publishers are CORS-enabled per SPEC.md \u00A73.1),\n // then the archivist proxy for browsers or when a proxy is explicitly provided\n return (await this.discoverRootFileDirect(domain))\n ?? (isBrowser() || isString(proxy) ? await this.discoverRootFileWithProxy(domain, proxy) : undefined)\n }\n\n static async discoverRootFileDirect(domain: string) {\n const urls = [`https://${domain}/xyo.json`, `https://xyo.${domain}/`, `https://${domain}/xyo-config.json`]\n for (const url of urls) {\n try {\n const response = await fetchJson<DomainPayload>(url)\n if (response.data) {\n return new DomainPayloadWrapper(response.data)\n }\n } catch {\n console.log(`DomainConfig root file not found [${url}]`)\n }\n }\n }\n\n static async discoverRootFileWithProxy(domain: string, proxy = 'https://api.archivist.xyo.network/domain') {\n try {\n const requestUrl = `${proxy}/${domain.split('.').toReversed().join('.')}`\n const response = await fetchJson<ApiEnvelope<DomainPayload>>(requestUrl)\n if (response.data?.data) {\n return new DomainPayloadWrapper(response.data.data)\n }\n } catch (ex) {\n const status = ex instanceof FetchClientError ? ex.response.status : 'unknown'\n console.log(`DomainConfig root file not found using proxy [${domain}] [${status}]`)\n }\n }\n\n async fetch(networkSlug?: Hash) {\n await this.fetchAliases(networkSlug)\n }\n\n async fetchAliases(networkSlug?: Hash) {\n // set it to null to signify fetch ran\n this.aliases = null\n\n const archivistUri = await this.findArchivistUri(networkSlug)\n if (this.payload.aliases) {\n const fetchedAliases = await Promise.all(\n Object.entries(this.payload.aliases ?? {}).map(([, alias]) => {\n return this.fetchAlias(alias, { archivistUri })\n }),\n )\n // cast to FetchedPayload[] after we filter out any null/undefined entries\n this.aliases = fetchedAliases.filter(Boolean) as FetchedAlias[]\n }\n }\n\n private async fetchAlias(alias: Alias, huriOptions?: HuriOptions): Promise<FetchedAlias | null> {\n const huri = new Huri(alias.huri, huriOptions)\n const payload = await huri.fetch()\n return payload\n ? {\n alias, huri, payload: payload,\n }\n : null\n }\n\n private async findArchivistUri(hash?: Hash): Promise<string | undefined> {\n return (await this.getNetwork(hash))?.nodes?.find(payload => (payload.type === 'archivist' ? payload : undefined))?.uri\n }\n\n private async getNetwork(hash?: Hash): Promise<NetworkPayload | undefined> {\n return isHash(hash) ? await PayloadBuilder.findByDataHash(this.payload.networks, hash) : this.payload.networks?.[0]\n }\n}\n", "import { type Hash, isHash } from '@xylabs/sdk-js'\nimport type { GoogleDnsResultAnswer } from '@xyo-network/dns'\n\n/**\n * The parsed contents of the TXT record set at _xyo.{domain}. See SPEC.md \u00A73.3.\n */\nexport interface XyoDnsRecords {\n /** config={hash-or-huri} \u2014 hash of a network.xyo.domain.config (or legacy domain) payload */\n config?: string\n /** domain={other-domain} \u2014 the named domain is the schema authority for this domain */\n domain?: string\n /** bare 64-hex records \u2014 legacy hashes of network.xyo.domain payloads */\n legacyHashes: Hash[]\n /** schema.{name}={hash-or-huri} \u2014 per-schema hashes of network.xyo.schema payloads */\n schemas: Record<string, string>\n}\n\nconst SCHEMA_KEY_PREFIX = 'schema.'\n\n/**\n * Strip surrounding double quotes and join multi-string TXT data (\"abc\" \"def\" -> abcdef)\n * before grammar matching, per SPEC.md \u00A73.3.\n */\nexport function normalizeTxtData(data: string): string {\n const trimmed = data.trim()\n if (trimmed.includes('\"')) {\n return [...trimmed.matchAll(/\"([^\"]*)\"/g)].map(match => match[1]).join('') || trimmed\n }\n return trimmed\n}\n\n/**\n * Parse the TXT answers from a _xyo.{domain} query into the four record modes. Unknown\n * keys are ignored; duplicates resolve lexicographically-first so results are\n * deterministic regardless of DNS answer order.\n */\nexport function parseXyoTxtRecords(answers?: GoogleDnsResultAnswer[]): XyoDnsRecords {\n const entries = (answers ?? [])\n .map(answer => answer.data)\n .filter((data): data is string => typeof data === 'string')\n .map(normalizeTxtData)\n .toSorted()\n\n const records: XyoDnsRecords = { legacyHashes: [], schemas: {} }\n\n for (const entry of entries) {\n if (isHash(entry)) {\n records.legacyHashes.push(entry)\n } else if (entry.startsWith(SCHEMA_KEY_PREFIX)) {\n const separatorIndex = entry.indexOf('=')\n if (separatorIndex > SCHEMA_KEY_PREFIX.length) {\n const name = entry.slice(SCHEMA_KEY_PREFIX.length, separatorIndex)\n const value = entry.slice(separatorIndex + 1)\n if (name.length > 0 && value.length > 0) {\n records.schemas[name] ??= value\n }\n }\n } else if (entry.startsWith('domain=')) {\n const value = entry.slice('domain='.length)\n if (value.length > 0) {\n records.domain ??= value\n }\n } else if (entry.startsWith('config=')) {\n const value = entry.slice('config='.length)\n if (value.length > 0) {\n records.config ??= value\n }\n }\n // any other key: ignored for forward compatibility\n }\n\n return records\n}\n", "import {\n fetchJson, isBrowser, isString,\n} from '@xylabs/sdk-js'\nimport type { ApiEnvelope } from '@xyo-network/api-models'\nimport { DnsRecordType, domainResolve } from '@xyo-network/dns'\nimport { Huri } from '@xyo-network/huri'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { SchemaPayload } from '@xyo-network/schema-payload-plugin'\nimport { isSchemaPayload, SchemaSchema } from '@xyo-network/schema-payload-plugin'\n\nimport { isDomainConfigPayload } from '../DomainConfigPayload.ts'\nimport type { DomainConfigFields, DomainPayload } from '../Payload.ts'\nimport { isDomainPayload } from '../Payload.ts'\nimport type {\n ResolveSchemaOptions, SchemaResolution, SchemaResolutionMechanism, SchemaResolutionSource,\n} from './SchemaResolution.ts'\nimport { parseXyoTxtRecords } from './XyoDnsRecords.ts'\n\nconst DEFAULT_MAX_INDIRECTION_DEPTH = 3\nconst DEFAULT_PROXY = 'https://api.archivist.xyo.network/domain'\n\ninterface ResolveContext {\n /** at least one mechanism answered cleanly (NXDOMAIN, 404, config without the schema) */\n anyCleanAnswer: boolean\n archivistUri?: string\n proxy?: string\n visited: Set<string>\n}\n\ninterface Resolved {\n payload: SchemaPayload\n source: SchemaResolutionSource\n}\n\n/**\n * The candidate domains for a schema name, shortest first\n * (com.example.foo -> example.com, foo.example.com). See SPEC.md \u00A75.\n */\nexport function candidateDomains(schemaName: string): string[] {\n const parts = schemaName.split('.')\n const domains: string[] = []\n for (let i = 2; i <= parts.length; i++) {\n domains.push(parts.slice(0, i).toReversed().join('.'))\n }\n return domains\n}\n\n/**\n * Whether a schema name falls inside a domain's reverse-domain namespace: the name's\n * leading levels, reversed, equal the domain or a parent of it. See SPEC.md \u00A72.1.\n */\nexport function isSchemaInDomainNamespace(schemaName: string, domain: string): boolean {\n return candidateDomains(schemaName).some(candidate => candidate === domain || domain.endsWith(`.${candidate}`))\n}\n\nfunction isValidSchemaName(schemaName: string): boolean {\n return schemaName.length > 0 && schemaName === schemaName.toLowerCase() && schemaName.split('.').length >= 3\n}\n\n/**\n * Resolves a schema name to the domain-published authoritative schema definition by\n * walking the publication mechanisms in SPEC.md \u00A75: DNS TXT records at _xyo.{domain}\n * (per-schema, config hash, domain indirection, legacy bare hash), then the xyo.json\n * root file, the xyo. subdomain index, and the legacy xyo-config.json (with the\n * archivist proxy as browser fallback).\n */\nexport class DomainSchemaResolver {\n async resolve(schemaName: string, options: ResolveSchemaOptions = {}): Promise<SchemaResolution> {\n if (!isValidSchemaName(schemaName)) {\n return { status: 'not-published' }\n }\n const context: ResolveContext = {\n anyCleanAnswer: false,\n archivistUri: options.archivistUri,\n proxy: options.proxy,\n visited: new Set<string>(),\n }\n const depth = options.maxIndirectionDepth ?? DEFAULT_MAX_INDIRECTION_DEPTH\n for (const domain of candidateDomains(schemaName)) {\n const resolved = await this.resolveAtDomain(domain, schemaName, depth, context)\n if (resolved) {\n return {\n payload: resolved.payload, source: resolved.source, status: 'resolved',\n }\n }\n }\n return { status: context.anyCleanAnswer ? 'not-published' : 'unreachable' }\n }\n\n /** Fetch a payload by hash (or HURI href) and verify it against the referenced hash */\n protected async fetchPayload(\n hashOrHref: string,\n context: ResolveContext,\n configFields?: DomainConfigFields,\n ): Promise<Payload | undefined> {\n try {\n const archivistUri = context.archivistUri ?? findArchivistUri(configFields)\n const huri = new Huri(hashOrHref, { archivistUri })\n const payload = await huri.fetch()\n if (!payload) {\n context.anyCleanAnswer = true\n return undefined\n }\n // content-addressed integrity: the fetched payload must hash to the referenced hash\n if ((await PayloadBuilder.dataHash(payload)) !== huri.hash && (await PayloadBuilder.hash(payload)) !== huri.hash) {\n console.warn(`DomainSchemaResolver: hash mismatch for [${huri.hash}]`)\n context.anyCleanAnswer = true\n return undefined\n }\n return payload\n } catch {\n return undefined\n }\n }\n\n protected async fetchSchemaPayloadByHash(\n hashOrHref: string,\n schemaName: string,\n context: ResolveContext,\n configFields?: DomainConfigFields,\n ): Promise<SchemaPayload | undefined> {\n const payload = await this.fetchPayload(hashOrHref, context, configFields)\n if (isSchemaPayload(payload) && payload.definition.$id === schemaName) {\n return payload\n }\n }\n\n protected lookupHash(fields: DomainConfigFields, schemaName: string): string | undefined {\n const entry = fields.schemas?.[schemaName]\n if (isString(entry)) return entry\n const alias = fields.aliases?.[schemaName]\n if (isString(alias?.huri) && alias.huri.length > 0) return alias.huri\n }\n\n /** Find the schema in a domain config document (schemas map first, then legacy aliases) */\n protected async lookupInConfig(\n fields: DomainConfigFields | undefined,\n schemaName: string,\n domain: string,\n mechanism: SchemaResolutionMechanism,\n context: ResolveContext,\n url?: string,\n ): Promise<Resolved | undefined> {\n if (!fields) return undefined\n context.anyCleanAnswer = true\n // no namespace check here: the lookup key is the schema name being resolved, which\n // is in-namespace for candidate domains by construction, and a domain= delegation\n // intentionally lets the named authority publish the delegator's namespace\n const entry = fields.schemas?.[schemaName]\n if (entry !== undefined && !isString(entry)) {\n // inline definition: the map key is authoritative for $id\n const payload: SchemaPayload = { definition: { ...entry, $id: schemaName }, schema: SchemaSchema }\n return {\n payload,\n source: {\n domain, mechanism, url,\n },\n }\n }\n const hash = this.lookupHash(fields, schemaName)\n if (isString(hash)) {\n const payload = await this.fetchSchemaPayloadByHash(hash, schemaName, context, fields)\n if (payload) {\n return {\n payload,\n source: {\n domain, hash: new Huri(hash).hash, mechanism, url,\n },\n }\n }\n }\n }\n\n protected async resolveAtDomain(\n domain: string,\n schemaName: string,\n depth: number,\n context: ResolveContext,\n ): Promise<Resolved | undefined> {\n if (context.visited.has(domain)) return undefined\n context.visited.add(domain)\n\n // Stage A \u2014 DNS TXT records at _xyo.{domain}\n const dnsResolved = await this.resolveViaDns(domain, schemaName, depth, context)\n if (dnsResolved) return dnsResolved\n\n // Stages B/C/D \u2014 root file, subdomain index, legacy file\n const fileCandidates: [url: string, mechanism: SchemaResolutionMechanism][] = [\n [`https://${domain}/xyo.json`, 'file-root'],\n [`https://xyo.${domain}/`, 'file-subdomain'],\n [`https://${domain}/xyo-config.json`, 'file-legacy'],\n ]\n let anyDirectTransportFailure = false\n for (const [url, mechanism] of fileCandidates) {\n try {\n // fetchJson resolves (data: null) on HTTP error statuses and only throws on\n // transport failures (network down, CORS), so a return is always a clean answer\n const response = await fetchJson<DomainPayload>(url)\n context.anyCleanAnswer = true\n const resolved = await this.lookupInConfig(response.data ?? undefined, schemaName, domain, mechanism, context, url)\n if (resolved) return resolved\n } catch {\n anyDirectTransportFailure = true\n }\n }\n\n // Proxy fallback: always when a proxy is explicitly provided (legacy semantics),\n // or in browsers when direct fetches were blocked (e.g. CORS)\n if (isString(context.proxy) || (isBrowser() && anyDirectTransportFailure)) {\n const url = `${context.proxy ?? DEFAULT_PROXY}/${domain.split('.').toReversed().join('.')}`\n try {\n const response = await fetchJson<ApiEnvelope<DomainPayload>>(url)\n context.anyCleanAnswer = true\n const resolved = await this.lookupInConfig(response.data?.data, schemaName, domain, 'file-proxy', context, url)\n if (resolved) return resolved\n } catch {\n // transport failure: leave anyCleanAnswer untouched\n }\n }\n }\n\n protected async resolveViaDns(\n domain: string,\n schemaName: string,\n depth: number,\n context: ResolveContext,\n ): Promise<Resolved | undefined> {\n try {\n const result = await domainResolve(`_xyo.${domain}`, DnsRecordType.TXT)\n if (!result) return undefined\n context.anyCleanAnswer = true\n const records = parseXyoTxtRecords(result.Answer)\n\n // A1 \u2014 per-schema record\n const schemaHash = records.schemas[schemaName]\n if (isString(schemaHash)) {\n const payload = await this.fetchSchemaPayloadByHash(schemaHash, schemaName, context)\n if (payload) {\n return {\n payload,\n source: {\n domain, hash: new Huri(schemaHash).hash, mechanism: 'dns-schema',\n },\n }\n }\n }\n\n // A2 \u2014 config hash (terminal: the fetched config cannot delegate further)\n if (isString(records.config)) {\n const configPayload = await this.fetchPayload(records.config, context)\n if (isDomainConfigPayload(configPayload) || isDomainPayload(configPayload)) {\n const resolved = await this.lookupInConfig(configPayload, schemaName, domain, 'dns-config', context)\n if (resolved) return resolved\n }\n }\n\n // A3 \u2014 domain indirection\n if (isString(records.domain) && depth > 0 && !context.visited.has(records.domain)) {\n const resolved = await this.resolveAtDomain(records.domain, schemaName, depth - 1, context)\n if (resolved) {\n return { payload: resolved.payload, source: { ...resolved.source, mechanism: 'dns-domain' } }\n }\n }\n\n // A4 \u2014 legacy bare hash of a network.xyo.domain payload\n for (const legacyHash of records.legacyHashes) {\n const legacyPayload = await this.fetchPayload(legacyHash, context)\n if (isDomainPayload(legacyPayload) || isDomainConfigPayload(legacyPayload)) {\n const resolved = await this.lookupInConfig(legacyPayload, schemaName, domain, 'dns-legacy', context)\n if (resolved) return resolved\n }\n }\n } catch {\n // transport error: leave anyCleanAnswer untouched\n }\n }\n}\n\nfunction findArchivistUri(fields?: DomainConfigFields): string | undefined {\n return fields?.networks?.[0]?.nodes?.find(node => node.type === 'archivist')?.uri\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["zodAsFactory", "zodIsFactory", "zodToFactory", "PayloadZodOfSchema", "z", "asSchema", "PayloadZodOfSchema", "zodIsFactory", "zodAsFactory", "zodToFactory", "createPayloadPlugin", "asSchema", "asSchema", "isHash", "isHash", "createPayloadPlugin", "fetchJson", "isBrowser", "isString", "DnsRecordType", "domainResolve", "Huri", "PayloadBuilder", "Huri", "PayloadBuilder", "isString", "fetchJson", "isBrowser", "domainResolve", "DnsRecordType"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/domain-payload-plugin",
3
- "version": "6.1.0",
3
+ "version": "7.0.0",
4
4
  "description": "Typescript/Javascript Plugins for XYO Platform",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -34,24 +34,24 @@
34
34
  "README.md"
35
35
  ],
36
36
  "dependencies": {
37
- "@xyo-network/dns": "~6.1.0",
38
- "@xyo-network/huri": "~6.1.0",
39
- "@xyo-network/network": "~6.1.0",
40
- "@xyo-network/payload-builder": "~6.1.0",
41
- "@xyo-network/payload-model": "~6.1.0",
42
- "@xyo-network/payload-plugin": "~6.1.0",
43
- "@xyo-network/payload-wrapper": "~6.1.0"
37
+ "@xyo-network/dns": "~7.0.0",
38
+ "@xyo-network/huri": "~7.0.0",
39
+ "@xyo-network/payload-builder": "~7.0.0",
40
+ "@xyo-network/payload-model": "~7.0.0",
41
+ "@xyo-network/payload-plugin": "~7.0.0",
42
+ "@xyo-network/payload-wrapper": "~7.0.0",
43
+ "@xyo-network/schema-payload-plugin": "~7.0.0"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@bitauth/libauth": "~3.0.0",
47
47
  "@opentelemetry/api": "^1.9.1",
48
- "@opentelemetry/sdk-trace-base": "^2.7.1",
48
+ "@opentelemetry/sdk-trace-base": "^2.8.0",
49
49
  "@scure/base": "~2.2.0",
50
- "@xylabs/sdk-js": "^6.1.0",
51
- "@xylabs/threads": "^6.1.0",
50
+ "@xylabs/sdk-js": "^6.1.1",
51
+ "@xylabs/threads": "^6.1.1",
52
52
  "@xylabs/toolchain": "~8.1.20",
53
53
  "@xylabs/tsconfig": "~8.1.20",
54
- "@xylabs/vitest-extended": "^6.1.0",
54
+ "@xylabs/vitest-extended": "^6.1.1",
55
55
  "async-mutex": "^0.5.0",
56
56
  "debug": "^4.4.3",
57
57
  "eslint": "^10.4.1",
@@ -62,7 +62,8 @@
62
62
  "vite": "^8.0.16",
63
63
  "vitest": "~4.1.8",
64
64
  "zod": "^4.4.3",
65
- "@xyo-network/api-models": "~6.1.0"
65
+ "@xyo-network/api-models": "~7.0.0",
66
+ "@xyo-network/network": "~7.0.0"
66
67
  },
67
68
  "peerDependencies": {
68
69
  "@bitauth/libauth": "~3.0",