@xyo-network/api-call-witness 2.79.6 → 2.79.8

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.
Files changed (63) hide show
  1. package/dist/browser/Config.d.cts +383 -0
  2. package/dist/browser/Config.d.cts.map +1 -0
  3. package/dist/browser/Config.d.mts +383 -0
  4. package/dist/browser/Config.d.mts.map +1 -0
  5. package/dist/browser/Config.d.ts +383 -0
  6. package/dist/browser/Config.d.ts.map +1 -0
  7. package/dist/browser/Payload.d.cts +63 -3
  8. package/dist/browser/Payload.d.cts.map +1 -1
  9. package/dist/browser/Payload.d.mts +63 -3
  10. package/dist/browser/Payload.d.mts.map +1 -1
  11. package/dist/browser/Payload.d.ts +63 -3
  12. package/dist/browser/Payload.d.ts.map +1 -1
  13. package/dist/browser/Witness.d.cts +6 -9
  14. package/dist/browser/Witness.d.cts.map +1 -1
  15. package/dist/browser/Witness.d.mts +6 -9
  16. package/dist/browser/Witness.d.mts.map +1 -1
  17. package/dist/browser/Witness.d.ts +6 -9
  18. package/dist/browser/Witness.d.ts.map +1 -1
  19. package/dist/browser/index.cjs +80 -9
  20. package/dist/browser/index.cjs.map +1 -1
  21. package/dist/browser/index.d.cts +1 -0
  22. package/dist/browser/index.d.cts.map +1 -1
  23. package/dist/browser/index.d.mts +1 -0
  24. package/dist/browser/index.d.mts.map +1 -1
  25. package/dist/browser/index.d.ts +1 -0
  26. package/dist/browser/index.d.ts.map +1 -1
  27. package/dist/browser/index.js +70 -9
  28. package/dist/browser/index.js.map +1 -1
  29. package/dist/node/Config.d.cts +383 -0
  30. package/dist/node/Config.d.cts.map +1 -0
  31. package/dist/node/Config.d.mts +383 -0
  32. package/dist/node/Config.d.mts.map +1 -0
  33. package/dist/node/Config.d.ts +383 -0
  34. package/dist/node/Config.d.ts.map +1 -0
  35. package/dist/node/Payload.d.cts +63 -3
  36. package/dist/node/Payload.d.cts.map +1 -1
  37. package/dist/node/Payload.d.mts +63 -3
  38. package/dist/node/Payload.d.mts.map +1 -1
  39. package/dist/node/Payload.d.ts +63 -3
  40. package/dist/node/Payload.d.ts.map +1 -1
  41. package/dist/node/Witness.d.cts +6 -9
  42. package/dist/node/Witness.d.cts.map +1 -1
  43. package/dist/node/Witness.d.mts +6 -9
  44. package/dist/node/Witness.d.mts.map +1 -1
  45. package/dist/node/Witness.d.ts +6 -9
  46. package/dist/node/Witness.d.ts.map +1 -1
  47. package/dist/node/index.cjs +93 -10
  48. package/dist/node/index.cjs.map +1 -1
  49. package/dist/node/index.d.cts +1 -0
  50. package/dist/node/index.d.cts.map +1 -1
  51. package/dist/node/index.d.mts +1 -0
  52. package/dist/node/index.d.mts.map +1 -1
  53. package/dist/node/index.d.ts +1 -0
  54. package/dist/node/index.d.ts.map +1 -1
  55. package/dist/node/index.js +70 -9
  56. package/dist/node/index.js.map +1 -1
  57. package/package.json +12 -7
  58. package/src/Config.ts +42 -0
  59. package/src/Payload.ts +31 -5
  60. package/src/Witness.ts +54 -17
  61. package/src/index.ts +1 -0
  62. package/src/spec/opensea.nft-call.json +41 -0
  63. package/src/types.d.ts +1 -0
package/package.json CHANGED
@@ -13,17 +13,22 @@
13
13
  "@xylabs/assert": "^2.13.9",
14
14
  "@xylabs/axios": "^2.13.9",
15
15
  "@xylabs/buffer": "^2.13.9",
16
- "@xyo-network/abstract-witness": "~2.79.6",
17
- "@xyo-network/hash": "~2.79.6",
18
- "@xyo-network/object": "~2.79.6",
19
- "@xyo-network/payload-model": "~2.79.6",
20
- "@xyo-network/witness-model": "~2.79.6",
21
- "base64-js": "^1.5.1"
16
+ "@xyo-network/abstract-witness": "~2.79.8",
17
+ "@xyo-network/hash": "~2.79.8",
18
+ "@xyo-network/object": "~2.79.8",
19
+ "@xyo-network/payload-model": "~2.79.8",
20
+ "@xyo-network/witness-model": "~2.79.8",
21
+ "base64-js": "^1.5.1",
22
+ "es6-template-strings": "^2.0.1"
22
23
  },
