UNPKG

@mysten/sui

Version:
1 lines 15.4 kB
{"version":3,"file":"client.mjs","names":["#url","#queries","#headers","#fetch"],"sources":["../../src/graphql/client.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport type { TadaDocumentNode } from 'gql.tada';\nimport type { DocumentNode } from 'graphql';\nimport { print } from 'graphql';\nimport { BaseClient } from '../client/index.js';\nimport type { SuiClientTypes } from '../client/index.js';\nimport { GraphQLCoreClient } from './core.js';\nimport type { TypedDocumentString } from './generated/queries.js';\nimport { GetDynamicFieldsDocument } from './generated/queries.js';\nimport { fromBase64 } from '@mysten/utils';\nimport { normalizeStructTag } from '../utils/sui-types.js';\nimport { deriveDynamicFieldID } from '../utils/dynamic-fields.js';\nimport type { TransactionPlugin } from '../transactions/index.js';\n\nexport type GraphQLDocument<\n\tResult = Record<string, unknown>,\n\tVariables = Record<string, unknown>,\n> =\n\t| string\n\t| DocumentNode\n\t| TypedDocumentString<Result, Variables>\n\t| TypedDocumentNode<Result, Variables>\n\t| TadaDocumentNode<Result, Variables>;\n\nexport type GraphQLQueryOptions<\n\tResult = Record<string, unknown>,\n\tVariables = Record<string, unknown>,\n> = {\n\tquery: GraphQLDocument<Result, Variables>;\n\toperationName?: string;\n\textensions?: Record<string, unknown>;\n\tsignal?: AbortSignal;\n} & (Variables extends { [key: string]: never }\n\t? { variables?: Variables }\n\t: {\n\t\t\tvariables: Variables;\n\t\t});\n\nexport type GraphQLQueryResult<Result = Record<string, unknown>> = {\n\tdata?: Result;\n\terrors?: GraphQLResponseErrors;\n\textensions?: Record<string, unknown>;\n};\n\nexport type GraphQLResponseErrors = Array<{\n\tmessage: string;\n\tlocations?: { line: number; column: number }[];\n\tpath?: (string | number)[];\n}>;\n\nexport interface SuiGraphQLClientOptions<Queries extends Record<string, GraphQLDocument>> {\n\turl: string;\n\tfetch?: typeof fetch;\n\theaders?: Record<string, string>;\n\tqueries?: Queries;\n\tnetwork: SuiClientTypes.Network;\n\tmvr?: SuiClientTypes.MvrOptions;\n}\n\nexport class SuiGraphQLRequestError extends Error {}\n\nconst SUI_CLIENT_BRAND = Symbol.for('@mysten/SuiGraphQLClient') as never;\n\nexport function isSuiGraphQLClient(client: unknown): client is SuiGraphQLClient {\n\treturn (\n\t\ttypeof client === 'object' && client !== null && (client as any)[SUI_CLIENT_BRAND] === true\n\t);\n}\n\nexport interface DynamicFieldInclude {\n\tvalue?: boolean;\n}\n\nexport type DynamicFieldEntryWithValue<Include extends DynamicFieldInclude = {}> =\n\tSuiClientTypes.DynamicFieldEntry & {\n\t\tvalue: Include extends { value: true } ? SuiClientTypes.DynamicFieldValue : undefined;\n\t};\n\nexport interface ListDynamicFieldsWithValueResponse<Include extends DynamicFieldInclude = {}> {\n\thasNextPage: boolean;\n\tcursor: string | null;\n\tdynamicFields: DynamicFieldEntryWithValue<Include>[];\n}\n\nexport class SuiGraphQLClient<Queries extends Record<string, GraphQLDocument> = {}>\n\textends BaseClient\n\timplements SuiClientTypes.TransportMethods\n{\n\t#url: string;\n\t#queries: Queries;\n\t#headers: Record<string, string>;\n\t#fetch: typeof fetch;\n\tcore: GraphQLCoreClient;\n\tget mvr(): SuiClientTypes.MvrMethods {\n\t\treturn this.core.mvr;\n\t}\n\n\tget [SUI_CLIENT_BRAND]() {\n\t\treturn true;\n\t}\n\n\tconstructor({\n\t\turl,\n\t\tfetch: fetchFn = fetch,\n\t\theaders = {},\n\t\tqueries = {} as Queries,\n\t\tnetwork,\n\t\tmvr,\n\t}: SuiGraphQLClientOptions<Queries>) {\n\t\tsuper({\n\t\t\tnetwork,\n\t\t});\n\t\tthis.#url = url;\n\t\tthis.#queries = queries;\n\t\tthis.#headers = headers;\n\t\tthis.#fetch = (...args) => fetchFn(...args);\n\t\tthis.core = new GraphQLCoreClient({\n\t\t\tgraphqlClient: this,\n\t\t\tmvr,\n\t\t});\n\t}\n\n\tasync query<Result = Record<string, unknown>, Variables = Record<string, unknown>>(\n\t\toptions: GraphQLQueryOptions<Result, Variables>,\n\t): Promise<GraphQLQueryResult<Result>> {\n\t\tconst res = await this.#fetch(this.#url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t...this.#headers,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tquery:\n\t\t\t\t\ttypeof options.query === 'string' || options.query instanceof String\n\t\t\t\t\t\t? String(options.query)\n\t\t\t\t\t\t: print(options.query),\n\t\t\t\tvariables: options.variables,\n\t\t\t\textensions: options.extensions,\n\t\t\t\toperationName: options.operationName,\n\t\t\t}),\n\t\t\tsignal: options.signal,\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tthrow new SuiGraphQLRequestError(`GraphQL request failed: ${res.statusText} (${res.status})`);\n\t\t}\n\n\t\treturn await res.json();\n\t}\n\n\tasync execute<\n\t\tconst Query extends Extract<keyof Queries, string>,\n\t\tResult = Queries[Query] extends GraphQLDocument<infer R, unknown> ? R : Record<string, unknown>,\n\t\tVariables = Queries[Query] extends GraphQLDocument<unknown, infer V>\n\t\t\t? V\n\t\t\t: Record<string, unknown>,\n\t>(\n\t\tquery: Query,\n\t\toptions: Omit<GraphQLQueryOptions<Result, Variables>, 'query'>,\n\t): Promise<GraphQLQueryResult<Result>> {\n\t\treturn this.query({\n\t\t\t...(options as { variables: Record<string, unknown> }),\n\t\t\tquery: this.#queries[query]!,\n\t\t}) as Promise<GraphQLQueryResult<Result>>;\n\t}\n\n\tgetObjects<Include extends SuiClientTypes.ObjectInclude = {}>(\n\t\tinput: SuiClientTypes.GetObjectsOptions<Include>,\n\t): Promise<SuiClientTypes.GetObjectsResponse<Include>> {\n\t\treturn this.core.getObjects(input);\n\t}\n\n\tgetObject<Include extends SuiClientTypes.ObjectInclude = {}>(\n\t\tinput: SuiClientTypes.GetObjectOptions<Include>,\n\t): Promise<SuiClientTypes.GetObjectResponse<Include>> {\n\t\treturn this.core.getObject(input);\n\t}\n\n\tlistCoins(input: SuiClientTypes.ListCoinsOptions): Promise<SuiClientTypes.ListCoinsResponse> {\n\t\treturn this.core.listCoins(input);\n\t}\n\n\tlistOwnedObjects<Include extends SuiClientTypes.ObjectInclude = {}>(\n\t\tinput: SuiClientTypes.ListOwnedObjectsOptions<Include>,\n\t): Promise<SuiClientTypes.ListOwnedObjectsResponse<Include>> {\n\t\treturn this.core.listOwnedObjects(input);\n\t}\n\n\tgetBalance(input: SuiClientTypes.GetBalanceOptions): Promise<SuiClientTypes.GetBalanceResponse> {\n\t\treturn this.core.getBalance(input);\n\t}\n\n\tlistBalances(\n\t\tinput: SuiClientTypes.ListBalancesOptions,\n\t): Promise<SuiClientTypes.ListBalancesResponse> {\n\t\treturn this.core.listBalances(input);\n\t}\n\n\tgetCoinMetadata(\n\t\tinput: SuiClientTypes.GetCoinMetadataOptions,\n\t): Promise<SuiClientTypes.GetCoinMetadataResponse> {\n\t\treturn this.core.getCoinMetadata(input);\n\t}\n\n\tgetTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(\n\t\tinput: SuiClientTypes.GetTransactionOptions<Include>,\n\t): Promise<SuiClientTypes.TransactionResult<Include>> {\n\t\treturn this.core.getTransaction(input);\n\t}\n\n\texecuteTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(\n\t\tinput: SuiClientTypes.ExecuteTransactionOptions<Include>,\n\t): Promise<SuiClientTypes.TransactionResult<Include>> {\n\t\treturn this.core.executeTransaction(input);\n\t}\n\n\tsignAndExecuteTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(\n\t\tinput: SuiClientTypes.SignAndExecuteTransactionOptions<Include>,\n\t): Promise<SuiClientTypes.TransactionResult<Include>> {\n\t\treturn this.core.signAndExecuteTransaction(input);\n\t}\n\n\twaitForTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(\n\t\tinput: SuiClientTypes.WaitForTransactionOptions<Include>,\n\t): Promise<SuiClientTypes.TransactionResult<Include>> {\n\t\treturn this.core.waitForTransaction(input);\n\t}\n\n\tsimulateTransaction<Include extends SuiClientTypes.SimulateTransactionInclude = {}>(\n\t\tinput: SuiClientTypes.SimulateTransactionOptions<Include>,\n\t): Promise<SuiClientTypes.SimulateTransactionResult<Include>> {\n\t\treturn this.core.simulateTransaction(input);\n\t}\n\n\tgetReferenceGasPrice(): Promise<SuiClientTypes.GetReferenceGasPriceResponse> {\n\t\treturn this.core.getReferenceGasPrice();\n\t}\n\n\tasync listDynamicFields<Include extends DynamicFieldInclude = {}>(\n\t\tinput: SuiClientTypes.ListDynamicFieldsOptions & { include?: Include & DynamicFieldInclude },\n\t): Promise<ListDynamicFieldsWithValueResponse<Include>> {\n\t\tconst includeValue = input.include?.value ?? false;\n\n\t\tconst { data, errors } = await this.query({\n\t\t\tquery: GetDynamicFieldsDocument,\n\t\t\tvariables: {\n\t\t\t\tparentId: input.parentId,\n\t\t\t\tfirst: input.limit,\n\t\t\t\tcursor: input.cursor,\n\t\t\t\tincludeValue,\n\t\t\t},\n\t\t});\n\n\t\tif (errors?.length) {\n\t\t\tthrow errors.length === 1\n\t\t\t\t? new Error(errors[0].message)\n\t\t\t\t: new AggregateError(errors.map((e) => new Error(e.message)));\n\t\t}\n\n\t\tconst result = data?.address?.dynamicFields;\n\t\tif (!result) {\n\t\t\tthrow new Error('Missing response data');\n\t\t}\n\n\t\treturn {\n\t\t\tdynamicFields: result.nodes.map((dynamicField): DynamicFieldEntryWithValue<Include> => {\n\t\t\t\tconst valueType =\n\t\t\t\t\tdynamicField.value?.__typename === 'MoveObject'\n\t\t\t\t\t\t? dynamicField.value.contents?.type?.repr!\n\t\t\t\t\t\t: dynamicField.value?.type?.repr!;\n\t\t\t\tconst isDynamicObject = dynamicField.value?.__typename === 'MoveObject';\n\t\t\t\tconst derivedNameType = isDynamicObject\n\t\t\t\t\t? `0x2::dynamic_object_field::Wrapper<${dynamicField.name?.type?.repr}>`\n\t\t\t\t\t: dynamicField.name?.type?.repr!;\n\n\t\t\t\tlet value: SuiClientTypes.DynamicFieldValue | undefined;\n\t\t\t\tif (includeValue) {\n\t\t\t\t\tlet valueBcs: Uint8Array;\n\t\t\t\t\tif (dynamicField.value?.__typename === 'MoveValue') {\n\t\t\t\t\t\tvalueBcs = fromBase64(dynamicField.value.bcs ?? '');\n\t\t\t\t\t} else if (dynamicField.value?.__typename === 'MoveObject') {\n\t\t\t\t\t\tvalueBcs = fromBase64(dynamicField.value.contents?.bcs ?? '');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueBcs = new Uint8Array();\n\t\t\t\t\t}\n\t\t\t\t\tvalue = { type: valueType, bcs: valueBcs };\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t$kind: isDynamicObject ? 'DynamicObject' : 'DynamicField',\n\t\t\t\t\tfieldId: deriveDynamicFieldID(\n\t\t\t\t\t\tinput.parentId,\n\t\t\t\t\t\tderivedNameType,\n\t\t\t\t\t\tfromBase64(dynamicField.name?.bcs!),\n\t\t\t\t\t),\n\t\t\t\t\ttype: normalizeStructTag(\n\t\t\t\t\t\tisDynamicObject\n\t\t\t\t\t\t\t? `0x2::dynamic_field::Field<0x2::dynamic_object_field::Wrapper<${dynamicField.name?.type?.repr}>,0x2::object::ID>`\n\t\t\t\t\t\t\t: `0x2::dynamic_field::Field<${dynamicField.name?.type?.repr},${valueType}>`,\n\t\t\t\t\t),\n\t\t\t\t\tname: {\n\t\t\t\t\t\ttype: dynamicField.name?.type?.repr!,\n\t\t\t\t\t\tbcs: fromBase64(dynamicField.name?.bcs!),\n\t\t\t\t\t},\n\t\t\t\t\tvalueType,\n\t\t\t\t\tchildId:\n\t\t\t\t\t\tisDynamicObject && dynamicField.value?.__typename === 'MoveObject'\n\t\t\t\t\t\t\t? dynamicField.value.address\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tvalue: (includeValue ? value : undefined) as DynamicFieldEntryWithValue<Include>['value'],\n\t\t\t\t} as DynamicFieldEntryWithValue<Include>;\n\t\t\t}),\n\t\t\tcursor: result.pageInfo.endCursor ?? null,\n\t\t\thasNextPage: result.pageInfo.hasNextPage,\n\t\t};\n\t}\n\n\tgetDynamicField(\n\t\tinput: SuiClientTypes.GetDynamicFieldOptions,\n\t): Promise<SuiClientTypes.GetDynamicFieldResponse> {\n\t\treturn this.core.getDynamicField(input);\n\t}\n\n\tgetMoveFunction(\n\t\tinput: SuiClientTypes.GetMoveFunctionOptions,\n\t): Promise<SuiClientTypes.GetMoveFunctionResponse> {\n\t\treturn this.core.getMoveFunction(input);\n\t}\n\n\tresolveTransactionPlugin(): TransactionPlugin {\n\t\treturn this.core.resolveTransactionPlugin();\n\t}\n\n\tverifyZkLoginSignature(\n\t\tinput: SuiClientTypes.VerifyZkLoginSignatureOptions,\n\t): Promise<SuiClientTypes.ZkLoginVerifyResponse> {\n\t\treturn this.core.verifyZkLoginSignature(input);\n\t}\n\n\tdefaultNameServiceName(\n\t\tinput: SuiClientTypes.DefaultNameServiceNameOptions,\n\t): Promise<SuiClientTypes.DefaultNameServiceNameResponse> {\n\t\treturn this.core.defaultNameServiceName(input);\n\t}\n}\n"],"mappings":"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"}