@xyo-network/domain-payload-plugin 6.0.9 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -1
- package/dist/neutral/DomainConfigPayload.d.ts +100 -0
- package/dist/neutral/DomainConfigPayload.d.ts.map +1 -0
- package/dist/neutral/DomainConfigPlugin.d.ts +16 -0
- package/dist/neutral/DomainConfigPlugin.d.ts.map +1 -0
- package/dist/neutral/DomainConfigSchema.d.ts +5 -0
- package/dist/neutral/DomainConfigSchema.d.ts.map +1 -0
- package/dist/neutral/DomainConfigTemplate.d.ts +3 -0
- package/dist/neutral/DomainConfigTemplate.d.ts.map +1 -0
- package/dist/neutral/Payload.d.ts +64 -17
- package/dist/neutral/Payload.d.ts.map +1 -1
- package/dist/neutral/Plugin.d.ts +15 -2
- package/dist/neutral/Plugin.d.ts.map +1 -1
- package/dist/neutral/Resolution/DomainSchemaResolver.d.ts +45 -0
- package/dist/neutral/Resolution/DomainSchemaResolver.d.ts.map +1 -0
- package/dist/neutral/Resolution/SchemaResolution.d.ts +27 -0
- package/dist/neutral/Resolution/SchemaResolution.d.ts.map +1 -0
- package/dist/neutral/Resolution/XyoDnsRecords.d.ts +27 -0
- package/dist/neutral/Resolution/XyoDnsRecords.d.ts.map +1 -0
- package/dist/neutral/Resolution/index.d.ts +4 -0
- package/dist/neutral/Resolution/index.d.ts.map +1 -0
- package/dist/neutral/Wrapper.d.ts +110 -6
- package/dist/neutral/Wrapper.d.ts.map +1 -1
- package/dist/neutral/index.d.ts +5 -0
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +341 -22
- package/dist/neutral/index.mjs.map +4 -4
- package/package.json +16 -19
package/README.md
CHANGED
|
@@ -7,6 +7,15 @@
|
|
|
7
7
|
|
|
8
8
|
> Typescript/Javascript Plugins for XYO Platform
|
|
9
9
|
|
|
10
|
+
Payload types and resolver for the XYO Domain Schema Authority system: domains publish
|
|
11
|
+
the official JSON schemas for their reverse-domain namespace via an `xyo.json` root file,
|
|
12
|
+
an `xyo.` subdomain, or `_xyo.{domain}` DNS TXT records (per-schema hashes, config-hash
|
|
13
|
+
indirection to a `network.xyo.domain.config` payload, or domain indirection), and
|
|
14
|
+
`DomainSchemaResolver` resolves a schema name to its authoritative definition.
|
|
15
|
+
|
|
16
|
+
See [SPEC.md](SPEC.md) for the authoritative specification (document format, DNS record
|
|
17
|
+
grammar, resolution algorithm, and verification semantics).
|
|
18
|
+
|
|
10
19
|
## Install
|
|
11
20
|
|
|
12
21
|
Using npm:
|
|
@@ -38,10 +47,12 @@ bun add {{name}}
|
|
|
38
47
|
|
|
39
48
|
See the [LICENSE](LICENSE) file for license rights and limitations (LGPL-3.0-only).
|
|
40
49
|
|
|
50
|
+
## Credits
|
|
41
51
|
|
|
52
|
+
[Made with 🔥 and ❄️ by XYO Foundation](https://xyo.network)
|
|
42
53
|
|
|
43
|
-
[logo]: https://cdn.xy.company/img/brand/XYO_full_colored.png
|
|
44
54
|
[npm-badge]: https://img.shields.io/npm/v/@xyo-network/domain-payload-plugin.svg
|
|
45
55
|
[npm-link]: https://www.npmjs.com/package/@xyo-network/domain-payload-plugin
|
|
46
56
|
[license-badge]: https://img.shields.io/npm/l/@xyo-network/domain-payload-plugin.svg
|
|
47
57
|
[license-link]: https://github.com/xylabs/sdk-js/blob/main/LICENSE
|
|
58
|
+
[logo]: https://cdn.xy.company/img/brand/XYO_full_colored.png
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import * as z from 'zod/mini';
|
|
2
|
+
/**
|
|
3
|
+
* A domain's xyo config stored as an on-network payload, so it can be referenced from a
|
|
4
|
+
* DNS TXT record by hash (config={hash}). Shares its field set with DomainPayload.
|
|
5
|
+
*/
|
|
6
|
+
export declare const DomainConfigPayloadZod: z.ZodMiniObject<{
|
|
7
|
+
schema: z.ZodMiniLiteral<"network.xyo.domain.config" & {
|
|
8
|
+
readonly __schema: true;
|
|
9
|
+
}>;
|
|
10
|
+
additional: z.ZodMiniOptional<z.ZodMiniArray<z.ZodMiniString<string>>>;
|
|
11
|
+
aliases: z.ZodMiniOptional<z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniObject<{
|
|
12
|
+
huri: z.ZodMiniString<string>;
|
|
13
|
+
name: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
14
|
+
}, z.core.$strip>>>;
|
|
15
|
+
networks: z.ZodMiniOptional<z.ZodMiniArray<z.ZodMiniCustom<import("@xyo-network/network").NetworkPayload, import("@xyo-network/network").NetworkPayload>>>;
|
|
16
|
+
schemas: z.ZodMiniOptional<z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniUnion<readonly [z.ZodMiniString<string>, z.ZodMiniObject<{
|
|
17
|
+
$id: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
18
|
+
}, z.core.$loose>]>>>;
|
|
19
|
+
}, z.core.$strip>;
|
|
20
|
+
export type DomainConfigPayload = z.infer<typeof DomainConfigPayloadZod>;
|
|
21
|
+
export declare const isDomainConfigPayload: <T>(value: T) => value is T & {
|
|
22
|
+
schema: "network.xyo.domain.config" & {
|
|
23
|
+
readonly __schema: true;
|
|
24
|
+
};
|
|
25
|
+
additional?: string[] | undefined;
|
|
26
|
+
aliases?: Record<string, {
|
|
27
|
+
huri: string;
|
|
28
|
+
name?: string | undefined;
|
|
29
|
+
}> | undefined;
|
|
30
|
+
networks?: import("@xyo-network/network").NetworkPayload[] | undefined;
|
|
31
|
+
schemas?: Record<string, string | {
|
|
32
|
+
[x: string]: unknown;
|
|
33
|
+
$id?: string | undefined;
|
|
34
|
+
}> | undefined;
|
|
35
|
+
};
|
|
36
|
+
export declare const asDomainConfigPayload: {
|
|
37
|
+
<T>(value: T): (T & {
|
|
38
|
+
schema: "network.xyo.domain.config" & {
|
|
39
|
+
readonly __schema: true;
|
|
40
|
+
};
|
|
41
|
+
additional?: string[] | undefined;
|
|
42
|
+
aliases?: Record<string, {
|
|
43
|
+
huri: string;
|
|
44
|
+
name?: string | undefined;
|
|
45
|
+
}> | undefined;
|
|
46
|
+
networks?: import("@xyo-network/network").NetworkPayload[] | undefined;
|
|
47
|
+
schemas?: Record<string, string | {
|
|
48
|
+
[x: string]: unknown;
|
|
49
|
+
$id?: string | undefined;
|
|
50
|
+
}> | undefined;
|
|
51
|
+
}) | undefined;
|
|
52
|
+
<T>(value: T, assert: import("@xylabs/sdk-js").ZodFactoryConfig): T & {
|
|
53
|
+
schema: "network.xyo.domain.config" & {
|
|
54
|
+
readonly __schema: true;
|
|
55
|
+
};
|
|
56
|
+
additional?: string[] | undefined;
|
|
57
|
+
aliases?: Record<string, {
|
|
58
|
+
huri: string;
|
|
59
|
+
name?: string | undefined;
|
|
60
|
+
}> | undefined;
|
|
61
|
+
networks?: import("@xyo-network/network").NetworkPayload[] | undefined;
|
|
62
|
+
schemas?: Record<string, string | {
|
|
63
|
+
[x: string]: unknown;
|
|
64
|
+
$id?: string | undefined;
|
|
65
|
+
}> | undefined;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
export declare const toDomainConfigPayload: {
|
|
69
|
+
<T>(value: T): (T & {
|
|
70
|
+
schema: "network.xyo.domain.config" & {
|
|
71
|
+
readonly __schema: true;
|
|
72
|
+
};
|
|
73
|
+
additional?: string[] | undefined;
|
|
74
|
+
aliases?: Record<string, {
|
|
75
|
+
huri: string;
|
|
76
|
+
name?: string | undefined;
|
|
77
|
+
}> | undefined;
|
|
78
|
+
networks?: import("@xyo-network/network").NetworkPayload[] | undefined;
|
|
79
|
+
schemas?: Record<string, string | {
|
|
80
|
+
[x: string]: unknown;
|
|
81
|
+
$id?: string | undefined;
|
|
82
|
+
}> | undefined;
|
|
83
|
+
}) | undefined;
|
|
84
|
+
<T>(value: T, assert: import("@xylabs/sdk-js").ZodFactoryConfig): T & {
|
|
85
|
+
schema: "network.xyo.domain.config" & {
|
|
86
|
+
readonly __schema: true;
|
|
87
|
+
};
|
|
88
|
+
additional?: string[] | undefined;
|
|
89
|
+
aliases?: Record<string, {
|
|
90
|
+
huri: string;
|
|
91
|
+
name?: string | undefined;
|
|
92
|
+
}> | undefined;
|
|
93
|
+
networks?: import("@xyo-network/network").NetworkPayload[] | undefined;
|
|
94
|
+
schemas?: Record<string, string | {
|
|
95
|
+
[x: string]: unknown;
|
|
96
|
+
$id?: string | undefined;
|
|
97
|
+
}> | undefined;
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=DomainConfigPayload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DomainConfigPayload.d.ts","sourceRoot":"","sources":["../../src/DomainConfigPayload.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAK7B;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;iBAAgF,CAAA;AACnH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAExE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;CAAuC,CAAA;AACzE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAgE,CAAA;AAClG,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAgE,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const DomainConfigPayloadPlugin: () => import("@xyo-network/payload-plugin").PayloadPlugin<{
|
|
2
|
+
schema: "network.xyo.domain.config" & {
|
|
3
|
+
readonly __schema: true;
|
|
4
|
+
};
|
|
5
|
+
additional?: string[] | undefined;
|
|
6
|
+
aliases?: Record<string, {
|
|
7
|
+
huri: string;
|
|
8
|
+
name?: string | undefined;
|
|
9
|
+
}> | undefined;
|
|
10
|
+
networks?: import("@xyo-network/network").NetworkPayload[] | undefined;
|
|
11
|
+
schemas?: Record<string, string | {
|
|
12
|
+
[x: string]: unknown;
|
|
13
|
+
$id?: string | undefined;
|
|
14
|
+
}> | undefined;
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=DomainConfigPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DomainConfigPlugin.d.ts","sourceRoot":"","sources":["../../src/DomainConfigPlugin.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;EAKlC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DomainConfigSchema.d.ts","sourceRoot":"","sources":["../../src/DomainConfigSchema.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB;;CAA8C,CAAA;AAC7E,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DomainConfigTemplate.d.ts","sourceRoot":"","sources":["../../src/DomainConfigTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAGnE,eAAO,MAAM,2BAA2B,QAAO,mBAS7C,CAAA"}
|
|
@@ -1,19 +1,66 @@
|
|
|
1
1
|
import type { NetworkPayload } from '@xyo-network/network';
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
2
|
+
import * as z from 'zod/mini';
|
|
3
|
+
export declare const AliasZod: z.ZodMiniObject<{
|
|
4
|
+
huri: z.ZodMiniString<string>;
|
|
5
|
+
name: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
export type Alias = z.infer<typeof AliasZod>;
|
|
8
|
+
/**
|
|
9
|
+
* An inline JSON Schema (draft-07) definition body. If $id is present it must equal the
|
|
10
|
+
* schemas map key; resolvers overwrite $id from the key (the key is authoritative).
|
|
11
|
+
*/
|
|
12
|
+
export declare const SchemaDefinitionZod: z.ZodMiniObject<{
|
|
13
|
+
$id: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
14
|
+
}, z.core.$loose>;
|
|
15
|
+
export type SchemaDefinition = z.infer<typeof SchemaDefinitionZod>;
|
|
16
|
+
/**
|
|
17
|
+
* One entry in the schemas map: a string is a hash (or HURI href) of a
|
|
18
|
+
* network.xyo.schema payload; an object is an inline JSON Schema definition.
|
|
19
|
+
*/
|
|
20
|
+
export declare const SchemaMapEntryZod: z.ZodMiniUnion<readonly [z.ZodMiniString<string>, z.ZodMiniObject<{
|
|
21
|
+
$id: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
22
|
+
}, z.core.$loose>]>;
|
|
23
|
+
export type SchemaMapEntry = z.infer<typeof SchemaMapEntryZod>;
|
|
24
|
+
export declare const DomainConfigFieldsZod: z.ZodMiniObject<{
|
|
25
|
+
additional: z.ZodMiniOptional<z.ZodMiniArray<z.ZodMiniString<string>>>;
|
|
26
|
+
aliases: z.ZodMiniOptional<z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniObject<{
|
|
27
|
+
huri: z.ZodMiniString<string>;
|
|
28
|
+
name: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
29
|
+
}, z.core.$strip>>>;
|
|
30
|
+
networks: z.ZodMiniOptional<z.ZodMiniArray<z.ZodMiniCustom<NetworkPayload, NetworkPayload>>>;
|
|
31
|
+
schemas: z.ZodMiniOptional<z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniUnion<readonly [z.ZodMiniString<string>, z.ZodMiniObject<{
|
|
32
|
+
$id: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
33
|
+
}, z.core.$loose>]>>>;
|
|
34
|
+
}, z.core.$strip>;
|
|
35
|
+
export type DomainConfigFields = z.infer<typeof DomainConfigFieldsZod>;
|
|
36
|
+
export declare const DomainPayloadZod: z.ZodMiniObject<{
|
|
37
|
+
schema: z.ZodMiniLiteral<"network.xyo.domain" & {
|
|
38
|
+
readonly __schema: true;
|
|
39
|
+
}>;
|
|
40
|
+
additional: z.ZodMiniOptional<z.ZodMiniArray<z.ZodMiniString<string>>>;
|
|
41
|
+
aliases: z.ZodMiniOptional<z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniObject<{
|
|
42
|
+
huri: z.ZodMiniString<string>;
|
|
43
|
+
name: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
44
|
+
}, z.core.$strip>>>;
|
|
45
|
+
networks: z.ZodMiniOptional<z.ZodMiniArray<z.ZodMiniCustom<NetworkPayload, NetworkPayload>>>;
|
|
46
|
+
schemas: z.ZodMiniOptional<z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniUnion<readonly [z.ZodMiniString<string>, z.ZodMiniObject<{
|
|
47
|
+
$id: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
48
|
+
}, z.core.$loose>]>>>;
|
|
49
|
+
}, z.core.$strip>;
|
|
50
|
+
export type DomainPayload = z.infer<typeof DomainPayloadZod>;
|
|
51
|
+
export declare const isDomainPayload: (x?: unknown) => x is {
|
|
52
|
+
schema: "network.xyo.domain" & {
|
|
53
|
+
readonly __schema: true;
|
|
54
|
+
};
|
|
55
|
+
additional?: string[] | undefined;
|
|
56
|
+
aliases?: Record<string, {
|
|
57
|
+
huri: string;
|
|
58
|
+
name?: string | undefined;
|
|
59
|
+
}> | undefined;
|
|
60
|
+
networks?: NetworkPayload[] | undefined;
|
|
61
|
+
schemas?: Record<string, string | {
|
|
62
|
+
[x: string]: unknown;
|
|
63
|
+
$id?: string | undefined;
|
|
64
|
+
}> | undefined;
|
|
65
|
+
};
|
|
19
66
|
//# sourceMappingURL=Payload.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Payload.d.ts","sourceRoot":"","sources":["../../src/Payload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"Payload.d.ts","sourceRoot":"","sources":["../../src/Payload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE1D,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAI7B,eAAO,MAAM,QAAQ;;;iBAKnB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAE5C;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;iBAAiD,CAAA;AACjF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAElE;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;mBAA6C,CAAA;AAC3E,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE9D,eAAO,MAAM,qBAAqB;;;;;;;;;;iBAShC,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEtE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;iBAA0E,CAAA;AACvG,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAI5D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;CAAqD,CAAA"}
|
package/dist/neutral/Plugin.d.ts
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export declare const DomainPayloadPlugin: () => import("@xyo-network/payload-plugin").PayloadPlugin<{
|
|
2
|
+
schema: "network.xyo.domain" & {
|
|
3
|
+
readonly __schema: true;
|
|
4
|
+
};
|
|
5
|
+
additional?: string[] | undefined;
|
|
6
|
+
aliases?: Record<string, {
|
|
7
|
+
huri: string;
|
|
8
|
+
name?: string | undefined;
|
|
9
|
+
}> | undefined;
|
|
10
|
+
networks?: import("@xyo-network/network").NetworkPayload[] | undefined;
|
|
11
|
+
schemas?: Record<string, string | {
|
|
12
|
+
[x: string]: unknown;
|
|
13
|
+
$id?: string | undefined;
|
|
14
|
+
}> | undefined;
|
|
15
|
+
}>;
|
|
3
16
|
//# sourceMappingURL=Plugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;EAK5B,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Payload } from '@xyo-network/payload-model';
|
|
2
|
+
import type { SchemaPayload } from '@xyo-network/schema-payload-plugin';
|
|
3
|
+
import type { DomainConfigFields } from '../Payload.ts';
|
|
4
|
+
import type { ResolveSchemaOptions, SchemaResolution, SchemaResolutionMechanism, SchemaResolutionSource } from './SchemaResolution.ts';
|
|
5
|
+
interface ResolveContext {
|
|
6
|
+
/** at least one mechanism answered cleanly (NXDOMAIN, 404, config without the schema) */
|
|
7
|
+
anyCleanAnswer: boolean;
|
|
8
|
+
archivistUri?: string;
|
|
9
|
+
proxy?: string;
|
|
10
|
+
visited: Set<string>;
|
|
11
|
+
}
|
|
12
|
+
interface Resolved {
|
|
13
|
+
payload: SchemaPayload;
|
|
14
|
+
source: SchemaResolutionSource;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The candidate domains for a schema name, shortest first
|
|
18
|
+
* (com.example.foo -> example.com, foo.example.com). See SPEC.md §5.
|
|
19
|
+
*/
|
|
20
|
+
export declare function candidateDomains(schemaName: string): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Whether a schema name falls inside a domain's reverse-domain namespace: the name's
|
|
23
|
+
* leading levels, reversed, equal the domain or a parent of it. See SPEC.md §2.1.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isSchemaInDomainNamespace(schemaName: string, domain: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Resolves a schema name to the domain-published authoritative schema definition by
|
|
28
|
+
* walking the publication mechanisms in SPEC.md §5: DNS TXT records at _xyo.{domain}
|
|
29
|
+
* (per-schema, config hash, domain indirection, legacy bare hash), then the xyo.json
|
|
30
|
+
* root file, the xyo. subdomain index, and the legacy xyo-config.json (with the
|
|
31
|
+
* archivist proxy as browser fallback).
|
|
32
|
+
*/
|
|
33
|
+
export declare class DomainSchemaResolver {
|
|
34
|
+
resolve(schemaName: string, options?: ResolveSchemaOptions): Promise<SchemaResolution>;
|
|
35
|
+
/** Fetch a payload by hash (or HURI href) and verify it against the referenced hash */
|
|
36
|
+
protected fetchPayload(hashOrHref: string, context: ResolveContext, configFields?: DomainConfigFields): Promise<Payload | undefined>;
|
|
37
|
+
protected fetchSchemaPayloadByHash(hashOrHref: string, schemaName: string, context: ResolveContext, configFields?: DomainConfigFields): Promise<SchemaPayload | undefined>;
|
|
38
|
+
protected lookupHash(fields: DomainConfigFields, schemaName: string): string | undefined;
|
|
39
|
+
/** Find the schema in a domain config document (schemas map first, then legacy aliases) */
|
|
40
|
+
protected lookupInConfig(fields: DomainConfigFields | undefined, schemaName: string, domain: string, mechanism: SchemaResolutionMechanism, context: ResolveContext, url?: string): Promise<Resolved | undefined>;
|
|
41
|
+
protected resolveAtDomain(domain: string, schemaName: string, depth: number, context: ResolveContext): Promise<Resolved | undefined>;
|
|
42
|
+
protected resolveViaDns(domain: string, schemaName: string, depth: number, context: ResolveContext): Promise<Resolved | undefined>;
|
|
43
|
+
}
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=DomainSchemaResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DomainSchemaResolver.d.ts","sourceRoot":"","sources":["../../../src/Resolution/DomainSchemaResolver.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAIvE,OAAO,KAAK,EAAE,kBAAkB,EAAiB,MAAM,eAAe,CAAA;AAEtE,OAAO,KAAK,EACV,oBAAoB,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,sBAAsB,EAC1F,MAAM,uBAAuB,CAAA;AAM9B,UAAU,cAAc;IACtB,yFAAyF;IACzF,cAAc,EAAE,OAAO,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACrB;AAED,UAAU,QAAQ;IAChB,OAAO,EAAE,aAAa,CAAA;IACtB,MAAM,EAAE,sBAAsB,CAAA;CAC/B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAO7D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAErF;AAMD;;;;;;GAMG;AACH,qBAAa,oBAAoB;IACzB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsBhG,uFAAuF;cACvE,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,YAAY,CAAC,EAAE,kBAAkB,GAChC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;cAqBf,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,YAAY,CAAC,EAAE,kBAAkB,GAChC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAOrC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAOxF,2FAA2F;cAC3E,cAAc,CAC5B,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,yBAAyB,EACpC,OAAO,EAAE,cAAc,EACvB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;cA+BhB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;cA2ChB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;CAkDjC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Hash } from '@xylabs/sdk-js';
|
|
2
|
+
import type { SchemaPayload } from '@xyo-network/schema-payload-plugin';
|
|
3
|
+
/**
|
|
4
|
+
* How a schema definition was discovered. See SPEC.md §5.
|
|
5
|
+
*/
|
|
6
|
+
export type SchemaResolutionMechanism = 'dns-schema' | 'dns-config' | 'dns-domain' | 'dns-legacy' | 'file-root' | 'file-subdomain' | 'file-legacy' | 'file-proxy';
|
|
7
|
+
export type SchemaResolutionStatus = 'resolved' | 'not-published' | 'unreachable';
|
|
8
|
+
export interface SchemaResolutionSource {
|
|
9
|
+
domain: string;
|
|
10
|
+
hash?: Hash;
|
|
11
|
+
mechanism: SchemaResolutionMechanism;
|
|
12
|
+
url?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SchemaResolution {
|
|
15
|
+
payload?: SchemaPayload;
|
|
16
|
+
source?: SchemaResolutionSource;
|
|
17
|
+
status: SchemaResolutionStatus;
|
|
18
|
+
}
|
|
19
|
+
export interface ResolveSchemaOptions {
|
|
20
|
+
/** Archivist used to fetch payloads by hash; overrides config networks and the HURI default */
|
|
21
|
+
archivistUri?: string;
|
|
22
|
+
/** Maximum domain= indirection depth (default 3) */
|
|
23
|
+
maxIndirectionDepth?: number;
|
|
24
|
+
/** Archivist domain proxy used as a browser fallback for root-file fetches */
|
|
25
|
+
proxy?: string;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=SchemaResolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaResolution.d.ts","sourceRoot":"","sources":["../../../src/Resolution/SchemaResolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAC1C,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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Hash } from '@xylabs/sdk-js';
|
|
2
|
+
import type { GoogleDnsResultAnswer } from '@xyo-network/dns';
|
|
3
|
+
/**
|
|
4
|
+
* The parsed contents of the TXT record set at _xyo.{domain}. See SPEC.md §3.3.
|
|
5
|
+
*/
|
|
6
|
+
export interface XyoDnsRecords {
|
|
7
|
+
/** config={hash-or-huri} — hash of a network.xyo.domain.config (or legacy domain) payload */
|
|
8
|
+
config?: string;
|
|
9
|
+
/** domain={other-domain} — the named domain is the schema authority for this domain */
|
|
10
|
+
domain?: string;
|
|
11
|
+
/** bare 64-hex records — legacy hashes of network.xyo.domain payloads */
|
|
12
|
+
legacyHashes: Hash[];
|
|
13
|
+
/** schema.{name}={hash-or-huri} — per-schema hashes of network.xyo.schema payloads */
|
|
14
|
+
schemas: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Strip surrounding double quotes and join multi-string TXT data ("abc" "def" -> abcdef)
|
|
18
|
+
* before grammar matching, per SPEC.md §3.3.
|
|
19
|
+
*/
|
|
20
|
+
export declare function normalizeTxtData(data: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Parse the TXT answers from a _xyo.{domain} query into the four record modes. Unknown
|
|
23
|
+
* keys are ignored; duplicates resolve lexicographically-first so results are
|
|
24
|
+
* deterministic regardless of DNS answer order.
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseXyoTxtRecords(answers?: GoogleDnsResultAnswer[]): XyoDnsRecords;
|
|
27
|
+
//# sourceMappingURL=XyoDnsRecords.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XyoDnsRecords.d.ts","sourceRoot":"","sources":["../../../src/Resolution/XyoDnsRecords.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAU,MAAM,gBAAgB,CAAA;AAClD,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,CAMrD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,GAAG,aAAa,CAoCnF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Resolution/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA"}
|
|
@@ -1,17 +1,121 @@
|
|
|
1
1
|
import { type Hash } from '@xylabs/sdk-js';
|
|
2
2
|
import type { FetchedPayload } from '@xyo-network/huri';
|
|
3
|
+
import type { NetworkPayload } from '@xyo-network/network';
|
|
3
4
|
import { PayloadWrapper } from '@xyo-network/payload-wrapper';
|
|
5
|
+
import type { DomainConfigPayload } from './DomainConfigPayload.ts';
|
|
4
6
|
import { type Alias, type DomainPayload } from './Payload.ts';
|
|
5
7
|
export interface FetchedAlias extends FetchedPayload {
|
|
6
8
|
alias: Alias;
|
|
7
9
|
}
|
|
8
|
-
export declare class DomainPayloadWrapper<T extends DomainPayload = DomainPayload> extends PayloadWrapper<T> {
|
|
10
|
+
export declare class DomainPayloadWrapper<T extends DomainPayload | DomainConfigPayload = DomainPayload> extends PayloadWrapper<T> {
|
|
9
11
|
aliases?: FetchedAlias[] | null;
|
|
10
|
-
static discover(reverseDomainName: string, proxy?: string): Promise<DomainPayloadWrapper<
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
static discover(reverseDomainName: string, proxy?: string): Promise<DomainPayloadWrapper<{
|
|
13
|
+
schema: "network.xyo.domain" & {
|
|
14
|
+
readonly __schema: true;
|
|
15
|
+
};
|
|
16
|
+
additional?: string[] | undefined;
|
|
17
|
+
aliases?: Record<string, {
|
|
18
|
+
huri: string;
|
|
19
|
+
name?: string | undefined;
|
|
20
|
+
}> | undefined;
|
|
21
|
+
networks?: NetworkPayload[] | undefined;
|
|
22
|
+
schemas?: Record<string, string | {
|
|
23
|
+
[x: string]: unknown;
|
|
24
|
+
$id?: string | undefined;
|
|
25
|
+
}> | undefined;
|
|
26
|
+
} | (import("@xyo-network/payload-model").PayloadFields & {
|
|
27
|
+
schema: import("@xyo-network/payload-model").Schema;
|
|
28
|
+
} & Partial<import("@xyo-network/payload-model").PayloadMetaFields> & {
|
|
29
|
+
schema: "network.xyo.domain.config" & {
|
|
30
|
+
readonly __schema: true;
|
|
31
|
+
};
|
|
32
|
+
additional?: string[] | undefined;
|
|
33
|
+
aliases?: Record<string, {
|
|
34
|
+
huri: string;
|
|
35
|
+
name?: string | undefined;
|
|
36
|
+
}> | undefined;
|
|
37
|
+
networks?: NetworkPayload[] | undefined;
|
|
38
|
+
schemas?: Record<string, string | {
|
|
39
|
+
[x: string]: unknown;
|
|
40
|
+
$id?: string | undefined;
|
|
41
|
+
}> | undefined;
|
|
42
|
+
})> | undefined>;
|
|
43
|
+
static discoverDNSEntry(domain: string): Promise<DomainPayloadWrapper<{
|
|
44
|
+
schema: "network.xyo.domain" & {
|
|
45
|
+
readonly __schema: true;
|
|
46
|
+
};
|
|
47
|
+
additional?: string[] | undefined;
|
|
48
|
+
aliases?: Record<string, {
|
|
49
|
+
huri: string;
|
|
50
|
+
name?: string | undefined;
|
|
51
|
+
}> | undefined;
|
|
52
|
+
networks?: NetworkPayload[] | undefined;
|
|
53
|
+
schemas?: Record<string, string | {
|
|
54
|
+
[x: string]: unknown;
|
|
55
|
+
$id?: string | undefined;
|
|
56
|
+
}> | undefined;
|
|
57
|
+
} | (import("@xyo-network/payload-model").PayloadFields & {
|
|
58
|
+
schema: import("@xyo-network/payload-model").Schema;
|
|
59
|
+
} & Partial<import("@xyo-network/payload-model").PayloadMetaFields> & {
|
|
60
|
+
schema: "network.xyo.domain.config" & {
|
|
61
|
+
readonly __schema: true;
|
|
62
|
+
};
|
|
63
|
+
additional?: string[] | undefined;
|
|
64
|
+
aliases?: Record<string, {
|
|
65
|
+
huri: string;
|
|
66
|
+
name?: string | undefined;
|
|
67
|
+
}> | undefined;
|
|
68
|
+
networks?: NetworkPayload[] | undefined;
|
|
69
|
+
schemas?: Record<string, string | {
|
|
70
|
+
[x: string]: unknown;
|
|
71
|
+
$id?: string | undefined;
|
|
72
|
+
}> | undefined;
|
|
73
|
+
})> | undefined>;
|
|
74
|
+
static discoverRootFile(domain: string, proxy?: string): Promise<DomainPayloadWrapper<{
|
|
75
|
+
schema: "network.xyo.domain" & {
|
|
76
|
+
readonly __schema: true;
|
|
77
|
+
};
|
|
78
|
+
additional?: string[] | undefined;
|
|
79
|
+
aliases?: Record<string, {
|
|
80
|
+
huri: string;
|
|
81
|
+
name?: string | undefined;
|
|
82
|
+
}> | undefined;
|
|
83
|
+
networks?: NetworkPayload[] | undefined;
|
|
84
|
+
schemas?: Record<string, string | {
|
|
85
|
+
[x: string]: unknown;
|
|
86
|
+
$id?: string | undefined;
|
|
87
|
+
}> | undefined;
|
|
88
|
+
}> | undefined>;
|
|
89
|
+
static discoverRootFileDirect(domain: string): Promise<DomainPayloadWrapper<{
|
|
90
|
+
schema: "network.xyo.domain" & {
|
|
91
|
+
readonly __schema: true;
|
|
92
|
+
};
|
|
93
|
+
additional?: string[] | undefined;
|
|
94
|
+
aliases?: Record<string, {
|
|
95
|
+
huri: string;
|
|
96
|
+
name?: string | undefined;
|
|
97
|
+
}> | undefined;
|
|
98
|
+
networks?: NetworkPayload[] | undefined;
|
|
99
|
+
schemas?: Record<string, string | {
|
|
100
|
+
[x: string]: unknown;
|
|
101
|
+
$id?: string | undefined;
|
|
102
|
+
}> | undefined;
|
|
103
|
+
}> | undefined>;
|
|
104
|
+
static discoverRootFileWithProxy(domain: string, proxy?: string): Promise<DomainPayloadWrapper<{
|
|
105
|
+
schema: "network.xyo.domain" & {
|
|
106
|
+
readonly __schema: true;
|
|
107
|
+
};
|
|
108
|
+
additional?: string[] | undefined;
|
|
109
|
+
aliases?: Record<string, {
|
|
110
|
+
huri: string;
|
|
111
|
+
name?: string | undefined;
|
|
112
|
+
}> | undefined;
|
|
113
|
+
networks?: NetworkPayload[] | undefined;
|
|
114
|
+
schemas?: Record<string, string | {
|
|
115
|
+
[x: string]: unknown;
|
|
116
|
+
$id?: string | undefined;
|
|
117
|
+
}> | undefined;
|
|
118
|
+
}> | undefined>;
|
|
15
119
|
fetch(networkSlug?: Hash): Promise<void>;
|
|
16
120
|
fetchAliases(networkSlug?: Hash): Promise<void>;
|
|
17
121
|
private fetchAlias;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Wrapper.d.ts","sourceRoot":"","sources":["../../src/Wrapper.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,IAAI,EAAU,MAAM,gBAAgB,CAAA;AAGlD,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"Wrapper.d.ts","sourceRoot":"","sources":["../../src/Wrapper.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,IAAI,EAAU,MAAM,gBAAgB,CAAA;AAGlD,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,mBAAmB,CAAA;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE1D,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;;;;;;;;;;;;;;;IAanG,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI;IAIxB,YAAY,CAAC,WAAW,CAAC,EAAE,IAAI;YAgBvB,UAAU;YAUV,gBAAgB;YAIhB,UAAU;CAGzB"}
|
package/dist/neutral/index.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
export * from './DomainConfigPayload.ts';
|
|
2
|
+
export * from './DomainConfigPlugin.ts';
|
|
3
|
+
export * from './DomainConfigSchema.ts';
|
|
4
|
+
export * from './DomainConfigTemplate.ts';
|
|
1
5
|
export * from './Payload.ts';
|
|
2
6
|
export { DomainPayloadPlugin as default, DomainPayloadPlugin } from './Plugin.ts';
|
|
7
|
+
export * from './Resolution/index.ts';
|
|
3
8
|
export * from './Schema.ts';
|
|
4
9
|
export * from './Template.ts';
|
|
5
10
|
export * from './Wrapper.ts';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,mBAAmB,IAAI,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjF,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,mBAAmB,IAAI,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjF,cAAc,uBAAuB,CAAA;AACrC,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -1,18 +1,79 @@
|
|
|
1
|
+
// src/DomainConfigPayload.ts
|
|
2
|
+
import {
|
|
3
|
+
zodAsFactory,
|
|
4
|
+
zodIsFactory,
|
|
5
|
+
zodToFactory
|
|
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 { isPayloadOfSchemaType, PayloadZodOfSchema } from "@xyo-network/payload-model";
|
|
16
|
+
import * as z from "zod/mini";
|
|
3
17
|
|
|
4
18
|
// src/Schema.ts
|
|
5
|
-
import { asSchema } from "@xyo-network/payload-model";
|
|
6
|
-
var DomainSchema =
|
|
19
|
+
import { asSchema as asSchema2 } from "@xyo-network/payload-model";
|
|
20
|
+
var DomainSchema = asSchema2("network.xyo.domain", true);
|
|
7
21
|
|
|
8
22
|
// src/Payload.ts
|
|
23
|
+
var AliasZod = z.object({
|
|
24
|
+
/** huri to the aliased payload */
|
|
25
|
+
huri: z.string(),
|
|
26
|
+
/** canonical name (ex. network.xyo.example) */
|
|
27
|
+
name: z.optional(z.string())
|
|
28
|
+
});
|
|
29
|
+
var SchemaDefinitionZod = z.looseObject({ $id: z.optional(z.string()) });
|
|
30
|
+
var SchemaMapEntryZod = z.union([z.string(), SchemaDefinitionZod]);
|
|
31
|
+
var DomainConfigFieldsZod = z.object({
|
|
32
|
+
/** Additional config files [huri] [out] */
|
|
33
|
+
additional: z.optional(z.array(z.string())),
|
|
34
|
+
/** Values associated with this domain [out] */
|
|
35
|
+
aliases: z.optional(z.record(z.string(), AliasZod)),
|
|
36
|
+
/** Known networks [out] */
|
|
37
|
+
networks: z.optional(z.array(z.custom())),
|
|
38
|
+
/** Official schemas published by this domain, keyed by schema name [out] */
|
|
39
|
+
schemas: z.optional(z.record(z.string(), SchemaMapEntryZod))
|
|
40
|
+
});
|
|
41
|
+
var DomainPayloadZod = z.extend(PayloadZodOfSchema(DomainSchema), DomainConfigFieldsZod.shape);
|
|
9
42
|
var isDomainPayload = isPayloadOfSchemaType(DomainSchema);
|
|
10
43
|
|
|
11
|
-
// src/
|
|
44
|
+
// src/DomainConfigPayload.ts
|
|
45
|
+
var DomainConfigPayloadZod = z2.extend(PayloadZodOfSchema2(DomainConfigSchema), DomainConfigFieldsZod.shape);
|
|
46
|
+
var isDomainConfigPayload = zodIsFactory(DomainConfigPayloadZod);
|
|
47
|
+
var asDomainConfigPayload = zodAsFactory(DomainConfigPayloadZod, "asDomainConfigPayload");
|
|
48
|
+
var toDomainConfigPayload = zodToFactory(DomainConfigPayloadZod, "toDomainConfigPayload");
|
|
49
|
+
|
|
50
|
+
// src/DomainConfigPlugin.ts
|
|
12
51
|
import { createPayloadPlugin } from "@xyo-network/payload-plugin";
|
|
13
52
|
|
|
53
|
+
// src/DomainConfigTemplate.ts
|
|
54
|
+
var domainConfigPayloadTemplate = () => ({
|
|
55
|
+
schema: DomainConfigSchema,
|
|
56
|
+
schemas: {
|
|
57
|
+
"com.example.inline": {
|
|
58
|
+
properties: { value: { type: "string" } },
|
|
59
|
+
type: "object"
|
|
60
|
+
},
|
|
61
|
+
"com.example.referenced": ""
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// src/DomainConfigPlugin.ts
|
|
66
|
+
var DomainConfigPayloadPlugin = () => createPayloadPlugin({
|
|
67
|
+
schema: DomainConfigSchema,
|
|
68
|
+
template: domainConfigPayloadTemplate,
|
|
69
|
+
zod: DomainConfigPayloadZod
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// src/Plugin.ts
|
|
73
|
+
import { createPayloadPlugin as createPayloadPlugin2 } from "@xyo-network/payload-plugin";
|
|
74
|
+
|
|
14
75
|
// src/Template.ts
|
|
15
|
-
import { asSchema as
|
|
76
|
+
import { asSchema as asSchema3 } from "@xyo-network/payload-model";
|
|
16
77
|
var domainConfigTemplate = () => ({
|
|
17
78
|
aliases: { "com.example.id": { huri: "" } },
|
|
18
79
|
networks: [
|
|
@@ -21,13 +82,13 @@ var domainConfigTemplate = () => ({
|
|
|
21
82
|
nodes: [
|
|
22
83
|
{
|
|
23
84
|
name: "",
|
|
24
|
-
schema:
|
|
85
|
+
schema: asSchema3("network.xyo.network.node", true),
|
|
25
86
|
slug: "",
|
|
26
87
|
type: "archivist",
|
|
27
88
|
uri: ""
|
|
28
89
|
}
|
|
29
90
|
],
|
|
30
|
-
schema:
|
|
91
|
+
schema: asSchema3("network.xyo.network", true),
|
|
31
92
|
slug: ""
|
|
32
93
|
}
|
|
33
94
|
],
|
|
@@ -42,11 +103,53 @@ import {
|
|
|
42
103
|
isBrowser,
|
|
43
104
|
isString
|
|
44
105
|
} from "@xylabs/sdk-js";
|
|
45
|
-
import { isHash } from "@xylabs/sdk-js";
|
|
106
|
+
import { isHash as isHash2 } from "@xylabs/sdk-js";
|
|
46
107
|
import { DnsRecordType, domainResolve } from "@xyo-network/dns";
|
|
47
108
|
import { Huri } from "@xyo-network/huri";
|
|
48
109
|
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
49
110
|
import { PayloadWrapper } from "@xyo-network/payload-wrapper";
|
|
111
|
+
|
|
112
|
+
// src/Resolution/XyoDnsRecords.ts
|
|
113
|
+
import { isHash } from "@xylabs/sdk-js";
|
|
114
|
+
var SCHEMA_KEY_PREFIX = "schema.";
|
|
115
|
+
function normalizeTxtData(data) {
|
|
116
|
+
const trimmed = data.trim();
|
|
117
|
+
if (trimmed.includes('"')) {
|
|
118
|
+
return [...trimmed.matchAll(/"([^"]*)"/g)].map((match) => match[1]).join("") || trimmed;
|
|
119
|
+
}
|
|
120
|
+
return trimmed;
|
|
121
|
+
}
|
|
122
|
+
function parseXyoTxtRecords(answers) {
|
|
123
|
+
const entries = (answers ?? []).map((answer) => answer.data).filter((data) => typeof data === "string").map(normalizeTxtData).toSorted();
|
|
124
|
+
const records = { legacyHashes: [], schemas: {} };
|
|
125
|
+
for (const entry of entries) {
|
|
126
|
+
if (isHash(entry)) {
|
|
127
|
+
records.legacyHashes.push(entry);
|
|
128
|
+
} else if (entry.startsWith(SCHEMA_KEY_PREFIX)) {
|
|
129
|
+
const separatorIndex = entry.indexOf("=");
|
|
130
|
+
if (separatorIndex > SCHEMA_KEY_PREFIX.length) {
|
|
131
|
+
const name = entry.slice(SCHEMA_KEY_PREFIX.length, separatorIndex);
|
|
132
|
+
const value = entry.slice(separatorIndex + 1);
|
|
133
|
+
if (name.length > 0 && value.length > 0) {
|
|
134
|
+
records.schemas[name] ??= value;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
} else if (entry.startsWith("domain=")) {
|
|
138
|
+
const value = entry.slice("domain=".length);
|
|
139
|
+
if (value.length > 0) {
|
|
140
|
+
records.domain ??= value;
|
|
141
|
+
}
|
|
142
|
+
} else if (entry.startsWith("config=")) {
|
|
143
|
+
const value = entry.slice("config=".length);
|
|
144
|
+
if (value.length > 0) {
|
|
145
|
+
records.config ??= value;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return records;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// src/Wrapper.ts
|
|
50
153
|
var DomainPayloadWrapper = class _DomainPayloadWrapper extends PayloadWrapper {
|
|
51
154
|
aliases;
|
|
52
155
|
static async discover(reverseDomainName, proxy) {
|
|
@@ -61,11 +164,13 @@ var DomainPayloadWrapper = class _DomainPayloadWrapper extends PayloadWrapper {
|
|
|
61
164
|
}
|
|
62
165
|
static async discoverDNSEntry(domain) {
|
|
63
166
|
try {
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
167
|
+
const answers = (await domainResolve(`_xyo.${domain}`, DnsRecordType.TXT))?.Answer;
|
|
168
|
+
const records = parseXyoTxtRecords(answers);
|
|
169
|
+
const candidates = [records.config, ...records.legacyHashes].filter((element) => isString(element));
|
|
170
|
+
for (const candidate of candidates) {
|
|
171
|
+
const huri = new Huri(candidate);
|
|
67
172
|
const payload = await huri.fetch();
|
|
68
|
-
if (isDomainPayload(payload)) {
|
|
173
|
+
if (isDomainPayload(payload) || isDomainConfigPayload(payload)) {
|
|
69
174
|
return new _DomainPayloadWrapper(payload);
|
|
70
175
|
}
|
|
71
176
|
}
|
|
@@ -74,16 +179,19 @@ var DomainPayloadWrapper = class _DomainPayloadWrapper extends PayloadWrapper {
|
|
|
74
179
|
}
|
|
75
180
|
}
|
|
76
181
|
static async discoverRootFile(domain, proxy) {
|
|
77
|
-
return isBrowser() || isString(proxy) ? await this.discoverRootFileWithProxy(domain, proxy) :
|
|
182
|
+
return await this.discoverRootFileDirect(domain) ?? (isBrowser() || isString(proxy) ? await this.discoverRootFileWithProxy(domain, proxy) : void 0);
|
|
78
183
|
}
|
|
79
184
|
static async discoverRootFileDirect(domain) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
185
|
+
const urls = [`https://${domain}/xyo.json`, `https://xyo.${domain}/`, `https://${domain}/xyo-config.json`];
|
|
186
|
+
for (const url of urls) {
|
|
187
|
+
try {
|
|
188
|
+
const response = await fetchJson(url);
|
|
189
|
+
if (response.data) {
|
|
190
|
+
return new _DomainPayloadWrapper(response.data);
|
|
191
|
+
}
|
|
192
|
+
} catch {
|
|
193
|
+
console.log(`DomainConfig root file not found [${url}]`);
|
|
84
194
|
}
|
|
85
|
-
} catch {
|
|
86
|
-
console.log(`DomainConfig root file not found [${domain}]`);
|
|
87
195
|
}
|
|
88
196
|
}
|
|
89
197
|
static async discoverRootFileWithProxy(domain, proxy = "https://api.archivist.xyo.network/domain") {
|
|
@@ -126,22 +234,233 @@ var DomainPayloadWrapper = class _DomainPayloadWrapper extends PayloadWrapper {
|
|
|
126
234
|
return (await this.getNetwork(hash))?.nodes?.find((payload) => payload.type === "archivist" ? payload : void 0)?.uri;
|
|
127
235
|
}
|
|
128
236
|
async getNetwork(hash) {
|
|
129
|
-
return
|
|
237
|
+
return isHash2(hash) ? await PayloadBuilder.findByDataHash(this.payload.networks, hash) : this.payload.networks?.[0];
|
|
130
238
|
}
|
|
131
239
|
};
|
|
132
240
|
|
|
133
241
|
// src/Plugin.ts
|
|
134
|
-
var DomainPayloadPlugin = () =>
|
|
242
|
+
var DomainPayloadPlugin = () => createPayloadPlugin2({
|
|
135
243
|
schema: DomainSchema,
|
|
136
244
|
template: domainConfigTemplate,
|
|
137
245
|
wrap: (payload) => DomainPayloadWrapper.wrap(payload)
|
|
138
246
|
});
|
|
247
|
+
|
|
248
|
+
// src/Resolution/DomainSchemaResolver.ts
|
|
249
|
+
import {
|
|
250
|
+
fetchJson as fetchJson2,
|
|
251
|
+
isBrowser as isBrowser2,
|
|
252
|
+
isString as isString2
|
|
253
|
+
} from "@xylabs/sdk-js";
|
|
254
|
+
import { DnsRecordType as DnsRecordType2, domainResolve as domainResolve2 } from "@xyo-network/dns";
|
|
255
|
+
import { Huri as Huri2 } from "@xyo-network/huri";
|
|
256
|
+
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
|
|
257
|
+
import { isSchemaPayload, SchemaSchema } from "@xyo-network/schema-payload-plugin";
|
|
258
|
+
var DEFAULT_MAX_INDIRECTION_DEPTH = 3;
|
|
259
|
+
var DEFAULT_PROXY = "https://api.archivist.xyo.network/domain";
|
|
260
|
+
function candidateDomains(schemaName) {
|
|
261
|
+
const parts = schemaName.split(".");
|
|
262
|
+
const domains = [];
|
|
263
|
+
for (let i = 2; i <= parts.length; i++) {
|
|
264
|
+
domains.push(parts.slice(0, i).toReversed().join("."));
|
|
265
|
+
}
|
|
266
|
+
return domains;
|
|
267
|
+
}
|
|
268
|
+
function isSchemaInDomainNamespace(schemaName, domain) {
|
|
269
|
+
return candidateDomains(schemaName).some((candidate) => candidate === domain || domain.endsWith(`.${candidate}`));
|
|
270
|
+
}
|
|
271
|
+
function isValidSchemaName(schemaName) {
|
|
272
|
+
return schemaName.length > 0 && schemaName === schemaName.toLowerCase() && schemaName.split(".").length >= 3;
|
|
273
|
+
}
|
|
274
|
+
var DomainSchemaResolver = class {
|
|
275
|
+
async resolve(schemaName, options = {}) {
|
|
276
|
+
if (!isValidSchemaName(schemaName)) {
|
|
277
|
+
return { status: "not-published" };
|
|
278
|
+
}
|
|
279
|
+
const context = {
|
|
280
|
+
anyCleanAnswer: false,
|
|
281
|
+
archivistUri: options.archivistUri,
|
|
282
|
+
proxy: options.proxy,
|
|
283
|
+
visited: /* @__PURE__ */ new Set()
|
|
284
|
+
};
|
|
285
|
+
const depth = options.maxIndirectionDepth ?? DEFAULT_MAX_INDIRECTION_DEPTH;
|
|
286
|
+
for (const domain of candidateDomains(schemaName)) {
|
|
287
|
+
const resolved = await this.resolveAtDomain(domain, schemaName, depth, context);
|
|
288
|
+
if (resolved) {
|
|
289
|
+
return {
|
|
290
|
+
payload: resolved.payload,
|
|
291
|
+
source: resolved.source,
|
|
292
|
+
status: "resolved"
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return { status: context.anyCleanAnswer ? "not-published" : "unreachable" };
|
|
297
|
+
}
|
|
298
|
+
/** Fetch a payload by hash (or HURI href) and verify it against the referenced hash */
|
|
299
|
+
async fetchPayload(hashOrHref, context, configFields) {
|
|
300
|
+
try {
|
|
301
|
+
const archivistUri = context.archivistUri ?? findArchivistUri(configFields);
|
|
302
|
+
const huri = new Huri2(hashOrHref, { archivistUri });
|
|
303
|
+
const payload = await huri.fetch();
|
|
304
|
+
if (!payload) {
|
|
305
|
+
context.anyCleanAnswer = true;
|
|
306
|
+
return void 0;
|
|
307
|
+
}
|
|
308
|
+
if (await PayloadBuilder2.dataHash(payload) !== huri.hash && await PayloadBuilder2.hash(payload) !== huri.hash) {
|
|
309
|
+
console.warn(`DomainSchemaResolver: hash mismatch for [${huri.hash}]`);
|
|
310
|
+
context.anyCleanAnswer = true;
|
|
311
|
+
return void 0;
|
|
312
|
+
}
|
|
313
|
+
return payload;
|
|
314
|
+
} catch {
|
|
315
|
+
return void 0;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
async fetchSchemaPayloadByHash(hashOrHref, schemaName, context, configFields) {
|
|
319
|
+
const payload = await this.fetchPayload(hashOrHref, context, configFields);
|
|
320
|
+
if (isSchemaPayload(payload) && payload.definition.$id === schemaName) {
|
|
321
|
+
return payload;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
lookupHash(fields, schemaName) {
|
|
325
|
+
const entry = fields.schemas?.[schemaName];
|
|
326
|
+
if (isString2(entry)) return entry;
|
|
327
|
+
const alias = fields.aliases?.[schemaName];
|
|
328
|
+
if (isString2(alias?.huri) && alias.huri.length > 0) return alias.huri;
|
|
329
|
+
}
|
|
330
|
+
/** Find the schema in a domain config document (schemas map first, then legacy aliases) */
|
|
331
|
+
async lookupInConfig(fields, schemaName, domain, mechanism, context, url) {
|
|
332
|
+
if (!fields) return void 0;
|
|
333
|
+
context.anyCleanAnswer = true;
|
|
334
|
+
const entry = fields.schemas?.[schemaName];
|
|
335
|
+
if (entry !== void 0 && !isString2(entry)) {
|
|
336
|
+
const payload = { definition: { ...entry, $id: schemaName }, schema: SchemaSchema };
|
|
337
|
+
return {
|
|
338
|
+
payload,
|
|
339
|
+
source: {
|
|
340
|
+
domain,
|
|
341
|
+
mechanism,
|
|
342
|
+
url
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
const hash = this.lookupHash(fields, schemaName);
|
|
347
|
+
if (isString2(hash)) {
|
|
348
|
+
const payload = await this.fetchSchemaPayloadByHash(hash, schemaName, context, fields);
|
|
349
|
+
if (payload) {
|
|
350
|
+
return {
|
|
351
|
+
payload,
|
|
352
|
+
source: {
|
|
353
|
+
domain,
|
|
354
|
+
hash: new Huri2(hash).hash,
|
|
355
|
+
mechanism,
|
|
356
|
+
url
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
async resolveAtDomain(domain, schemaName, depth, context) {
|
|
363
|
+
if (context.visited.has(domain)) return void 0;
|
|
364
|
+
context.visited.add(domain);
|
|
365
|
+
const dnsResolved = await this.resolveViaDns(domain, schemaName, depth, context);
|
|
366
|
+
if (dnsResolved) return dnsResolved;
|
|
367
|
+
const fileCandidates = [
|
|
368
|
+
[`https://${domain}/xyo.json`, "file-root"],
|
|
369
|
+
[`https://xyo.${domain}/`, "file-subdomain"],
|
|
370
|
+
[`https://${domain}/xyo-config.json`, "file-legacy"]
|
|
371
|
+
];
|
|
372
|
+
let anyDirectTransportFailure = false;
|
|
373
|
+
for (const [url, mechanism] of fileCandidates) {
|
|
374
|
+
try {
|
|
375
|
+
const response = await fetchJson2(url);
|
|
376
|
+
context.anyCleanAnswer = true;
|
|
377
|
+
const resolved = await this.lookupInConfig(response.data ?? void 0, schemaName, domain, mechanism, context, url);
|
|
378
|
+
if (resolved) return resolved;
|
|
379
|
+
} catch {
|
|
380
|
+
anyDirectTransportFailure = true;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (isString2(context.proxy) || isBrowser2() && anyDirectTransportFailure) {
|
|
384
|
+
const url = `${context.proxy ?? DEFAULT_PROXY}/${domain.split(".").toReversed().join(".")}`;
|
|
385
|
+
try {
|
|
386
|
+
const response = await fetchJson2(url);
|
|
387
|
+
context.anyCleanAnswer = true;
|
|
388
|
+
const resolved = await this.lookupInConfig(response.data?.data, schemaName, domain, "file-proxy", context, url);
|
|
389
|
+
if (resolved) return resolved;
|
|
390
|
+
} catch {
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
async resolveViaDns(domain, schemaName, depth, context) {
|
|
395
|
+
try {
|
|
396
|
+
const result = await domainResolve2(`_xyo.${domain}`, DnsRecordType2.TXT);
|
|
397
|
+
if (!result) return void 0;
|
|
398
|
+
context.anyCleanAnswer = true;
|
|
399
|
+
const records = parseXyoTxtRecords(result.Answer);
|
|
400
|
+
const schemaHash = records.schemas[schemaName];
|
|
401
|
+
if (isString2(schemaHash)) {
|
|
402
|
+
const payload = await this.fetchSchemaPayloadByHash(schemaHash, schemaName, context);
|
|
403
|
+
if (payload) {
|
|
404
|
+
return {
|
|
405
|
+
payload,
|
|
406
|
+
source: {
|
|
407
|
+
domain,
|
|
408
|
+
hash: new Huri2(schemaHash).hash,
|
|
409
|
+
mechanism: "dns-schema"
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
if (isString2(records.config)) {
|
|
415
|
+
const configPayload = await this.fetchPayload(records.config, context);
|
|
416
|
+
if (isDomainConfigPayload(configPayload) || isDomainPayload(configPayload)) {
|
|
417
|
+
const resolved = await this.lookupInConfig(configPayload, schemaName, domain, "dns-config", context);
|
|
418
|
+
if (resolved) return resolved;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
if (isString2(records.domain) && depth > 0 && !context.visited.has(records.domain)) {
|
|
422
|
+
const resolved = await this.resolveAtDomain(records.domain, schemaName, depth - 1, context);
|
|
423
|
+
if (resolved) {
|
|
424
|
+
return { payload: resolved.payload, source: { ...resolved.source, mechanism: "dns-domain" } };
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
for (const legacyHash of records.legacyHashes) {
|
|
428
|
+
const legacyPayload = await this.fetchPayload(legacyHash, context);
|
|
429
|
+
if (isDomainPayload(legacyPayload) || isDomainConfigPayload(legacyPayload)) {
|
|
430
|
+
const resolved = await this.lookupInConfig(legacyPayload, schemaName, domain, "dns-legacy", context);
|
|
431
|
+
if (resolved) return resolved;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
} catch {
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
function findArchivistUri(fields) {
|
|
439
|
+
return fields?.networks?.[0]?.nodes?.find((node) => node.type === "archivist")?.uri;
|
|
440
|
+
}
|
|
139
441
|
export {
|
|
442
|
+
AliasZod,
|
|
443
|
+
DomainConfigFieldsZod,
|
|
444
|
+
DomainConfigPayloadPlugin,
|
|
445
|
+
DomainConfigPayloadZod,
|
|
446
|
+
DomainConfigSchema,
|
|
140
447
|
DomainPayloadPlugin,
|
|
141
448
|
DomainPayloadWrapper,
|
|
449
|
+
DomainPayloadZod,
|
|
142
450
|
DomainSchema,
|
|
451
|
+
DomainSchemaResolver,
|
|
452
|
+
SchemaDefinitionZod,
|
|
453
|
+
SchemaMapEntryZod,
|
|
454
|
+
asDomainConfigPayload,
|
|
455
|
+
candidateDomains,
|
|
143
456
|
DomainPayloadPlugin as default,
|
|
457
|
+
domainConfigPayloadTemplate,
|
|
144
458
|
domainConfigTemplate,
|
|
145
|
-
|
|
459
|
+
isDomainConfigPayload,
|
|
460
|
+
isDomainPayload,
|
|
461
|
+
isSchemaInDomainNamespace,
|
|
462
|
+
normalizeTxtData,
|
|
463
|
+
parseXyoTxtRecords,
|
|
464
|
+
toDomainConfigPayload
|
|
146
465
|
};
|
|
147
466
|
//# 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 type { NetworkPayload } from '@xyo-network/network'\nimport { isPayloadOfSchemaType, 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\n// schema-only legacy guard (not zod-validating) so in-the-wild network.xyo.domain\n// payloads keep passing exactly as they did before the schemas-map extension\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 { 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": ["PayloadZodOfSchema", "z", "asSchema", "PayloadZodOfSchema", "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.
|
|
3
|
+
"version": "6.1.1",
|
|
4
4
|
"description": "Typescript/Javascript Plugins for XYO Platform",
|
|
5
5
|
"homepage": "https://xyo.network",
|
|
6
6
|
"bugs": {
|
|
@@ -34,27 +34,26 @@
|
|
|
34
34
|
"README.md"
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@xyo-network/
|
|
38
|
-
"@xyo-network/huri": "~6.
|
|
39
|
-
"@xyo-network/
|
|
40
|
-
"@xyo-network/payload-
|
|
41
|
-
"@xyo-network/payload-
|
|
42
|
-
"@xyo-network/payload-plugin": "~6.
|
|
43
|
-
"@xyo-network/payload-wrapper": "~6.
|
|
37
|
+
"@xyo-network/network": "~6.1.1",
|
|
38
|
+
"@xyo-network/huri": "~6.1.1",
|
|
39
|
+
"@xyo-network/dns": "~6.1.1",
|
|
40
|
+
"@xyo-network/payload-model": "~6.1.1",
|
|
41
|
+
"@xyo-network/payload-builder": "~6.1.1",
|
|
42
|
+
"@xyo-network/payload-plugin": "~6.1.1",
|
|
43
|
+
"@xyo-network/payload-wrapper": "~6.1.1",
|
|
44
|
+
"@xyo-network/schema-payload-plugin": "~6.1.1"
|
|
44
45
|
},
|
|
45
46
|
"devDependencies": {
|
|
46
47
|
"@bitauth/libauth": "~3.0.0",
|
|
47
48
|
"@opentelemetry/api": "^1.9.1",
|
|
48
|
-
"@opentelemetry/sdk-trace-base": "^2.
|
|
49
|
+
"@opentelemetry/sdk-trace-base": "^2.8.0",
|
|
49
50
|
"@scure/base": "~2.2.0",
|
|
50
|
-
"@xylabs/sdk-js": "^6.
|
|
51
|
-
"@xylabs/threads": "
|
|
52
|
-
"@xylabs/toolchain": "~8.1.
|
|
53
|
-
"@xylabs/tsconfig": "~8.1.
|
|
54
|
-
"@xylabs/vitest-extended": "^6.
|
|
51
|
+
"@xylabs/sdk-js": "^6.1.1",
|
|
52
|
+
"@xylabs/threads": "^6.1.1",
|
|
53
|
+
"@xylabs/toolchain": "~8.1.20",
|
|
54
|
+
"@xylabs/tsconfig": "~8.1.20",
|
|
55
|
+
"@xylabs/vitest-extended": "^6.1.1",
|
|
55
56
|
"async-mutex": "^0.5.0",
|
|
56
|
-
"bn.js": "^5.2.3",
|
|
57
|
-
"buffer": "^6.0.3",
|
|
58
57
|
"debug": "^4.4.3",
|
|
59
58
|
"eslint": "^10.4.1",
|
|
60
59
|
"ethers": "^6.16.0",
|
|
@@ -64,7 +63,7 @@
|
|
|
64
63
|
"vite": "^8.0.16",
|
|
65
64
|
"vitest": "~4.1.8",
|
|
66
65
|
"zod": "^4.4.3",
|
|
67
|
-
"@xyo-network/api-models": "~6.
|
|
66
|
+
"@xyo-network/api-models": "~6.1.1"
|
|
68
67
|
},
|
|
69
68
|
"peerDependencies": {
|
|
70
69
|
"@bitauth/libauth": "~3.0",
|
|
@@ -74,8 +73,6 @@
|
|
|
74
73
|
"@xylabs/sdk-js": "^6.0",
|
|
75
74
|
"@xylabs/threads": "^6.0",
|
|
76
75
|
"async-mutex": "^0.5",
|
|
77
|
-
"bn.js": "^5.2",
|
|
78
|
-
"buffer": "^6.0",
|
|
79
76
|
"debug": "^4.4",
|
|
80
77
|
"ethers": "^6.16",
|
|
81
78
|
"hash-wasm": "~4.12",
|