@xyo-network/domain-payload-plugin 7.0.3 → 7.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/neutral/DomainConfigPayload.d.ts +2 -2
- package/dist/neutral/Payload.d.ts +2 -2
- package/dist/neutral/Resolution/SchemaResolution.d.ts +1 -1
- package/dist/neutral/Resolution/SchemaResolution.d.ts.map +1 -1
- package/dist/neutral/Resolution/XyoDnsRecords.d.ts +1 -1
- package/dist/neutral/Resolution/XyoDnsRecords.d.ts.map +1 -1
- package/dist/neutral/Wrapper.d.ts +1 -1
- package/dist/neutral/Wrapper.d.ts.map +1 -1
- package/dist/neutral/index.mjs +6 -6
- package/dist/neutral/index.mjs.map +1 -1
- package/package.json +20 -18
|
@@ -117,7 +117,7 @@ export declare const asDomainConfigPayload: {
|
|
|
117
117
|
$id?: string | undefined;
|
|
118
118
|
}> | undefined;
|
|
119
119
|
}) | undefined;
|
|
120
|
-
<T>(value: T, assert: import("@xylabs/sdk
|
|
120
|
+
<T>(value: T, assert: import("@xylabs/sdk").ZodFactoryConfig): T & {
|
|
121
121
|
schema: "network.xyo.domain.config" & {
|
|
122
122
|
readonly __schema: true;
|
|
123
123
|
};
|
|
@@ -183,7 +183,7 @@ export declare const toDomainConfigPayload: {
|
|
|
183
183
|
$id?: string | undefined;
|
|
184
184
|
}> | undefined;
|
|
185
185
|
}) | undefined;
|
|
186
|
-
<T>(value: T, assert: import("@xylabs/sdk
|
|
186
|
+
<T>(value: T, assert: import("@xylabs/sdk").ZodFactoryConfig): T & {
|
|
187
187
|
schema: "network.xyo.domain.config" & {
|
|
188
188
|
readonly __schema: true;
|
|
189
189
|
};
|
|
@@ -180,7 +180,7 @@ export declare const asDomainPayload: {
|
|
|
180
180
|
$id?: string | undefined;
|
|
181
181
|
}> | undefined;
|
|
182
182
|
}) | undefined;
|
|
183
|
-
<T>(value: T, assert: import("@xylabs/sdk
|
|
183
|
+
<T>(value: T, assert: import("@xylabs/sdk").ZodFactoryConfig): T & {
|
|
184
184
|
schema: "network.xyo.domain" & {
|
|
185
185
|
readonly __schema: true;
|
|
186
186
|
};
|
|
@@ -246,7 +246,7 @@ export declare const toDomainPayload: {
|
|
|
246
246
|
$id?: string | undefined;
|
|
247
247
|
}> | undefined;
|
|
248
248
|
}) | undefined;
|
|
249
|
-
<T>(value: T, assert: import("@xylabs/sdk
|
|
249
|
+
<T>(value: T, assert: import("@xylabs/sdk").ZodFactoryConfig): T & {
|
|
250
250
|
schema: "network.xyo.domain" & {
|
|
251
251
|
readonly __schema: true;
|
|
252
252
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaResolution.d.ts","sourceRoot":"","sources":["../../../src/Resolution/SchemaResolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"SchemaResolution.d.ts","sourceRoot":"","sources":["../../../src/Resolution/SchemaResolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAEvE;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAC/B,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,gBAAgB,GAChB,aAAa,GACb,YAAY,CAAA;AAElB,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,eAAe,GAAG,aAAa,CAAA;AAEjF,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,SAAS,EAAE,yBAAyB,CAAA;IACpC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,MAAM,CAAC,EAAE,sBAAsB,CAAA;IAC/B,MAAM,EAAE,sBAAsB,CAAA;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,+FAA+F;IAC/F,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XyoDnsRecords.d.ts","sourceRoot":"","sources":["../../../src/Resolution/XyoDnsRecords.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAU,MAAM,
|
|
1
|
+
{"version":3,"file":"XyoDnsRecords.d.ts","sourceRoot":"","sources":["../../../src/Resolution/XyoDnsRecords.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAU,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yEAAyE;IACzE,YAAY,EAAE,IAAI,EAAE,CAAA;IACpB,sFAAsF;IACtF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,GAAG,aAAa,CAoCnF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Hash } from '@xylabs/sdk
|
|
1
|
+
import { type Hash } from '@xylabs/sdk';
|
|
2
2
|
import type { FetchedPayload } from '@xyo-network/huri';
|
|
3
3
|
import { PayloadWrapper } from '@xyo-network/payload-wrapper';
|
|
4
4
|
import type { DomainConfigPayload } from './DomainConfigPayload.ts';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Wrapper.d.ts","sourceRoot":"","sources":["../../src/Wrapper.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,IAAI,EAAU,MAAM,
|
|
1
|
+
{"version":3,"file":"Wrapper.d.ts","sourceRoot":"","sources":["../../src/Wrapper.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,IAAI,EAAU,MAAM,aAAa,CAAA;AAG/C,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,mBAAmB,CAAA;AAIpE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAE7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEnE,OAAO,EACL,KAAK,KAAK,EAAE,KAAK,aAAa,EAC/B,MAAM,cAAc,CAAA;AAGrB,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,KAAK,EAAE,KAAK,CAAA;CACb;AAED,qBAAa,oBAAoB,CAAC,CAAC,SAAS,aAAa,GAAG,mBAAmB,GAAG,aAAa,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IACxH,OAAO,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;WAElB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAWlD,gBAAgB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAkB/B,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAO/C,sBAAsB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAcrC,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAA6C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAa3F,UAAU;YAUV,gBAAgB;YAKhB,UAAU;IAIlB,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI;IAIxB,YAAY,CAAC,WAAW,CAAC,EAAE,IAAI;CAetC"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
zodAsFactory as zodAsFactory2,
|
|
4
4
|
zodIsFactory as zodIsFactory2,
|
|
5
5
|
zodToFactory as zodToFactory2
|
|
6
|
-
} from "@xylabs/sdk
|
|
6
|
+
} from "@xylabs/sdk";
|
|
7
7
|
import { PayloadZodOfSchema as PayloadZodOfSchema2 } from "@xyo-network/payload-model";
|
|
8
8
|
import * as z2 from "zod/mini";
|
|
9
9
|
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
zodAsFactory,
|
|
17
17
|
zodIsFactory,
|
|
18
18
|
zodToFactory
|
|
19
|
-
} from "@xylabs/sdk
|
|
19
|
+
} from "@xylabs/sdk";
|
|
20
20
|
import { PayloadZodOfSchema } from "@xyo-network/payload-model";
|
|
21
21
|
import * as z from "zod/mini";
|
|
22
22
|
|
|
@@ -115,15 +115,15 @@ import {
|
|
|
115
115
|
fetchJson,
|
|
116
116
|
isBrowser,
|
|
117
117
|
isString
|
|
118
|
-
} from "@xylabs/sdk
|
|
119
|
-
import { isHash as isHash2 } from "@xylabs/sdk
|
|
118
|
+
} from "@xylabs/sdk";
|
|
119
|
+
import { isHash as isHash2 } from "@xylabs/sdk";
|
|
120
120
|
import { DnsRecordType, domainResolve } from "@xyo-network/dns";
|
|
121
121
|
import { Huri } from "@xyo-network/huri";
|
|
122
122
|
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
123
123
|
import { PayloadWrapper } from "@xyo-network/payload-wrapper";
|
|
124
124
|
|
|
125
125
|
// src/Resolution/XyoDnsRecords.ts
|
|
126
|
-
import { isHash } from "@xylabs/sdk
|
|
126
|
+
import { isHash } from "@xylabs/sdk";
|
|
127
127
|
var SCHEMA_KEY_PREFIX = "schema.";
|
|
128
128
|
function normalizeTxtData(data) {
|
|
129
129
|
const trimmed = data.trim();
|
|
@@ -265,7 +265,7 @@ import {
|
|
|
265
265
|
fetchJson as fetchJson2,
|
|
266
266
|
isBrowser as isBrowser2,
|
|
267
267
|
isString as isString2
|
|
268
|
-
} from "@xylabs/sdk
|
|
268
|
+
} from "@xylabs/sdk";
|
|
269
269
|
import { DnsRecordType as DnsRecordType2, domainResolve as domainResolve2 } from "@xyo-network/dns";
|
|
270
270
|
import { Huri as Huri2 } from "@xyo-network/huri";
|
|
271
271
|
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
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\nconst stringZod = z.string()\nconst optionalStringArrayZod = z.optional(z.array(stringZod))\nconst optionalAliasRecordZod = z.optional(z.record(stringZod, AliasZod))\nconst networkPayloadZod = z.custom<NetworkPayload>()\nconst optionalNetworkPayloadArrayZod = z.optional(z.array(networkPayloadZod))\nconst optionalSchemaMapEntryRecordZod = z.optional(z.record(stringZod, SchemaMapEntryZod))\n\nexport const DomainConfigFieldsZod = z.object({\n /** Additional config files [huri] [out] */\n additional: optionalStringArrayZod,\n /** Values associated with this domain [out] */\n aliases: optionalAliasRecordZod,\n /** Known networks [out] */\n networks: optionalNetworkPayloadArrayZod,\n /** Official schemas published by this domain, keyed by schema name [out] */\n schemas: optionalSchemaMapEntryRecordZod,\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 { Answer } = (await domainResolve(`_xyo.${domain}`, DnsRecordType.TXT)) ?? {}\n const records = parseXyoTxtRecords(Answer)\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 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 const network = await this.getNetwork(hash)\n return network?.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 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.values(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", "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 const quotedParts = Array.from(trimmed.matchAll(/\"([^\"]*)\"/g), (match: RegExpMatchArray): string => match[1])\n return quotedParts.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((left, right) => left.localeCompare(right))\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 const huri = new Huri(hash)\n return {\n payload,\n source: {\n domain, hash: huri.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 const huri = new Huri(schemaHash)\n return {\n payload,\n source: {\n domain, hash: huri.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"],
|
|
4
|
+
"sourcesContent": ["import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk'\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'\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\nconst stringZod = z.string()\nconst optionalStringArrayZod = z.optional(z.array(stringZod))\nconst optionalAliasRecordZod = z.optional(z.record(stringZod, AliasZod))\nconst networkPayloadZod = z.custom<NetworkPayload>()\nconst optionalNetworkPayloadArrayZod = z.optional(z.array(networkPayloadZod))\nconst optionalSchemaMapEntryRecordZod = z.optional(z.record(stringZod, SchemaMapEntryZod))\n\nexport const DomainConfigFieldsZod = z.object({\n /** Additional config files [huri] [out] */\n additional: optionalStringArrayZod,\n /** Values associated with this domain [out] */\n aliases: optionalAliasRecordZod,\n /** Known networks [out] */\n networks: optionalNetworkPayloadArrayZod,\n /** Official schemas published by this domain, keyed by schema name [out] */\n schemas: optionalSchemaMapEntryRecordZod,\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'\nimport { type Hash, isHash } from '@xylabs/sdk'\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 { Answer } = (await domainResolve(`_xyo.${domain}`, DnsRecordType.TXT)) ?? {}\n const records = parseXyoTxtRecords(Answer)\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 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 const network = await this.getNetwork(hash)\n return network?.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 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.values(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", "import { type Hash, isHash } from '@xylabs/sdk'\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 const quotedParts = Array.from(trimmed.matchAll(/\"([^\"]*)\"/g), (match: RegExpMatchArray): string => match[1])\n return quotedParts.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((left, right) => left.localeCompare(right))\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'\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 const huri = new Huri(hash)\n return {\n payload,\n source: {\n domain, hash: huri.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 const huri = new Huri(schemaHash)\n return {\n payload,\n source: {\n domain, hash: huri.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
5
|
"mappings": "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",
|
|
6
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": "7.0.
|
|
3
|
+
"version": "7.0.4",
|
|
4
4
|
"description": "Typescript/Javascript Plugins for XYO Platform",
|
|
5
5
|
"homepage": "https://xyo.network",
|
|
6
6
|
"bugs": {
|
|
@@ -34,27 +34,29 @@
|
|
|
34
34
|
"README.md"
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@xyo-network/dns": "~7.0.
|
|
38
|
-
"@xyo-network/
|
|
39
|
-
"@xyo-network/
|
|
40
|
-
"@xyo-network/payload-
|
|
41
|
-
"@xyo-network/payload-
|
|
42
|
-
"@xyo-network/schema-payload-plugin": "~7.0.
|
|
43
|
-
"@xyo-network/payload-wrapper": "~7.0.
|
|
37
|
+
"@xyo-network/dns": "~7.0.4",
|
|
38
|
+
"@xyo-network/payload-builder": "~7.0.4",
|
|
39
|
+
"@xyo-network/huri": "~7.0.4",
|
|
40
|
+
"@xyo-network/payload-plugin": "~7.0.4",
|
|
41
|
+
"@xyo-network/payload-model": "~7.0.4",
|
|
42
|
+
"@xyo-network/schema-payload-plugin": "~7.0.4",
|
|
43
|
+
"@xyo-network/payload-wrapper": "~7.0.4"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@bitauth/libauth": "~3.0.0",
|
|
47
47
|
"@opentelemetry/api": "^1.9.1",
|
|
48
48
|
"@opentelemetry/sdk-trace-base": "^2.8.0",
|
|
49
49
|
"@scure/base": "~2.2.0",
|
|
50
|
-
"@xylabs/sdk
|
|
51
|
-
"@xylabs/threads": "
|
|
52
|
-
"@xylabs/toolchain": "~8.3
|
|
53
|
-
"@xylabs/tsconfig": "~8.3
|
|
54
|
-
"@xylabs/vitest-extended": "^
|
|
50
|
+
"@xylabs/sdk": "^7.0.1",
|
|
51
|
+
"@xylabs/threads": "~7.0.1",
|
|
52
|
+
"@xylabs/toolchain": "~8.5.3",
|
|
53
|
+
"@xylabs/tsconfig": "~8.5.3",
|
|
54
|
+
"@xylabs/vitest-extended": "^7.0.1",
|
|
55
55
|
"async-mutex": "^0.5.0",
|
|
56
|
+
"browserslist": "4.28.4",
|
|
56
57
|
"debug": "^4.4.3",
|
|
57
|
-
"eslint": "^10.
|
|
58
|
+
"eslint": "^10.6.0",
|
|
59
|
+
"eslint-import-resolver-typescript": "^4.4.5",
|
|
58
60
|
"ethers": "^6.17.0",
|
|
59
61
|
"hash-wasm": "~4.12.0",
|
|
60
62
|
"observable-fns": "^0.6.1",
|
|
@@ -62,16 +64,16 @@
|
|
|
62
64
|
"vite": "^8.1.0",
|
|
63
65
|
"vitest": "~4.1.9",
|
|
64
66
|
"zod": "^4.4.3",
|
|
65
|
-
"@xyo-network/api-models": "~7.0.
|
|
66
|
-
"@xyo-network/network": "~7.0.
|
|
67
|
+
"@xyo-network/api-models": "~7.0.4",
|
|
68
|
+
"@xyo-network/network": "~7.0.4"
|
|
67
69
|
},
|
|
68
70
|
"peerDependencies": {
|
|
69
71
|
"@bitauth/libauth": "~3.0",
|
|
70
72
|
"@opentelemetry/api": "^1.9",
|
|
71
73
|
"@opentelemetry/sdk-trace-base": "^2.7",
|
|
72
74
|
"@scure/base": "~2.2",
|
|
73
|
-
"@xylabs/sdk
|
|
74
|
-
"@xylabs/threads": "^
|
|
75
|
+
"@xylabs/sdk": "^7.0",
|
|
76
|
+
"@xylabs/threads": "^7.0",
|
|
75
77
|
"async-mutex": "^0.5",
|
|
76
78
|
"debug": "^4.4",
|
|
77
79
|
"ethers": "^6.16",
|