23
24
  "devDependencies": {
24
25
  "@xylabs/jest-helpers": "^2.13.9",
25
26
  "@xylabs/ts-scripts-yarn3": "^3.1.21",
26
27
  "@xylabs/tsconfig": "^3.1.21",
28
+ "@xyo-network/account": "~2.79.8",
29
+ "@xyo-network/manifest": "~2.79.8",
30
+ "@xyo-network/module-model": "~2.79.8",
31
+ "@xyo-network/sentinel-model": "~2.79.8",
27
32
  "ethers": "^5.7.2",
28
33
  "jest": "^29.7.0",
29
34
  "typescript": "^5.2.2"
@@ -67,6 +72,6 @@
67
72
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
68
73
  },
69
74
  "sideEffects": false,
70
- "version": "2.79.6",
75
+ "version": "2.79.8",
71
76
  "type": "module"
72
77
  }
package/src/Config.ts ADDED
@@ -0,0 +1,42 @@
1
+ import { AsObjectFactory } from '@xyo-network/object'
2
+ import { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'
3
+ import { WitnessConfig } from '@xyo-network/witness-model'
4
+
5
+ import { ApiCall, ApiUriCall, ApiUriTemplateCall } from './Payload'
6
+
7
+ export const ApiCallWitnessConfigSchema = 'network.xyo.api.call.witness.config'
8
+ export type ApiCallWitnessConfigSchema = typeof ApiCallWitnessConfigSchema
9
+
10
+ export type ApiCallWitnessConfigBase = WitnessConfig<{
11
+ accept?: 'application/json'
12
+ queries?: ApiCall['queries']
13
+ schema: ApiCallWitnessConfigSchema
14
+ timeout?: number
15
+ verb?: ApiCall['verb']
16
+ }>
17
+
18
+ export type ApiUriCallWitnessConfig = WitnessConfig<
19
+ ApiCallWitnessConfigBase & {
20
+ uri: ApiUriCall['uri']
21
+ }
22
+ >
23
+
24
+ export type ApiUriTemplateCallWitnessConfig = WitnessConfig<
25
+ ApiCallWitnessConfigBase & {
26
+ params?: Record<string, unknown>
27
+ uriTemplate: ApiUriTemplateCall['uriTemplate']
28
+ }
29
+ >
30
+
31
+ export type ApiCallWitnessConfig = ApiUriCallWitnessConfig | ApiUriTemplateCallWitnessConfig | ApiCallWitnessConfigBase
32
+
33
+ export const isApiCallWitnessConfig = isPayloadOfSchemaType(ApiCallWitnessConfigSchema)
34
+ export const asApiCallWitnessConfig = AsObjectFactory.create(isApiCallWitnessConfig)
35
+
36
+ export const isApiUriCallWitnessConfig = (payload?: Payload): payload is ApiUriCallWitnessConfig =>
37
+ isApiCallWitnessConfig(payload) && !!(payload as ApiUriCallWitnessConfig).uri
38
+ export const asApiUriCallWitnessConfig = AsObjectFactory.create(isApiUriCallWitnessConfig)
39
+
40
+ export const isApiUriTemplateCallWitnessConfig = (payload?: Payload): payload is ApiUriTemplateCallWitnessConfig =>
41
+ isApiCallWitnessConfig(payload) && !!(payload as ApiUriTemplateCallWitnessConfig).uriTemplate
42
+ export const asApiUriTemplateCallWitnessConfig = AsObjectFactory.create(isApiUriTemplateCallWitnessConfig)
package/src/Payload.ts CHANGED
@@ -1,19 +1,35 @@
1
1
  import { Hash } from '@xyo-network/hash'
2
- import { Payload } from '@xyo-network/payload-model'
2
+ import { AsObjectFactory } from '@xyo-network/object'
3
+ import { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'
3
4
 
4
5
  export const ApiCallSchema = 'network.xyo.api.call'
5
6
  export type ApiCallSchema = typeof ApiCallSchema
6
7
 
7
- export type Verb = 'get' | 'post'
8
+ type Verb = 'get' | 'post'
9
+ type Queries = Record<string, string>
8
10
 
9
- export type ApiCall = Payload<
10
- {
11
+ export interface ApiCallFields {
12
+ queries?: Queries
13
+ verb?: Verb
14
+ }
15
+
16
+ export type ApiUriCall = Payload<
17
+ ApiCallFields & {
11
18
  uri: string
12
- verb?: Verb
13
19
  },
14
20
  ApiCallSchema
15
21
  >
16
22
 
23
+ export type ApiUriTemplateCall = Payload<
24
+ ApiCallFields & {
25
+ params?: Record<string, unknown>
26
+ uriTemplate?: string
27
+ },
28
+ ApiCallSchema
29
+ >
30
+
31
+ export type ApiCall = ApiUriCall | ApiUriTemplateCall
32
+
17
33
  export const ApiCallResultSchema = 'network.xyo.api.call.result'
18
34
  export type ApiCallResultSchema = typeof ApiCallResultSchema
19
35
 
@@ -49,3 +65,13 @@ export type ApiCallErrorResult = Payload<
49
65
  >
50
66
 
51
67
  export type ApiCallResult = ApiCallBase64Result | ApiCallJsonResult | ApiCallErrorResult
68
+
69
+ export const isApiCall = isPayloadOfSchemaType(ApiCallSchema)
70
+ export const asApiCall = AsObjectFactory.create(isApiCall)
71
+
72
+ export const isApiUriCall = (payload?: Payload): payload is ApiUriCall => isApiCall(payload) && !!(payload as ApiUriCall).uri
73
+ export const asApiUriCall = AsObjectFactory.create(isApiUriCall)
74
+
75
+ export const isApiUriTemplateCall = (payload?: Payload): payload is ApiUriTemplateCall =>
76
+ isApiCall(payload) && !!((payload as ApiUriTemplateCall).uriTemplate || (payload as ApiUriTemplateCall).params)
77
+ export const asApiUriTemplateCall = AsObjectFactory.create(isApiUriTemplateCall)
package/src/Witness.ts CHANGED
@@ -5,9 +5,11 @@ import { AbstractWitness } from '@xyo-network/abstract-witness'
5
5
  import { Hash, PayloadHasher } from '@xyo-network/hash'
6
6
  import { JsonArray, JsonObject } from '@xyo-network/object'
7
7
  import { isPayloadOfSchemaType } from '@xyo-network/payload-model'
8
- import { WitnessConfig, WitnessParams } from '@xyo-network/witness-model'
8
+ import { WitnessParams } from '@xyo-network/witness-model'
9
9
  import { fromByteArray } from 'base64-js'
10
+ import template from 'es6-template-strings'
10
11
 
12
+ import { ApiCallWitnessConfig, ApiCallWitnessConfigSchema, asApiUriCallWitnessConfig, asApiUriTemplateCallWitnessConfig } from './Config'
11
13
  import { checkIpfsUrl } from './lib'
12
14
  import {
13
15
  ApiCall,
@@ -17,37 +19,71 @@ import {
17
19
  ApiCallResult,
18
20
  ApiCallResultSchema,
19
21
  ApiCallSchema,
20
- Verb,
22
+ asApiUriCall,
23
+ asApiUriTemplateCall,
21
24
  } from './Payload'
22
25
 
23
- export const ApiCallWitnessConfigSchema = 'network.xyo.api.call.witness.config'
24
- export type ApiCallWitnessConfigSchema = typeof ApiCallWitnessConfigSchema
25
-
26
- export type ApiCallWitnessConfig = WitnessConfig<{
27
- accept: 'application/json'
28
- schema: ApiCallWitnessConfigSchema
29
- verb?: Verb
30
- }>
31
-
32
- export type ApiCallWitnessParams = WitnessParams<ApiCallWitnessConfig, { ipfsGateway?: string }>
26
+ export type ApiCallWitnessParams = WitnessParams<
27
+ ApiCallWitnessConfig,
28
+ {
29
+ headers?: Record<string, string | undefined>
30
+ ipfsGateway?: string
31
+ }
32
+ >
33
33
 
34
34
  export class ApiCallWitness<TParams extends ApiCallWitnessParams = ApiCallWitnessParams> extends AbstractWitness<TParams, ApiCall, ApiCallResult> {
35
35
  static override configSchemas = [ApiCallWitnessConfigSchema]
36
36
 
37
37
  get accept() {
38
- return this.config.accept
38
+ return this.config.accept ?? 'application/json'
39
39
  }
40
40
 
41
41
  get ipfsGateway() {
42
42
  return this.params.ipfsGateway
43
43
  }
44
44
 
45
+ get timeout() {
46
+ return this.config.timeout
47
+ }
48
+
49
+ getFullUri(call?: ApiCall): string {
50
+ const { uri: callUri } = asApiUriCall(call) ?? {}
51
+ const { uriTemplate: callUriTemplate, params: callParams, queries: callQueries } = asApiUriTemplateCall(call) ?? {}
52
+ const { uri: configUri } = asApiUriCallWitnessConfig(this.config) ?? {}
53
+ const { uriTemplate: configUriTemplate, params: configParams, queries: configQueries } = asApiUriTemplateCallWitnessConfig(this.config) ?? {}
54
+
55
+ const params = { ...configParams, ...callParams }
56
+
57
+ let url: URL | undefined = undefined
58
+
59
+ if (callUri) {
60
+ url = new URL(callUri)
61
+ } else if (callUriTemplate) {
62
+ url = new URL(template(callUriTemplate, params))
63
+ } else if (configUri) {
64
+ url = new URL(configUri)
65
+ } else if (configUriTemplate) {
66
+ url = new URL(template(configUriTemplate, params))
67
+ }
68
+
69
+ if (url) {
70
+ const queries = Object.entries({ ...configQueries, ...callQueries })
71
+ queries.map(([key, value]) => url?.searchParams.set(key, value))
72
+ return url.href
73
+ }
74
+
75
+ throw Error('Unable to determine uri. No uri/uriTemplate specified in either the call or config.')
76
+ }
77
+
45
78
  protected override async observeHandler(inPayloads: ApiCall[] = []): Promise<ApiCallResult[]> {
46
79
  await this.started('throw')
47
80
  try {
48
81
  const observations = await Promise.all(
49
82
  inPayloads.filter(isPayloadOfSchemaType(ApiCallSchema)).map(async (call) => {
50
- const { uri, verb } = call
83
+ const { verb: callVerb } = call
84
+ const { verb: configVerb } = this.config
85
+ const verb = callVerb ?? configVerb ?? 'get'
86
+ const uri = this.getFullUri(call)
51
87
 
52
88
  const validatedUri = assertEx(checkIpfsUrl(uri, this.ipfsGateway), 'Invalid URI')
53
89
 
@@ -65,7 +101,8 @@ export class ApiCallWitness<TParams extends ApiCallWitnessParams = ApiCallWitnes
65
101
  return observations
66
102
  } catch (ex) {
67
103
  const error = ex as Error
68
- console.log(`Error [${this.config.name}]: ${error.message}`)
104
+ console.error(`Error [${this.config.name}]: ${error.message}`)
105
+ console.log(error.stack)
69
106
  throw error
70
107
  }
71
108
  }
@@ -78,7 +115,7 @@ export class ApiCallWitness<TParams extends ApiCallWitnessParams = ApiCallWitnes
78
115
  try {
79
116
  switch (this.accept) {
80
117
  case 'application/json': {
81
- const axios = new AxiosJson()
118
+ const axios = new AxiosJson({ headers: this.params.headers, timeout: this.timeout })
82
119
  const response = await axios.get<JsonArray | JsonObject>(url)
83
120
  if (response.status >= 200 && response.status < 300) {
84
121
  const jsonResult = result as ApiCallJsonResult
@@ -93,7 +130,7 @@ export class ApiCallWitness<TParams extends ApiCallWitnessParams = ApiCallWitnes
93
130
  break
94
131
  }
95
132
  default: {
96
- const axios = new Axios({ responseType: 'arraybuffer' })
133
+ const axios = new Axios({ headers: this.params.headers, responseType: 'arraybuffer', timeout: this.timeout })
97
134
  const response = await axios.get(url)
98
135
  if (response.status >= 200 && response.status < 300) {
99
136
  const jsonResult = result as ApiCallBase64Result
package/src/index.ts CHANGED
@@ -1,2 +1,3 @@
1
+ export * from './Config'
1
2
  export * from './Payload'
2
3
  export * from './Witness'
@@ -0,0 +1,41 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json",
3
+ "nodes": [
4
+ {
5
+ "config": {
6
+ "name": "ApiCall",
7
+ "schema": "network.xyo.node.config"
8
+ },
9
+ "modules": {
10
+ "public": [
11
+ {
12
+ "config": {
13
+ "language": "javascript",
14
+ "name": "ApiCallWitness",
15
+ "queries": {
16
+ "limit": 1
17
+ },
18
+ "schema": "network.xyo.api.call.witness.config",
19
+ "uriTemplate": "https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts"
20
+ }
21
+ },
22
+ {
23
+ "config": {
24
+ "language": "javascript",
25
+ "name": "ApiCallSentinel",
26
+ "schema": "network.xyo.sentinel.config",
27
+ "synchronous": "true",
28
+ "tasks": [
29
+ {
30
+ "input": true,
31
+ "module": "ApiCallWitness"
32
+ }
33
+ ]
34
+ }
35
+ }
36
+ ]
37
+ }
38
+ }
39
+ ],
40
+ "schema": "network.xyo.manifest"
41
+ }
package/src/types.d.ts ADDED
@@ -0,0 +1 @@
1
+ declare module 'es6-template-strings'