PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@iota/iota-sdk/src/graphql

Просмотр файла: client.ts

// Copyright (c) Mysten Labs, Inc.
// Modifications Copyright (c) 2024 IOTA Stiftung
// SPDX-License-Identifier: Apache-2.0

import type { TypedDocumentNode } from '@graphql-typed-document-node/core';
import type { TadaDocumentNode } from 'gql.tada';
import type { DocumentNode } from 'graphql';
import { print } from 'graphql';

export type GraphQLDocument<
    Result = Record<string, unknown>,
    Variables = Record<string, unknown>,
> =
    | string
    | DocumentNode
    | TypedDocumentNode<Result, Variables>
    | TadaDocumentNode<Result, Variables>;

export type GraphQLQueryOptions<
    Result = Record<string, unknown>,
    Variables = Record<string, unknown>,
> = {
    query: GraphQLDocument<Result, Variables>;
    operationName?: string;
    extensions?: Record<string, unknown>;
} & (Variables extends { [key: string]: never }
    ? { variables?: Variables }
    : {
          variables: Variables;
      });

export type GraphQLQueryResult<Result = Record<string, unknown>> = {
    data?: Result;
    errors?: GraphQLResponseErrors;
    extensions?: Record<string, unknown>;
};

export type GraphQLResponseErrors = Array<{
    message: string;
    locations?: { line: number; column: number }[];
    path?: (string | number)[];
}>;

export interface IotaGraphQLClientOptions<Queries extends Record<string, GraphQLDocument>> {
    url: string;
    fetch?: typeof fetch;
    headers?: Record<string, string>;
    queries?: Queries;
}

export class IotaGraphQLRequestError extends Error {}

// eslint-disable-next-line @typescript-eslint/ban-types
export class IotaGraphQLClient<Queries extends Record<string, GraphQLDocument> = {}> {
    #url: string;
    #queries: Queries;
    #headers: Record<string, string>;
    #fetch: typeof fetch;

    constructor({
        url,
        fetch: fetchFn = fetch,
        headers = {},
        queries = {} as Queries,
    }: IotaGraphQLClientOptions<Queries>) {
        this.#url = url;
        this.#queries = queries;
        this.#headers = headers;
        this.#fetch = (...args) => fetchFn(...args);
    }

    async query<Result = Record<string, unknown>, Variables = Record<string, unknown>>(
        options: GraphQLQueryOptions<Result, Variables>,
    ): Promise<GraphQLQueryResult<Result>> {
        const res = await this.#fetch(this.#url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                ...this.#headers,
            },
            body: JSON.stringify({
                query:
                    typeof options.query === 'string'
                        ? String(options.query)
                        : print(options.query),
                variables: options.variables,
                extensions: options.extensions,
                operationName: options.operationName,
            }),
        });

        if (!res.ok) {
            throw new IotaGraphQLRequestError(
                `GraphQL request failed: ${res.statusText} (${res.status})`,
            );
        }

        return await res.json();
    }

    async execute<
        const Query extends Extract<keyof Queries, string>,
        Result = Queries[Query] extends GraphQLDocument<infer R, unknown>
            ? R
            : Record<string, unknown>,
        Variables = Queries[Query] extends GraphQLDocument<unknown, infer V>
            ? V
            : Record<string, unknown>,
    >(
        query: Query,
        options: Omit<GraphQLQueryOptions<Result, Variables>, 'query'>,
    ): Promise<GraphQLQueryResult<Result>> {
        return this.query({
            ...(options as { variables: Record<string, unknown> }),
            query: this.#queries[query]!,
        }) as Promise<GraphQLQueryResult<Result>>;
    }
}

Выполнить команду


Для локальной разработки. Не используйте в интернете!