@iota/graphql-transport 0.18.1 → 0.19.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/CHANGELOG.md +48 -0
- package/dist/cjs/generated/queries.d.ts +336 -112
- package/dist/cjs/generated/queries.d.ts.map +1 -1
- package/dist/cjs/generated/queries.js +50 -0
- package/dist/cjs/generated/queries.js.map +2 -2
- package/dist/cjs/graphql-websocket-client.d.ts +84 -0
- package/dist/cjs/graphql-websocket-client.d.ts.map +1 -0
- package/dist/cjs/graphql-websocket-client.js +324 -0
- package/dist/cjs/graphql-websocket-client.js.map +7 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/mappers/bcs.d.ts.map +1 -1
- package/dist/cjs/mappers/bcs.js +11 -3
- package/dist/cjs/mappers/bcs.js.map +2 -2
- package/dist/cjs/mappers/subscription.d.ts +33 -0
- package/dist/cjs/mappers/subscription.d.ts.map +1 -0
- package/dist/cjs/mappers/subscription.js +95 -0
- package/dist/cjs/mappers/subscription.js.map +7 -0
- package/dist/cjs/mappers/util.d.ts +3 -0
- package/dist/cjs/mappers/util.d.ts.map +1 -1
- package/dist/cjs/mappers/util.js +14 -0
- package/dist/cjs/mappers/util.js.map +2 -2
- package/dist/cjs/methods.d.ts.map +1 -1
- package/dist/cjs/methods.js +1 -23
- package/dist/cjs/methods.js.map +2 -2
- package/dist/cjs/transport.d.ts +5 -0
- package/dist/cjs/transport.d.ts.map +1 -1
- package/dist/cjs/transport.js +99 -1
- package/dist/cjs/transport.js.map +2 -2
- package/dist/esm/generated/queries.d.ts +336 -112
- package/dist/esm/generated/queries.d.ts.map +1 -1
- package/dist/esm/generated/queries.js +50 -0
- package/dist/esm/generated/queries.js.map +2 -2
- package/dist/esm/graphql-websocket-client.d.ts +84 -0
- package/dist/esm/graphql-websocket-client.d.ts.map +1 -0
- package/dist/esm/graphql-websocket-client.js +304 -0
- package/dist/esm/graphql-websocket-client.js.map +7 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/mappers/bcs.d.ts.map +1 -1
- package/dist/esm/mappers/bcs.js +11 -3
- package/dist/esm/mappers/bcs.js.map +2 -2
- package/dist/esm/mappers/subscription.d.ts +33 -0
- package/dist/esm/mappers/subscription.d.ts.map +1 -0
- package/dist/esm/mappers/subscription.js +75 -0
- package/dist/esm/mappers/subscription.js.map +7 -0
- package/dist/esm/mappers/util.d.ts +3 -0
- package/dist/esm/mappers/util.d.ts.map +1 -1
- package/dist/esm/mappers/util.js +14 -0
- package/dist/esm/mappers/util.js.map +2 -2
- package/dist/esm/methods.d.ts.map +1 -1
- package/dist/esm/methods.js +2 -25
- package/dist/esm/methods.js.map +2 -2
- package/dist/esm/transport.d.ts +5 -0
- package/dist/esm/transport.d.ts.map +1 -1
- package/dist/esm/transport.js +112 -2
- package/dist/esm/transport.js.map +2 -2
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -9
package/dist/esm/transport.js
CHANGED
|
@@ -6,11 +6,25 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
|
|
|
6
6
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
7
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
8
8
|
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
9
|
-
var _options, _fallbackTransport, _fallbackMethods, _unsupportedMethods, _IotaClientGraphQLTransport_instances, tryUseFallback_fn;
|
|
9
|
+
var _options, _fallbackTransport, _fallbackMethods, _unsupportedMethods, _wsClient, _IotaClientGraphQLTransport_instances, getWebSocketClient_fn, subscribeWithFallback_fn, subscribeEvents_fn, subscribeTransactions_fn, tryUseFallback_fn;
|
|
10
10
|
import { IotaHTTPTransport } from "@iota/iota-sdk/client";
|
|
11
11
|
import { print } from "graphql";
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
SubscribeEventsDocument,
|
|
14
|
+
SubscribeTransactionsDocument,
|
|
15
|
+
TypedDocumentString
|
|
16
|
+
} from "./generated/queries.js";
|
|
17
|
+
import {
|
|
18
|
+
GraphQLWebSocketClient,
|
|
19
|
+
GraphQLWebSocketConnectionError
|
|
20
|
+
} from "./graphql-websocket-client.js";
|
|
13
21
|
import { RPC_METHODS, UnsupportedMethodError, UnsupportedParamError } from "./methods.js";
|
|
22
|
+
import {
|
|
23
|
+
mapRpcEventFilterToGraphQL,
|
|
24
|
+
mapRpcTransactionFilterToGraphQL,
|
|
25
|
+
mapSubscriptionEvent,
|
|
26
|
+
mapSubscriptionTransaction
|
|
27
|
+
} from "./mappers/subscription.js";
|
|
14
28
|
class IotaClientGraphQLTransport {
|
|
15
29
|
constructor(options) {
|
|
16
30
|
__privateAdd(this, _IotaClientGraphQLTransport_instances);
|
|
@@ -18,6 +32,7 @@ class IotaClientGraphQLTransport {
|
|
|
18
32
|
__privateAdd(this, _fallbackTransport);
|
|
19
33
|
__privateAdd(this, _fallbackMethods);
|
|
20
34
|
__privateAdd(this, _unsupportedMethods);
|
|
35
|
+
__privateAdd(this, _wsClient, null);
|
|
21
36
|
__privateSet(this, _options, options);
|
|
22
37
|
__privateSet(this, _fallbackMethods, options.fallbackMethods || [
|
|
23
38
|
"executeTransactionBlock",
|
|
@@ -39,6 +54,10 @@ class IotaClientGraphQLTransport {
|
|
|
39
54
|
}));
|
|
40
55
|
}
|
|
41
56
|
}
|
|
57
|
+
close() {
|
|
58
|
+
__privateGet(this, _wsClient)?.close();
|
|
59
|
+
__privateSet(this, _wsClient, null);
|
|
60
|
+
}
|
|
42
61
|
async graphqlQuery(options, getData) {
|
|
43
62
|
const res = await this.graphqlRequest(options);
|
|
44
63
|
if (!res.ok) {
|
|
@@ -102,6 +121,14 @@ class IotaClientGraphQLTransport {
|
|
|
102
121
|
return __privateGet(this, _options).inspector ? __privateGet(this, _options).inspector(input, executeRequest) : executeRequest();
|
|
103
122
|
}
|
|
104
123
|
async subscribe(input) {
|
|
124
|
+
switch (input.method) {
|
|
125
|
+
case "iotax_subscribeEvent":
|
|
126
|
+
return __privateMethod(this, _IotaClientGraphQLTransport_instances, subscribeWithFallback_fn).call(this, input, () => __privateMethod(this, _IotaClientGraphQLTransport_instances, subscribeEvents_fn).call(this, input));
|
|
127
|
+
case "iotax_subscribeTransaction":
|
|
128
|
+
return __privateMethod(this, _IotaClientGraphQLTransport_instances, subscribeWithFallback_fn).call(this, input, () => __privateMethod(this, _IotaClientGraphQLTransport_instances, subscribeTransactions_fn).call(this, input));
|
|
129
|
+
default:
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
105
132
|
if (!__privateGet(this, _fallbackTransport)) {
|
|
106
133
|
throw new UnsupportedMethodError(input.method);
|
|
107
134
|
}
|
|
@@ -112,7 +139,90 @@ _options = new WeakMap();
|
|
|
112
139
|
_fallbackTransport = new WeakMap();
|
|
113
140
|
_fallbackMethods = new WeakMap();
|
|
114
141
|
_unsupportedMethods = new WeakMap();
|
|
142
|
+
_wsClient = new WeakMap();
|
|
115
143
|
_IotaClientGraphQLTransport_instances = new WeakSet();
|
|
144
|
+
getWebSocketClient_fn = function() {
|
|
145
|
+
if (!__privateGet(this, _wsClient)) {
|
|
146
|
+
const endpoint = __privateGet(this, _options).wsUrl ? __privateGet(this, _options).wsUrl : __privateGet(this, _options).url.replace(/\/?$/, "/subscriptions");
|
|
147
|
+
__privateSet(this, _wsClient, new GraphQLWebSocketClient(endpoint, {
|
|
148
|
+
...__privateGet(this, _options).wsOptions,
|
|
149
|
+
...__privateGet(this, _options).WebSocketConstructor ? { WebSocketConstructor: __privateGet(this, _options).WebSocketConstructor } : {}
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
return __privateGet(this, _wsClient);
|
|
153
|
+
};
|
|
154
|
+
subscribeWithFallback_fn = async function(input, subscribe) {
|
|
155
|
+
try {
|
|
156
|
+
return await subscribe();
|
|
157
|
+
} catch (error) {
|
|
158
|
+
const recoverable = error instanceof UnsupportedParamError || error instanceof GraphQLWebSocketConnectionError;
|
|
159
|
+
if (recoverable && __privateGet(this, _fallbackTransport)) {
|
|
160
|
+
return __privateGet(this, _fallbackTransport).subscribe(input);
|
|
161
|
+
}
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
subscribeEvents_fn = async function(input) {
|
|
166
|
+
const rpcFilter = input.params[0];
|
|
167
|
+
const filter = rpcFilter ? mapRpcEventFilterToGraphQL(rpcFilter) : void 0;
|
|
168
|
+
let currentDigest = input.startAfter;
|
|
169
|
+
let startAfter = input.startAfter;
|
|
170
|
+
const client = __privateMethod(this, _IotaClientGraphQLTransport_instances, getWebSocketClient_fn).call(this);
|
|
171
|
+
return client.subscribe({
|
|
172
|
+
query: SubscribeEventsDocument.toString(),
|
|
173
|
+
variables: () => ({ filter, startAfter }),
|
|
174
|
+
onMessage: (data) => {
|
|
175
|
+
const payload = data.events;
|
|
176
|
+
if (payload.__typename === "Lagged") {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const digest = payload.transactionBlock?.digest ?? void 0;
|
|
180
|
+
if (digest && digest !== currentDigest) {
|
|
181
|
+
startAfter = currentDigest;
|
|
182
|
+
currentDigest = digest;
|
|
183
|
+
}
|
|
184
|
+
input.onMessage(mapSubscriptionEvent(payload));
|
|
185
|
+
},
|
|
186
|
+
onError: (errors) => {
|
|
187
|
+
input.onError?.(
|
|
188
|
+
new Error(
|
|
189
|
+
`GraphQL events subscription ended: ${errors.map((e) => e.message).join(", ")}`
|
|
190
|
+
)
|
|
191
|
+
);
|
|
192
|
+
},
|
|
193
|
+
signal: input.signal
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
subscribeTransactions_fn = async function(input) {
|
|
197
|
+
const rpcFilter = input.params[0];
|
|
198
|
+
const filter = rpcFilter ? mapRpcTransactionFilterToGraphQL(rpcFilter) : void 0;
|
|
199
|
+
let startAfter = input.startAfter;
|
|
200
|
+
const client = __privateMethod(this, _IotaClientGraphQLTransport_instances, getWebSocketClient_fn).call(this);
|
|
201
|
+
return client.subscribe({
|
|
202
|
+
query: SubscribeTransactionsDocument.toString(),
|
|
203
|
+
variables: () => ({ filter, startAfter }),
|
|
204
|
+
onMessage: (data) => {
|
|
205
|
+
const payload = data.transactions;
|
|
206
|
+
if (payload.__typename === "Lagged") {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const effects = mapSubscriptionTransaction(payload);
|
|
210
|
+
if (!effects) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
startAfter = effects.transactionDigest;
|
|
214
|
+
input.onMessage(effects);
|
|
215
|
+
},
|
|
216
|
+
onError: (errors) => {
|
|
217
|
+
input.onError?.(
|
|
218
|
+
new Error(
|
|
219
|
+
`GraphQL transactions subscription ended: ${errors.map((e) => e.message).join(", ")}`
|
|
220
|
+
)
|
|
221
|
+
);
|
|
222
|
+
},
|
|
223
|
+
signal: input.signal
|
|
224
|
+
});
|
|
225
|
+
};
|
|
116
226
|
tryUseFallback_fn = async function(input) {
|
|
117
227
|
if (!__privateGet(this, _fallbackTransport)) {
|
|
118
228
|
throw new UnsupportedMethodError(input.method);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/transport.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// Modifications Copyright (c) 2024 IOTA Stiftung\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport type {\n IotaTransport,\n IotaTransportRequestOptions,\n IotaTransportSubscribeOptions,\n RequestInspector,\n} from '@iota/iota-sdk/client';\nimport { IotaHTTPTransport } from '@iota/iota-sdk/client';\nimport type { DocumentNode } from 'graphql';\nimport { print } from 'graphql';\n\nimport { TypedDocumentString } from './generated/queries.js';\nimport { RPC_METHODS, UnsupportedMethodError, UnsupportedParamError } from './methods.js';\n\nexport interface IotaClientGraphQLTransportOptions {\n url: string;\n fallbackTransportUrl?: string;\n fallbackMethods?: (keyof typeof RPC_METHODS)[];\n unsupportedMethods?: (keyof typeof RPC_METHODS)[];\n /** Optional inspector function for monitoring and tracing requests */\n inspector?: RequestInspector;\n}\n\nexport type GraphQLDocument<\n Result = Record<string, unknown>,\n Variables = Record<string, unknown>,\n> =\n | string\n | DocumentNode\n | TypedDocumentNode<Result, Variables>\n | TypedDocumentString<Result, Variables>;\n\nexport type GraphQLQueryOptions<\n Result = Record<string, unknown>,\n Variables = Record<string, unknown>,\n> = {\n query: GraphQLDocument<Result, Variables>;\n operationName?: string;\n extensions?: Record<string, unknown>;\n} & (Variables extends { [key: string]: never }\n ? { variables?: Variables }\n : {\n variables: Variables;\n });\n\nexport type GraphQLQueryResult<Result = Record<string, unknown>> = {\n data?: Result;\n errors?: GraphQLResponseErrors;\n extensions?: Record<string, unknown>;\n};\n\nexport type GraphQLResponseErrors = Array<{\n message: string;\n locations?: { line: number; column: number }[];\n path?: (string | number)[];\n}>;\n\nexport class IotaClientGraphQLTransport implements IotaTransport {\n #options: IotaClientGraphQLTransportOptions;\n #fallbackTransport?: IotaTransport;\n #fallbackMethods: (keyof typeof RPC_METHODS)[];\n #unsupportedMethods: (keyof typeof RPC_METHODS)[];\n\n constructor(options: IotaClientGraphQLTransportOptions) {\n this.#options = options;\n this.#fallbackMethods = options.fallbackMethods || [\n 'executeTransactionBlock',\n 'dryRunTransactionBlock',\n 'devInspectTransactionBlock',\n 'getTotalTransactions',\n 'getNetworkMetrics',\n 'getParticipationMetrics',\n 'getMoveCallMetrics',\n 'getAllEpochAddressMetrics',\n 'getEpochs',\n 'getDynamicFieldObjectV2',\n ];\n this.#unsupportedMethods = options.unsupportedMethods || ['getOwnedObjects'];\n\n if (options.fallbackTransportUrl) {\n this.#fallbackTransport = new IotaHTTPTransport({\n url: options.fallbackTransportUrl,\n inspector: options.inspector,\n });\n }\n }\n\n async graphqlQuery<\n Result = Record<string, unknown>,\n Variables = Record<string, unknown>,\n Data = Result,\n >(\n options: GraphQLQueryOptions<Result, Variables>,\n getData?: (result: Result) => Data,\n ): Promise<NonNullable<Data>> {\n const res = await this.graphqlRequest(options);\n\n if (!res.ok) {\n throw new Error('Failed to fetch');\n }\n\n const { data, errors } = (await res.json()) as GraphQLQueryResult<Result>;\n\n handleGraphQLErrors(errors);\n\n const extractedData = data && (getData ? getData(data) : data);\n\n if (extractedData == null) {\n throw new Error('Missing response data');\n }\n\n return extractedData as NonNullable<Data>;\n }\n\n async graphqlRequest<Result = Record<string, unknown>, Variables = Record<string, unknown>>(\n options: GraphQLQueryOptions<Result, Variables>,\n ): Promise<Response> {\n return fetch(this.#options.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query:\n typeof options.query === 'string' ||\n options.query instanceof TypedDocumentString\n ? options.query.toString()\n : print(options.query),\n variables: options.variables,\n extensions: options.extensions,\n operationName: options.operationName,\n }),\n });\n }\n\n async request<T = unknown>(input: IotaTransportRequestOptions): Promise<T> {\n const executeRequest = async () => {\n let clientMethod: keyof typeof RPC_METHODS;\n\n switch (input.method) {\n case 'rpc.discover':\n clientMethod = 'getRpcApiVersion';\n break;\n case 'iotax_getLatestAddressMetrics':\n clientMethod = 'getAddressMetrics';\n break;\n default:\n clientMethod = input.method.split('_')[1] as keyof typeof RPC_METHODS;\n }\n\n // Methods with allowed fallback will go through GraphQL first and only default to JSON-RPC if they fail\n const allowFallback = this.#fallbackMethods.includes(clientMethod);\n // Unsupported methods will go through JSON-RPC directly\n const isUnsupported = this.#unsupportedMethods.includes(clientMethod);\n\n const method = RPC_METHODS[clientMethod];\n\n if (isUnsupported) {\n // If Unsupported we force to try fallback\n return await this.#tryUseFallback(input);\n }\n\n // No method and no fallback allowed\n if (!method && !allowFallback) {\n throw new UnsupportedMethodError(input.method);\n }\n\n try {\n // Method doesnt have a graphql implementation\n if (!method) throw new Error('Missing method');\n\n return await method(this, input.params as never);\n } catch (error) {\n // Method has an allowed fallback or is partially unsupported\n if (allowFallback || error instanceof UnsupportedParamError) {\n return this.#tryUseFallback(input);\n } else {\n throw error;\n }\n }\n };\n\n return this.#options.inspector\n ? this.#options.inspector(input, executeRequest as () => Promise<T>)\n : (executeRequest() as Promise<T>);\n }\n\n async subscribe<T = unknown>(\n input: IotaTransportSubscribeOptions<T>,\n ): Promise<() => Promise<boolean>> {\n if (!this.#fallbackTransport) {\n throw new UnsupportedMethodError(input.method);\n }\n\n return this.#fallbackTransport.subscribe(input);\n }\n\n async #tryUseFallback<T = unknown>(input: IotaTransportRequestOptions): Promise<T> {\n if (!this.#fallbackTransport) {\n throw new UnsupportedMethodError(input.method);\n }\n\n return this.#fallbackTransport.request(input);\n }\n}\n\nfunction handleGraphQLErrors(errors: GraphQLResponseErrors | undefined): void {\n if (!errors || errors.length === 0) return;\n\n const errorInstances = errors.map((error) => new GraphQLResponseError(error));\n\n if (errorInstances.length === 1) {\n throw errorInstances[0];\n }\n\n throw new AggregateError(errorInstances);\n}\n\nclass GraphQLResponseError extends Error {\n locations?: Array<{ line: number; column: number }>;\n\n constructor(error: GraphQLResponseErrors[0]) {\n super(error.message);\n this.locations = error.locations;\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;AAAA;AAWA,SAAS,yBAAyB;AAElC,SAAS,aAAa;AAEtB,
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// Modifications Copyright (c) 2024 IOTA Stiftung\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport type {\n IotaTransport,\n IotaTransportRequestOptions,\n IotaTransportSubscribeOptions,\n RequestInspector,\n} from '@iota/iota-sdk/client';\nimport { IotaHTTPTransport } from '@iota/iota-sdk/client';\nimport type { DocumentNode } from 'graphql';\nimport { print } from 'graphql';\n\nimport {\n SubscribeEventsDocument,\n SubscribeTransactionsDocument,\n TypedDocumentString,\n} from './generated/queries.js';\nimport type {\n SubscribeEventsSubscription,\n SubscribeEventsSubscriptionVariables,\n SubscribeTransactionsSubscription,\n SubscribeTransactionsSubscriptionVariables,\n} from './generated/queries.js';\nimport type { GraphQLWebSocketClientOptions } from './graphql-websocket-client.js';\nimport {\n GraphQLWebSocketClient,\n GraphQLWebSocketConnectionError,\n} from './graphql-websocket-client.js';\nimport { RPC_METHODS, UnsupportedMethodError, UnsupportedParamError } from './methods.js';\nimport {\n mapRpcEventFilterToGraphQL,\n mapRpcTransactionFilterToGraphQL,\n mapSubscriptionEvent,\n mapSubscriptionTransaction,\n} from './mappers/subscription.js';\n\nexport interface IotaClientGraphQLTransportOptions {\n url: string;\n wsUrl?: string;\n wsOptions?: Omit<GraphQLWebSocketClientOptions, 'WebSocketConstructor'>;\n WebSocketConstructor?: typeof WebSocket;\n fallbackTransportUrl?: string;\n fallbackMethods?: (keyof typeof RPC_METHODS)[];\n unsupportedMethods?: (keyof typeof RPC_METHODS)[];\n /** Optional inspector function for monitoring and tracing requests */\n inspector?: RequestInspector;\n}\n\nexport type GraphQLDocument<\n Result = Record<string, unknown>,\n Variables = Record<string, unknown>,\n> =\n | string\n | DocumentNode\n | TypedDocumentNode<Result, Variables>\n | TypedDocumentString<Result, Variables>;\n\nexport type GraphQLQueryOptions<\n Result = Record<string, unknown>,\n Variables = Record<string, unknown>,\n> = {\n query: GraphQLDocument<Result, Variables>;\n operationName?: string;\n extensions?: Record<string, unknown>;\n} & (Variables extends { [key: string]: never }\n ? { variables?: Variables }\n : {\n variables: Variables;\n });\n\nexport type GraphQLQueryResult<Result = Record<string, unknown>> = {\n data?: Result;\n errors?: GraphQLResponseErrors;\n extensions?: Record<string, unknown>;\n};\n\nexport type GraphQLResponseErrors = Array<{\n message: string;\n locations?: { line: number; column: number }[];\n path?: (string | number)[];\n}>;\n\nexport class IotaClientGraphQLTransport implements IotaTransport {\n #options: IotaClientGraphQLTransportOptions;\n #fallbackTransport?: IotaTransport;\n #fallbackMethods: (keyof typeof RPC_METHODS)[];\n #unsupportedMethods: (keyof typeof RPC_METHODS)[];\n #wsClient: GraphQLWebSocketClient | null = null;\n\n constructor(options: IotaClientGraphQLTransportOptions) {\n this.#options = options;\n this.#fallbackMethods = options.fallbackMethods || [\n 'executeTransactionBlock',\n 'dryRunTransactionBlock',\n 'devInspectTransactionBlock',\n 'getTotalTransactions',\n 'getNetworkMetrics',\n 'getParticipationMetrics',\n 'getMoveCallMetrics',\n 'getAllEpochAddressMetrics',\n 'getEpochs',\n 'getDynamicFieldObjectV2',\n ];\n this.#unsupportedMethods = options.unsupportedMethods || ['getOwnedObjects'];\n\n if (options.fallbackTransportUrl) {\n this.#fallbackTransport = new IotaHTTPTransport({\n url: options.fallbackTransportUrl,\n inspector: options.inspector,\n });\n }\n }\n\n #getWebSocketClient(): GraphQLWebSocketClient {\n if (!this.#wsClient) {\n const endpoint = this.#options.wsUrl\n ? this.#options.wsUrl\n : this.#options.url.replace(/\\/?$/, '/subscriptions');\n this.#wsClient = new GraphQLWebSocketClient(endpoint, {\n ...this.#options.wsOptions,\n ...(this.#options.WebSocketConstructor\n ? { WebSocketConstructor: this.#options.WebSocketConstructor }\n : {}),\n });\n }\n return this.#wsClient;\n }\n\n close() {\n this.#wsClient?.close();\n this.#wsClient = null;\n }\n\n async graphqlQuery<\n Result = Record<string, unknown>,\n Variables = Record<string, unknown>,\n Data = Result,\n >(\n options: GraphQLQueryOptions<Result, Variables>,\n getData?: (result: Result) => Data,\n ): Promise<NonNullable<Data>> {\n const res = await this.graphqlRequest(options);\n\n if (!res.ok) {\n throw new Error('Failed to fetch');\n }\n\n const { data, errors } = (await res.json()) as GraphQLQueryResult<Result>;\n\n handleGraphQLErrors(errors);\n\n const extractedData = data && (getData ? getData(data) : data);\n\n if (extractedData == null) {\n throw new Error('Missing response data');\n }\n\n return extractedData as NonNullable<Data>;\n }\n\n async graphqlRequest<Result = Record<string, unknown>, Variables = Record<string, unknown>>(\n options: GraphQLQueryOptions<Result, Variables>,\n ): Promise<Response> {\n return fetch(this.#options.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query:\n typeof options.query === 'string' ||\n options.query instanceof TypedDocumentString\n ? options.query.toString()\n : print(options.query),\n variables: options.variables,\n extensions: options.extensions,\n operationName: options.operationName,\n }),\n });\n }\n\n async request<T = unknown>(input: IotaTransportRequestOptions): Promise<T> {\n const executeRequest = async () => {\n let clientMethod: keyof typeof RPC_METHODS;\n\n switch (input.method) {\n case 'rpc.discover':\n clientMethod = 'getRpcApiVersion';\n break;\n case 'iotax_getLatestAddressMetrics':\n clientMethod = 'getAddressMetrics';\n break;\n default:\n clientMethod = input.method.split('_')[1] as keyof typeof RPC_METHODS;\n }\n\n // Methods with allowed fallback will go through GraphQL first and only default to JSON-RPC if they fail\n const allowFallback = this.#fallbackMethods.includes(clientMethod);\n // Unsupported methods will go through JSON-RPC directly\n const isUnsupported = this.#unsupportedMethods.includes(clientMethod);\n\n const method = RPC_METHODS[clientMethod];\n\n if (isUnsupported) {\n // If Unsupported we force to try fallback\n return await this.#tryUseFallback(input);\n }\n\n // No method and no fallback allowed\n if (!method && !allowFallback) {\n throw new UnsupportedMethodError(input.method);\n }\n\n try {\n // Method doesnt have a graphql implementation\n if (!method) throw new Error('Missing method');\n\n return await method(this, input.params as never);\n } catch (error) {\n // Method has an allowed fallback or is partially unsupported\n if (allowFallback || error instanceof UnsupportedParamError) {\n return this.#tryUseFallback(input);\n } else {\n throw error;\n }\n }\n };\n\n return this.#options.inspector\n ? this.#options.inspector(input, executeRequest as () => Promise<T>)\n : (executeRequest() as Promise<T>);\n }\n\n async subscribe<T = unknown>(\n input: IotaTransportSubscribeOptions<T>,\n ): Promise<() => Promise<boolean>> {\n switch (input.method) {\n case 'iotax_subscribeEvent':\n return this.#subscribeWithFallback(input, () => this.#subscribeEvents(input));\n case 'iotax_subscribeTransaction':\n return this.#subscribeWithFallback(input, () => this.#subscribeTransactions(input));\n default:\n break;\n }\n\n if (!this.#fallbackTransport) {\n throw new UnsupportedMethodError(input.method);\n }\n\n return this.#fallbackTransport.subscribe(input);\n }\n\n async #subscribeWithFallback<T>(\n input: IotaTransportSubscribeOptions<T>,\n subscribe: () => Promise<() => Promise<boolean>>,\n ): Promise<() => Promise<boolean>> {\n try {\n return await subscribe();\n } catch (error) {\n // JSON-RPC serves both an inexpressible filter and an endpoint with no\n // subscriptions endpoint at all.\n const recoverable =\n error instanceof UnsupportedParamError ||\n error instanceof GraphQLWebSocketConnectionError;\n\n if (recoverable && this.#fallbackTransport) {\n return this.#fallbackTransport.subscribe(input);\n }\n\n throw error;\n }\n }\n\n async #subscribeEvents<T>(\n input: IotaTransportSubscribeOptions<T>,\n ): Promise<() => Promise<boolean>> {\n const rpcFilter = input.params[0] as Record<string, unknown> | undefined;\n const filter = rpcFilter ? mapRpcEventFilterToGraphQL(rpcFilter) : undefined;\n\n // Events arrive in transaction order, so a drop can cut one transaction in half.\n // Only a digest change proves the previous transaction was delivered whole.\n let currentDigest = input.startAfter;\n let startAfter = input.startAfter;\n\n const client = this.#getWebSocketClient();\n return client.subscribe<SubscribeEventsSubscription>({\n query: SubscribeEventsDocument.toString(),\n variables: (): SubscribeEventsSubscriptionVariables => ({ filter, startAfter }),\n onMessage: (data) => {\n const payload = data.events;\n if (payload.__typename === 'Lagged') {\n return;\n }\n\n const digest = payload.transactionBlock?.digest ?? undefined;\n if (digest && digest !== currentDigest) {\n startAfter = currentDigest;\n currentDigest = digest;\n }\n\n input.onMessage(mapSubscriptionEvent(payload) as T);\n },\n onError: (errors) => {\n input.onError?.(\n new Error(\n `GraphQL events subscription ended: ${errors.map((e) => e.message).join(', ')}`,\n ),\n );\n },\n signal: input.signal,\n });\n }\n\n async #subscribeTransactions<T>(\n input: IotaTransportSubscribeOptions<T>,\n ): Promise<() => Promise<boolean>> {\n const rpcFilter = input.params[0] as Record<string, unknown> | undefined;\n const filter = rpcFilter ? mapRpcTransactionFilterToGraphQL(rpcFilter) : undefined;\n\n // Each message is one whole transaction.\n let startAfter = input.startAfter;\n\n const client = this.#getWebSocketClient();\n return client.subscribe<SubscribeTransactionsSubscription>({\n query: SubscribeTransactionsDocument.toString(),\n variables: (): SubscribeTransactionsSubscriptionVariables => ({ filter, startAfter }),\n onMessage: (data) => {\n const payload = data.transactions;\n if (payload.__typename === 'Lagged') {\n return;\n }\n const effects = mapSubscriptionTransaction(payload);\n if (!effects) {\n return;\n }\n\n startAfter = effects.transactionDigest;\n input.onMessage(effects as T);\n },\n onError: (errors) => {\n input.onError?.(\n new Error(\n `GraphQL transactions subscription ended: ${errors.map((e) => e.message).join(', ')}`,\n ),\n );\n },\n signal: input.signal,\n });\n }\n\n async #tryUseFallback<T = unknown>(input: IotaTransportRequestOptions): Promise<T> {\n if (!this.#fallbackTransport) {\n throw new UnsupportedMethodError(input.method);\n }\n\n return this.#fallbackTransport.request(input);\n }\n}\n\nfunction handleGraphQLErrors(errors: GraphQLResponseErrors | undefined): void {\n if (!errors || errors.length === 0) return;\n\n const errorInstances = errors.map((error) => new GraphQLResponseError(error));\n\n if (errorInstances.length === 1) {\n throw errorInstances[0];\n }\n\n throw new AggregateError(errorInstances);\n}\n\nclass GraphQLResponseError extends Error {\n locations?: Array<{ line: number; column: number }>;\n\n constructor(error: GraphQLResponseErrors[0]) {\n super(error.message);\n this.locations = error.locations;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|