@xyo-network/domain-payload-plugin 2.75.2 → 2.75.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.
@@ -1,8 +1,116 @@
1
+ // src/Plugin.ts
1
2
  import { createPayloadPlugin } from "@xyo-network/payload-plugin";
2
- import { DomainSchema } from "./Schema";
3
- import { domainConfigTemplate } from "./Template";
4
- import { DomainPayloadWrapper } from "./Wrapper";
5
- const DomainPayloadPlugin = () => createPayloadPlugin({
3
+
4
+ // src/Schema.ts
5
+ var DomainSchema = "network.xyo.domain";
6
+
7
+ // src/Template.ts
8
+ var domainConfigTemplate = () => ({
9
+ aliases: {
10
+ "com.example.id": {
11
+ huri: ""
12
+ }
13
+ },
14
+ networks: [
15
+ {
16
+ name: "",
17
+ nodes: [
18
+ {
19
+ name: "",
20
+ schema: "network.xyo.network.node",
21
+ slug: "",
22
+ type: "archivist",
23
+ uri: ""
24
+ }
25
+ ],
26
+ schema: "network.xyo.network",
27
+ slug: ""
28
+ }
29
+ ],
30
+ schema: DomainSchema
31
+ });
32
+
33
+ // src/Wrapper.ts
34
+ import { reverse } from "@xylabs/lodash";
35
+ import { axios } from "@xyo-network/axios";
36
+ import { isBrowser, PayloadHasher } from "@xyo-network/core";
37
+ import { DnsRecordType, domainResolve } from "@xyo-network/dns";
38
+ import { Huri } from "@xyo-network/huri";
39
+ import { PayloadWrapper } from "@xyo-network/payload-wrapper";
40
+ var DomainPayloadWrapper = class _DomainPayloadWrapper extends PayloadWrapper {
41
+ aliases;
42
+ static async discover(reverseDomainName, proxy) {
43
+ const parts = reverseDomainName.split(".");
44
+ for (let i = 2; i <= parts.length; i++) {
45
+ const domainToCheck = reverse(parts.filter((_, index) => index < i)).join(".");
46
+ return await this.discoverDNSEntry(domainToCheck) ?? await this.discoverRootFile(domainToCheck, proxy);
47
+ }
48
+ }
49
+ static async discoverDNSEntry(domain) {
50
+ try {
51
+ const hash = (await domainResolve(`_xyo.${domain}`, DnsRecordType.TXT))?.Answer?.[0]?.data;
52
+ if (hash) {
53
+ const huri = new Huri(hash);
54
+ const payload = await huri.fetch();
55
+ if (payload) {
56
+ return new _DomainPayloadWrapper(payload);
57
+ }
58
+ }
59
+ } catch (ex) {
60
+ console.log(`DomainConfig dns reading error entry not found [${domain}]`);
61
+ }
62
+ }
63
+ static async discoverRootFile(domain, proxy) {
64
+ return isBrowser() || proxy ? await this.discoverRootFileWithProxy(domain, proxy) : await this.discoverRootFileDirect(domain);
65
+ }
66
+ static async discoverRootFileDirect(domain) {
67
+ try {
68
+ const config = (await axios.get(`https://${domain}/xyo-config.json`)).data;
69
+ return new _DomainPayloadWrapper(config);
70
+ } catch (ex) {
71
+ console.log(`DomainConfig root file not found [${domain}]`);
72
+ }
73
+ }
74
+ static async discoverRootFileWithProxy(domain, proxy = "https://api.archivist.xyo.network/domain") {
75
+ try {
76
+ const requestUrl = `${proxy}/${domain.split(".").reverse().join(".")}`;
77
+ const config = (await axios.get(requestUrl)).data.data;
78
+ return new _DomainPayloadWrapper(config);
79
+ } catch (ex) {
80
+ const error = ex;
81
+ console.log(`DomainConfig root file not found using proxy [${domain}] [${error.code}]`);
82
+ }
83
+ }
84
+ async fetch(networkSlug) {
85
+ await this.fetchAliases(networkSlug);
86
+ }
87
+ async fetchAliases(networkSlug) {
88
+ this.aliases = null;
89
+ const archivistUri = await this.findArchivistUri(networkSlug);
90
+ if (this.payload().aliases) {
91
+ const fetchedAliases = await Promise.all(
92
+ Object.entries(this.payload().aliases ?? {}).map(([, alias]) => {
93
+ return this.fetchAlias(alias, { archivistUri });
94
+ })
95
+ );
96
+ this.aliases = fetchedAliases.filter((alias) => alias);
97
+ }
98
+ }
99
+ async fetchAlias(alias, huriOptions) {
100
+ const huri = new Huri(alias.huri, huriOptions);
101
+ const payload = await huri.fetch();
102
+ return payload ? { alias, huri, payload } : null;
103
+ }
104
+ async findArchivistUri(hash) {
105
+ return (await this.getNetwork(hash))?.nodes?.find((payload) => payload.type === "archivist" ? payload : void 0)?.uri;
106
+ }
107
+ async getNetwork(hash) {
108
+ return hash ? await PayloadHasher.find(this.payload().networks, hash) : this.payload().networks?.[0];
109
+ }
110
+ };
111
+
112
+ // src/Plugin.ts
113
+ var DomainPayloadPlugin = () => createPayloadPlugin({
6
114
  schema: DomainSchema,
7
115
  template: domainConfigTemplate,
8
116
  wrap: (payload) => DomainPayloadWrapper.wrap(payload)
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Plugin.ts"],"sourcesContent":["import { Payload } from '@xyo-network/payload-model'\nimport { createPayloadPlugin } from '@xyo-network/payload-plugin'\n\nimport { DomainPayload } from './Payload'\nimport { DomainSchema } from './Schema'\nimport { domainConfigTemplate } from './Template'\nimport { DomainPayloadWrapper } from './Wrapper'\n\nexport const DomainPayloadPlugin = () =>\n createPayloadPlugin<DomainPayload>({\n schema: DomainSchema,\n template: domainConfigTemplate,\n wrap: (payload: Payload) => DomainPayloadWrapper.wrap(payload as DomainPayload),\n })\n"],"mappings":"AACA,SAAS,2BAA2B;AAGpC,SAAS,oBAAoB;AAC7B,SAAS,4BAA4B;AACrC,SAAS,4BAA4B;AAE9B,MAAM,sBAAsB,MACjC,oBAAmC;AAAA,EACjC,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM,CAAC,YAAqB,qBAAqB,KAAK,OAAwB;AAChF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../src/Plugin.ts","../../src/Schema.ts","../../src/Template.ts","../../src/Wrapper.ts"],"sourcesContent":["import { Payload } from '@xyo-network/payload-model'\nimport { createPayloadPlugin } from '@xyo-network/payload-plugin'\n\nimport { DomainPayload } from './Payload'\nimport { DomainSchema } from './Schema'\nimport { domainConfigTemplate } from './Template'\nimport { DomainPayloadWrapper } from './Wrapper'\n\nexport const DomainPayloadPlugin = () =>\n createPayloadPlugin<DomainPayload>({\n schema: DomainSchema,\n template: domainConfigTemplate,\n wrap: (payload: Payload) => DomainPayloadWrapper.wrap(payload as DomainPayload),\n })\n","export type DomainSchema = 'network.xyo.domain'\nexport const DomainSchema: DomainSchema = 'network.xyo.domain'\n","import { DomainPayload } from './Payload'\nimport { DomainSchema } from './Schema'\n\nexport const domainConfigTemplate = (): DomainPayload => ({\n aliases: {\n 'com.example.id': {\n huri: '',\n },\n },\n networks: [\n {\n name: '',\n nodes: [\n {\n name: '',\n schema: 'network.xyo.network.node',\n slug: '',\n type: 'archivist',\n uri: '',\n },\n ],\n schema: 'network.xyo.network',\n slug: '',\n },\n ],\n schema: DomainSchema,\n})\n","import { reverse } from '@xylabs/lodash'\nimport { ApiEnvelope } from '@xyo-network/api-models'\nimport { axios, AxiosError } from '@xyo-network/axios'\nimport { isBrowser, PayloadHasher } from '@xyo-network/core'\nimport { DnsRecordType, domainResolve } from '@xyo-network/dns'\nimport { FetchedPayload, Huri, HuriOptions } from '@xyo-network/huri'\nimport { NetworkPayload } from '@xyo-network/network'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { Alias, DomainPayload } from './Payload'\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 = reverse(parts.filter((_, index) => index < i)).join('.')\n return (await this.discoverDNSEntry(domainToCheck)) ?? (await this.discoverRootFile(domainToCheck, proxy))\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 (hash) {\n const huri = new Huri(hash)\n const payload = (await huri.fetch()) as DomainPayload\n if (payload) {\n return new DomainPayloadWrapper(payload)\n }\n }\n } catch (ex) {\n console.log(`DomainConfig dns reading error entry not found [${domain}]`)\n }\n }\n\n static async discoverRootFile(domain: string, proxy?: string) {\n return isBrowser() || proxy ? await this.discoverRootFileWithProxy(domain, proxy) : await this.discoverRootFileDirect(domain)\n }\n\n static async discoverRootFileDirect(domain: string) {\n try {\n const config = (await axios.get<DomainPayload>(`https://${domain}/xyo-config.json`)).data\n return new DomainPayloadWrapper(config)\n } catch (ex) {\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('.').reverse().join('.')}`\n const config = (await axios.get<ApiEnvelope<DomainPayload>>(requestUrl)).data.data\n return new DomainPayloadWrapper(config)\n } catch (ex) {\n const error = ex as AxiosError\n console.log(`DomainConfig root file not found using proxy [${domain}] [${error.code}]`)\n }\n }\n\n async fetch(networkSlug?: string) {\n await this.fetchAliases(networkSlug)\n }\n\n async fetchAliases(networkSlug?: string) {\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((alias) => alias) 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 ? { alias, huri, payload: payload } : null\n }\n\n private async findArchivistUri(hash?: string): 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?: string): Promise<NetworkPayload | undefined> {\n return hash ? await PayloadHasher.find(this.payload().networks, hash) : this.payload().networks?.[0]\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1,5 @@
1
- const DomainSchema = "network.xyo.domain";
1
+ // src/Schema.ts
2
+ var DomainSchema = "network.xyo.domain";
2
3
  export {
3
4
  DomainSchema
4
5
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Schema.ts"],"sourcesContent":["export type DomainSchema = 'network.xyo.domain'\nexport const DomainSchema: DomainSchema = 'network.xyo.domain'\n"],"mappings":"AACO,MAAM,eAA6B;","names":[]}
1
+ {"version":3,"sources":["../../src/Schema.ts"],"sourcesContent":["export type DomainSchema = 'network.xyo.domain'\nexport const DomainSchema: DomainSchema = 'network.xyo.domain'\n"],"mappings":";AACO,IAAM,eAA6B;","names":[]}
@@ -1,5 +1,8 @@
1
- import { DomainSchema } from "./Schema";
2
- const domainConfigTemplate = () => ({
1
+ // src/Schema.ts
2
+ var DomainSchema = "network.xyo.domain";
3
+
4
+ // src/Template.ts
5
+ var domainConfigTemplate = () => ({
3
6
  aliases: {
4
7
  "com.example.id": {
5
8
  huri: ""
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Template.ts"],"sourcesContent":["import { DomainPayload } from './Payload'\nimport { DomainSchema } from './Schema'\n\nexport const domainConfigTemplate = (): DomainPayload => ({\n aliases: {\n 'com.example.id': {\n huri: '',\n },\n },\n networks: [\n {\n name: '',\n nodes: [\n {\n name: '',\n schema: 'network.xyo.network.node',\n slug: '',\n type: 'archivist',\n uri: '',\n },\n ],\n schema: 'network.xyo.network',\n slug: '',\n },\n ],\n schema: DomainSchema,\n})\n"],"mappings":"AACA,SAAS,oBAAoB;AAEtB,MAAM,uBAAuB,OAAsB;AAAA,EACxD,SAAS;AAAA,IACP,kBAAkB;AAAA,MAChB,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE,MAAM;AAAA,MACN,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA,UACN,KAAK;AAAA,QACP;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,QAAQ;AACV;","names":[]}
1
+ {"version":3,"sources":["../../src/Schema.ts","../../src/Template.ts"],"sourcesContent":["export type DomainSchema = 'network.xyo.domain'\nexport const DomainSchema: DomainSchema = 'network.xyo.domain'\n","import { DomainPayload } from './Payload'\nimport { DomainSchema } from './Schema'\n\nexport const domainConfigTemplate = (): DomainPayload => ({\n aliases: {\n 'com.example.id': {\n huri: '',\n },\n },\n networks: [\n {\n name: '',\n nodes: [\n {\n name: '',\n schema: 'network.xyo.network.node',\n slug: '',\n type: 'archivist',\n uri: '',\n },\n ],\n schema: 'network.xyo.network',\n slug: '',\n },\n ],\n schema: DomainSchema,\n})\n"],"mappings":";AACO,IAAM,eAA6B;;;ACEnC,IAAM,uBAAuB,OAAsB;AAAA,EACxD,SAAS;AAAA,IACP,kBAAkB;AAAA,MAChB,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE,MAAM;AAAA,MACN,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA,UACN,KAAK;AAAA,QACP;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,QAAQ;AACV;","names":[]}
@@ -1,10 +1,11 @@
1
+ // src/Wrapper.ts
1
2
  import { reverse } from "@xylabs/lodash";
2
3
  import { axios } from "@xyo-network/axios";
3
4
  import { isBrowser, PayloadHasher } from "@xyo-network/core";
4
5
  import { DnsRecordType, domainResolve } from "@xyo-network/dns";
5
6
  import { Huri } from "@xyo-network/huri";
6
7
  import { PayloadWrapper } from "@xyo-network/payload-wrapper";
7
- class DomainPayloadWrapper extends PayloadWrapper {
8
+ var DomainPayloadWrapper = class _DomainPayloadWrapper extends PayloadWrapper {
8
9
  aliases;
9
10
  static async discover(reverseDomainName, proxy) {
10
11
  const parts = reverseDomainName.split(".");
@@ -20,7 +21,7 @@ class DomainPayloadWrapper extends PayloadWrapper {
20
21
  const huri = new Huri(hash);
21
22
  const payload = await huri.fetch();
22
23
  if (payload) {
23
- return new DomainPayloadWrapper(payload);
24
+ return new _DomainPayloadWrapper(payload);
24
25
  }
25
26
  }
26
27
  } catch (ex) {
@@ -33,7 +34,7 @@ class DomainPayloadWrapper extends PayloadWrapper {
33
34
  static async discoverRootFileDirect(domain) {
34
35
  try {
35
36
  const config = (await axios.get(`https://${domain}/xyo-config.json`)).data;
36
- return new DomainPayloadWrapper(config);
37
+ return new _DomainPayloadWrapper(config);
37
38
  } catch (ex) {
38
39
  console.log(`DomainConfig root file not found [${domain}]`);
39
40
  }
@@ -42,7 +43,7 @@ class DomainPayloadWrapper extends PayloadWrapper {
42
43
  try {
43
44
  const requestUrl = `${proxy}/${domain.split(".").reverse().join(".")}`;
44
45
  const config = (await axios.get(requestUrl)).data.data;
45
- return new DomainPayloadWrapper(config);
46
+ return new _DomainPayloadWrapper(config);
46
47
  } catch (ex) {
47
48
  const error = ex;
48
49
  console.log(`DomainConfig root file not found using proxy [${domain}] [${error.code}]`);
@@ -74,7 +75,7 @@ class DomainPayloadWrapper extends PayloadWrapper {
74
75
  async getNetwork(hash) {
75
76
  return hash ? await PayloadHasher.find(this.payload().networks, hash) : this.payload().networks?.[0];
76
77
  }
77
- }
78
+ };
78
79
  export {
79
80
  DomainPayloadWrapper
80
81
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Wrapper.ts"],"sourcesContent":["import { reverse } from '@xylabs/lodash'\nimport { ApiEnvelope } from '@xyo-network/api-models'\nimport { axios, AxiosError } from '@xyo-network/axios'\nimport { isBrowser, PayloadHasher } from '@xyo-network/core'\nimport { DnsRecordType, domainResolve } from '@xyo-network/dns'\nimport { FetchedPayload, Huri, HuriOptions } from '@xyo-network/huri'\nimport { NetworkPayload } from '@xyo-network/network'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { Alias, DomainPayload } from './Payload'\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 = reverse(parts.filter((_, index) => index < i)).join('.')\n return (await this.discoverDNSEntry(domainToCheck)) ?? (await this.discoverRootFile(domainToCheck, proxy))\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 (hash) {\n const huri = new Huri(hash)\n const payload = (await huri.fetch()) as DomainPayload\n if (payload) {\n return new DomainPayloadWrapper(payload)\n }\n }\n } catch (ex) {\n console.log(`DomainConfig dns reading error entry not found [${domain}]`)\n }\n }\n\n static async discoverRootFile(domain: string, proxy?: string) {\n return isBrowser() || proxy ? await this.discoverRootFileWithProxy(domain, proxy) : await this.discoverRootFileDirect(domain)\n }\n\n static async discoverRootFileDirect(domain: string) {\n try {\n const config = (await axios.get<DomainPayload>(`https://${domain}/xyo-config.json`)).data\n return new DomainPayloadWrapper(config)\n } catch (ex) {\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('.').reverse().join('.')}`\n const config = (await axios.get<ApiEnvelope<DomainPayload>>(requestUrl)).data.data\n return new DomainPayloadWrapper(config)\n } catch (ex) {\n const error = ex as AxiosError\n console.log(`DomainConfig root file not found using proxy [${domain}] [${error.code}]`)\n }\n }\n\n async fetch(networkSlug?: string) {\n await this.fetchAliases(networkSlug)\n }\n\n async fetchAliases(networkSlug?: string) {\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((alias) => alias) 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 ? { alias, huri, payload: payload } : null\n }\n\n private async findArchivistUri(hash?: string): 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?: string): Promise<NetworkPayload | undefined> {\n return hash ? await PayloadHasher.find(this.payload().networks, hash) : this.payload().networks?.[0]\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/Wrapper.ts"],"sourcesContent":["import { reverse } from '@xylabs/lodash'\nimport { ApiEnvelope } from '@xyo-network/api-models'\nimport { axios, AxiosError } from '@xyo-network/axios'\nimport { isBrowser, PayloadHasher } from '@xyo-network/core'\nimport { DnsRecordType, domainResolve } from '@xyo-network/dns'\nimport { FetchedPayload, Huri, HuriOptions } from '@xyo-network/huri'\nimport { NetworkPayload } from '@xyo-network/network'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { Alias, DomainPayload } from './Payload'\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 = reverse(parts.filter((_, index) => index < i)).join('.')\n return (await this.discoverDNSEntry(domainToCheck)) ?? (await this.discoverRootFile(domainToCheck, proxy))\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 (hash) {\n const huri = new Huri(hash)\n const payload = (await huri.fetch()) as DomainPayload\n if (payload) {\n return new DomainPayloadWrapper(payload)\n }\n }\n } catch (ex) {\n console.log(`DomainConfig dns reading error entry not found [${domain}]`)\n }\n }\n\n static async discoverRootFile(domain: string, proxy?: string) {\n return isBrowser() || proxy ? await this.discoverRootFileWithProxy(domain, proxy) : await this.discoverRootFileDirect(domain)\n }\n\n static async discoverRootFileDirect(domain: string) {\n try {\n const config = (await axios.get<DomainPayload>(`https://${domain}/xyo-config.json`)).data\n return new DomainPayloadWrapper(config)\n } catch (ex) {\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('.').reverse().join('.')}`\n const config = (await axios.get<ApiEnvelope<DomainPayload>>(requestUrl)).data.data\n return new DomainPayloadWrapper(config)\n } catch (ex) {\n const error = ex as AxiosError\n console.log(`DomainConfig root file not found using proxy [${domain}] [${error.code}]`)\n }\n }\n\n async fetch(networkSlug?: string) {\n await this.fetchAliases(networkSlug)\n }\n\n async fetchAliases(networkSlug?: string) {\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((alias) => alias) 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 ? { alias, huri, payload: payload } : null\n }\n\n private async findArchivistUri(hash?: string): 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?: string): Promise<NetworkPayload | undefined> {\n return hash ? await PayloadHasher.find(this.payload().networks, hash) : this.payload().networks?.[0]\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,11 +1,128 @@
1
- import { DomainPayloadPlugin } from "./Plugin";
2
- export * from "./Payload";
3
- export * from "./Schema";
4
- export * from "./Template";
5
- export * from "./Wrapper";
1
+ // src/Plugin.ts
2
+ import { createPayloadPlugin } from "@xyo-network/payload-plugin";
3
+
4
+ // src/Schema.ts
5
+ var DomainSchema = "network.xyo.domain";
6
+
7
+ // src/Template.ts
8
+ var domainConfigTemplate = () => ({
9
+ aliases: {
10
+ "com.example.id": {
11
+ huri: ""
12
+ }
13
+ },
14
+ networks: [
15
+ {
16
+ name: "",
17
+ nodes: [
18
+ {
19
+ name: "",
20
+ schema: "network.xyo.network.node",
21
+ slug: "",
22
+ type: "archivist",
23
+ uri: ""
24
+ }
25
+ ],
26
+ schema: "network.xyo.network",
27
+ slug: ""
28
+ }
29
+ ],
30
+ schema: DomainSchema
31
+ });
32
+
33
+ // src/Wrapper.ts
34
+ import { reverse } from "@xylabs/lodash";
35
+ import { axios } from "@xyo-network/axios";
36
+ import { isBrowser, PayloadHasher } from "@xyo-network/core";
37
+ import { DnsRecordType, domainResolve } from "@xyo-network/dns";
38
+ import { Huri } from "@xyo-network/huri";
39
+ import { PayloadWrapper } from "@xyo-network/payload-wrapper";
40
+ var DomainPayloadWrapper = class _DomainPayloadWrapper extends PayloadWrapper {
41
+ aliases;
42
+ static async discover(reverseDomainName, proxy) {
43
+ const parts = reverseDomainName.split(".");
44
+ for (let i = 2; i <= parts.length; i++) {
45
+ const domainToCheck = reverse(parts.filter((_, index) => index < i)).join(".");
46
+ return await this.discoverDNSEntry(domainToCheck) ?? await this.discoverRootFile(domainToCheck, proxy);
47
+ }
48
+ }
49
+ static async discoverDNSEntry(domain) {
50
+ try {
51
+ const hash = (await domainResolve(`_xyo.${domain}`, DnsRecordType.TXT))?.Answer?.[0]?.data;
52
+ if (hash) {
53
+ const huri = new Huri(hash);
54
+ const payload = await huri.fetch();
55
+ if (payload) {
56
+ return new _DomainPayloadWrapper(payload);
57
+ }
58
+ }
59
+ } catch (ex) {
60
+ console.log(`DomainConfig dns reading error entry not found [${domain}]`);
61
+ }
62
+ }
63
+ static async discoverRootFile(domain, proxy) {
64
+ return isBrowser() || proxy ? await this.discoverRootFileWithProxy(domain, proxy) : await this.discoverRootFileDirect(domain);
65
+ }
66
+ static async discoverRootFileDirect(domain) {
67
+ try {
68
+ const config = (await axios.get(`https://${domain}/xyo-config.json`)).data;
69
+ return new _DomainPayloadWrapper(config);
70
+ } catch (ex) {
71
+ console.log(`DomainConfig root file not found [${domain}]`);
72
+ }
73
+ }
74
+ static async discoverRootFileWithProxy(domain, proxy = "https://api.archivist.xyo.network/domain") {
75
+ try {
76
+ const requestUrl = `${proxy}/${domain.split(".").reverse().join(".")}`;
77
+ const config = (await axios.get(requestUrl)).data.data;
78
+ return new _DomainPayloadWrapper(config);
79
+ } catch (ex) {
80
+ const error = ex;
81
+ console.log(`DomainConfig root file not found using proxy [${domain}] [${error.code}]`);
82
+ }
83
+ }
84
+ async fetch(networkSlug) {
85
+ await this.fetchAliases(networkSlug);
86
+ }
87
+ async fetchAliases(networkSlug) {
88
+ this.aliases = null;
89
+ const archivistUri = await this.findArchivistUri(networkSlug);
90
+ if (this.payload().aliases) {
91
+ const fetchedAliases = await Promise.all(
92
+ Object.entries(this.payload().aliases ?? {}).map(([, alias]) => {
93
+ return this.fetchAlias(alias, { archivistUri });
94
+ })
95
+ );
96
+ this.aliases = fetchedAliases.filter((alias) => alias);
97
+ }
98
+ }
99
+ async fetchAlias(alias, huriOptions) {
100
+ const huri = new Huri(alias.huri, huriOptions);
101
+ const payload = await huri.fetch();
102
+ return payload ? { alias, huri, payload } : null;
103
+ }
104
+ async findArchivistUri(hash) {
105
+ return (await this.getNetwork(hash))?.nodes?.find((payload) => payload.type === "archivist" ? payload : void 0)?.uri;
106
+ }
107
+ async getNetwork(hash) {
108
+ return hash ? await PayloadHasher.find(this.payload().networks, hash) : this.payload().networks?.[0];
109
+ }
110
+ };
111
+
112
+ // src/Plugin.ts
113
+ var DomainPayloadPlugin = () => createPayloadPlugin({
114
+ schema: DomainSchema,
115
+ template: domainConfigTemplate,
116
+ wrap: (payload) => DomainPayloadWrapper.wrap(payload)
117
+ });
118
+
119
+ // src/index.ts
6
120
  var src_default = DomainPayloadPlugin;
7
121
  export {
8
122
  DomainPayloadPlugin,
9
- src_default as default
123
+ DomainPayloadWrapper,
124
+ DomainSchema,
125
+ src_default as default,
126
+ domainConfigTemplate
10
127
  };
11
128
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import { DomainPayloadPlugin } from './Plugin'\n\nexport * from './Payload'\nexport * from './Schema'\nexport * from './Template'\nexport * from './Wrapper'\n\nexport { DomainPayloadPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default DomainPayloadPlugin\n"],"mappings":"AAAA,SAAS,2BAA2B;AAEpC,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAKd,IAAO,cAAQ;","names":[]}
1
+ {"version":3,"sources":["../../src/Plugin.ts","../../src/Schema.ts","../../src/Template.ts","../../src/Wrapper.ts","../../src/index.ts"],"sourcesContent":["import { Payload } from '@xyo-network/payload-model'\nimport { createPayloadPlugin } from '@xyo-network/payload-plugin'\n\nimport { DomainPayload } from './Payload'\nimport { DomainSchema } from './Schema'\nimport { domainConfigTemplate } from './Template'\nimport { DomainPayloadWrapper } from './Wrapper'\n\nexport const DomainPayloadPlugin = () =>\n createPayloadPlugin<DomainPayload>({\n schema: DomainSchema,\n template: domainConfigTemplate,\n wrap: (payload: Payload) => DomainPayloadWrapper.wrap(payload as DomainPayload),\n })\n","export type DomainSchema = 'network.xyo.domain'\nexport const DomainSchema: DomainSchema = 'network.xyo.domain'\n","import { DomainPayload } from './Payload'\nimport { DomainSchema } from './Schema'\n\nexport const domainConfigTemplate = (): DomainPayload => ({\n aliases: {\n 'com.example.id': {\n huri: '',\n },\n },\n networks: [\n {\n name: '',\n nodes: [\n {\n name: '',\n schema: 'network.xyo.network.node',\n slug: '',\n type: 'archivist',\n uri: '',\n },\n ],\n schema: 'network.xyo.network',\n slug: '',\n },\n ],\n schema: DomainSchema,\n})\n","import { reverse } from '@xylabs/lodash'\nimport { ApiEnvelope } from '@xyo-network/api-models'\nimport { axios, AxiosError } from '@xyo-network/axios'\nimport { isBrowser, PayloadHasher } from '@xyo-network/core'\nimport { DnsRecordType, domainResolve } from '@xyo-network/dns'\nimport { FetchedPayload, Huri, HuriOptions } from '@xyo-network/huri'\nimport { NetworkPayload } from '@xyo-network/network'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { Alias, DomainPayload } from './Payload'\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 = reverse(parts.filter((_, index) => index < i)).join('.')\n return (await this.discoverDNSEntry(domainToCheck)) ?? (await this.discoverRootFile(domainToCheck, proxy))\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 (hash) {\n const huri = new Huri(hash)\n const payload = (await huri.fetch()) as DomainPayload\n if (payload) {\n return new DomainPayloadWrapper(payload)\n }\n }\n } catch (ex) {\n console.log(`DomainConfig dns reading error entry not found [${domain}]`)\n }\n }\n\n static async discoverRootFile(domain: string, proxy?: string) {\n return isBrowser() || proxy ? await this.discoverRootFileWithProxy(domain, proxy) : await this.discoverRootFileDirect(domain)\n }\n\n static async discoverRootFileDirect(domain: string) {\n try {\n const config = (await axios.get<DomainPayload>(`https://${domain}/xyo-config.json`)).data\n return new DomainPayloadWrapper(config)\n } catch (ex) {\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('.').reverse().join('.')}`\n const config = (await axios.get<ApiEnvelope<DomainPayload>>(requestUrl)).data.data\n return new DomainPayloadWrapper(config)\n } catch (ex) {\n const error = ex as AxiosError\n console.log(`DomainConfig root file not found using proxy [${domain}] [${error.code}]`)\n }\n }\n\n async fetch(networkSlug?: string) {\n await this.fetchAliases(networkSlug)\n }\n\n async fetchAliases(networkSlug?: string) {\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((alias) => alias) 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 ? { alias, huri, payload: payload } : null\n }\n\n private async findArchivistUri(hash?: string): 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?: string): Promise<NetworkPayload | undefined> {\n return hash ? await PayloadHasher.find(this.payload().networks, hash) : this.payload().networks?.[0]\n }\n}\n","import { DomainPayloadPlugin } from './Plugin'\n\nexport * from './Payload'\nexport * from './Schema'\nexport * from './Template'\nexport * from './Wrapper'\n\nexport { DomainPayloadPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default DomainPayloadPlugin\n"],"mappings":"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","names":[]}
@@ -1,3 +1,4 @@
1
+ // src/schemadef.json
1
2
  var $schema = "http://json-schema.org/draft-07/schema#";
2
3
  var additionalProperties = false;
3
4
  var definitions = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schemadef.json"],"sourcesContent":["{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"additionalProperties\": false,\n \"definitions\": {\n \"alias\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"huri\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"huri\"\n ],\n \"type\": \"object\"\n },\n \"network\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"nodes\": {\n \"items\": {\n \"$ref\": \"#/definitions/node\"\n },\n \"type\": \"array\"\n },\n \"slug\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"slug\"\n ],\n \"type\": \"object\"\n },\n \"node\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"slug\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"$ref\": \"#/definitions/node_type\"\n },\n \"uri\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"slug\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"node_type\": {\n \"enum\": [\n \"sentinel\",\n \"bridge\",\n \"archivist\",\n \"diviner\"\n ],\n \"type\": \"string\"\n }\n },\n \"properties\": {\n \"additional\": {\n \"description\": \"List of HURIs to additional configs for this domain\",\n \"items\": {\n \"type\": \"string\"\n },\n \"nullable\": false,\n \"type\": \"array\"\n },\n \"aliases\": {\n \"description\": \"List of HURIs to that are officially defined by this domain\",\n \"items\": {\n \"type\": \"string\"\n },\n \"nullable\": false,\n \"type\": \"array\"\n },\n \"domain\": {\n \"description\": \"The name of the domain that this config applies to\",\n \"nullable\": false,\n \"type\": \"string\"\n },\n \"networks\": {\n \"description\": \"List of networks that this domain participates in\",\n \"items\": {\n \"$ref\": \"#/definitions/network\"\n },\n \"nullable\": false,\n \"type\": \"array\"\n },\n \"schema\": {\n \"description\": \"The schema name (must be network.xyo.domain)\",\n \"nullable\": false,\n \"pattern\": \"/^network.xyo.domain$/\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\",\n \"schema\"\n ]\n}"],"mappings":"AACE,cAAW;AACX,2BAAwB;AACxB,kBAAe;AAAA,EACb,OAAS;AAAA,IACP,sBAAwB;AAAA,IACxB,YAAc;AAAA,MACZ,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,UAAY;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAQ;AAAA,EACV;AAAA,EACA,SAAW;AAAA,IACT,sBAAwB;AAAA,IACxB,YAAc;AAAA,MACZ,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,OAAS;AAAA,QACP,OAAS;AAAA,UACP,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,MACV;AAAA,MACA,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,UAAY;AAAA,MACV;AAAA,IACF;AAAA,IACA,MAAQ;AAAA,EACV;AAAA,EACA,MAAQ;AAAA,IACN,sBAAwB;AAAA,IACxB,YAAc;AAAA,MACZ,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,KAAO;AAAA,QACL,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,UAAY;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAQ;AAAA,EACV;AAAA,EACA,WAAa;AAAA,IACX,MAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAQ;AAAA,EACV;AACF;AACA,iBAAc;AAAA,EACZ,YAAc;AAAA,IACZ,aAAe;AAAA,IACf,OAAS;AAAA,MACP,MAAQ;AAAA,IACV;AAAA,IACA,UAAY;AAAA,IACZ,MAAQ;AAAA,EACV;AAAA,EACA,SAAW;AAAA,IACT,aAAe;AAAA,IACf,OAAS;AAAA,MACP,MAAQ;AAAA,IACV;AAAA,IACA,UAAY;AAAA,IACZ,MAAQ;AAAA,EACV;AAAA,EACA,QAAU;AAAA,IACR,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,MAAQ;AAAA,EACV;AAAA,EACA,UAAY;AAAA,IACV,aAAe;AAAA,IACf,OAAS;AAAA,MACP,MAAQ;AAAA,IACV;AAAA,IACA,UAAY;AAAA,IACZ,MAAQ;AAAA,EACV;AAAA,EACA,QAAU;AAAA,IACR,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,MAAQ;AAAA,EACV;AACF;AACA,eAAY;AAAA,EACV;AAAA,EACA;AACF;AAjHF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAsEA;AAAA,EAqCA;AAIF;","names":[]}
1
+ {"version":3,"sources":["../../src/schemadef.json"],"sourcesContent":["{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"additionalProperties\": false,\n \"definitions\": {\n \"alias\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"huri\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"huri\"\n ],\n \"type\": \"object\"\n },\n \"network\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"nodes\": {\n \"items\": {\n \"$ref\": \"#/definitions/node\"\n },\n \"type\": \"array\"\n },\n \"slug\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"slug\"\n ],\n \"type\": \"object\"\n },\n \"node\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"slug\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"$ref\": \"#/definitions/node_type\"\n },\n \"uri\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"slug\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"node_type\": {\n \"enum\": [\n \"sentinel\",\n \"bridge\",\n \"archivist\",\n \"diviner\"\n ],\n \"type\": \"string\"\n }\n },\n \"properties\": {\n \"additional\": {\n \"description\": \"List of HURIs to additional configs for this domain\",\n \"items\": {\n \"type\": \"string\"\n },\n \"nullable\": false,\n \"type\": \"array\"\n },\n \"aliases\": {\n \"description\": \"List of HURIs to that are officially defined by this domain\",\n \"items\": {\n \"type\": \"string\"\n },\n \"nullable\": false,\n \"type\": \"array\"\n },\n \"domain\": {\n \"description\": \"The name of the domain that this config applies to\",\n \"nullable\": false,\n \"type\": \"string\"\n },\n \"networks\": {\n \"description\": \"List of networks that this domain participates in\",\n \"items\": {\n \"$ref\": \"#/definitions/network\"\n },\n \"nullable\": false,\n \"type\": \"array\"\n },\n \"schema\": {\n \"description\": \"The schema name (must be network.xyo.domain)\",\n \"nullable\": false,\n \"pattern\": \"/^network.xyo.domain$/\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\",\n \"schema\"\n ]\n}"],"mappings":";AACE,cAAW;AACX,2BAAwB;AACxB,kBAAe;AAAA,EACb,OAAS;AAAA,IACP,sBAAwB;AAAA,IACxB,YAAc;AAAA,MACZ,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,UAAY;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAQ;AAAA,EACV;AAAA,EACA,SAAW;AAAA,IACT,sBAAwB;AAAA,IACxB,YAAc;AAAA,MACZ,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,OAAS;AAAA,QACP,OAAS;AAAA,UACP,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,MACV;AAAA,MACA,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,UAAY;AAAA,MACV;AAAA,IACF;AAAA,IACA,MAAQ;AAAA,EACV;AAAA,EACA,MAAQ;AAAA,IACN,sBAAwB;AAAA,IACxB,YAAc;AAAA,MACZ,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,MAAQ;AAAA,QACN,MAAQ;AAAA,MACV;AAAA,MACA,KAAO;AAAA,QACL,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,UAAY;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAQ;AAAA,EACV;AAAA,EACA,WAAa;AAAA,IACX,MAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAQ;AAAA,EACV;AACF;AACA,iBAAc;AAAA,EACZ,YAAc;AAAA,IACZ,aAAe;AAAA,IACf,OAAS;AAAA,MACP,MAAQ;AAAA,IACV;AAAA,IACA,UAAY;AAAA,IACZ,MAAQ;AAAA,EACV;AAAA,EACA,SAAW;AAAA,IACT,aAAe;AAAA,IACf,OAAS;AAAA,MACP,MAAQ;AAAA,IACV;AAAA,IACA,UAAY;AAAA,IACZ,MAAQ;AAAA,EACV;AAAA,EACA,QAAU;AAAA,IACR,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,MAAQ;AAAA,EACV;AAAA,EACA,UAAY;AAAA,IACV,aAAe;AAAA,IACf,OAAS;AAAA,MACP,MAAQ;AAAA,IACV;AAAA,IACA,UAAY;AAAA,IACZ,MAAQ;AAAA,EACV;AAAA,EACA,QAAU;AAAA,IACR,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,MAAQ;AAAA,EACV;AACF;AACA,eAAY;AAAA,EACV;AAAA,EACA;AACF;AAjHF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAsEA;AAAA,EAqCA;AAIF;","names":[]}