> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zabcik.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Rozšiřitelnost

> Vlastní HTTP transport a cache tokenů pro pokročilá nasazení.

# Rozšiřitelnost

<Info>
  Většině integrací stačí výchozí `createGoPayClient`. Vlastní **`HttpTransport`** / **`TokenCache`** použijte pro **observabilitu**, **proxy**, **sdílené úložiště tokenů** nebo HTTP klienta **jiného než fetch**.
</Info>

`gopay-sdk` je rozšiřitelné přes dvě abstrakce:

* `HttpTransport`: jak se provádí HTTP požadavek
* `TokenCache`: kde se ukládají OAuth tokeny

## Vlastní HTTP transport

Implementujte `HttpTransport` pro vlastní chování (logování, retry, tracing, proxy, …).

Typy transportu importujte z hlavního balíčku nebo z [`gopay-sdk/http`](/cs/api-reference/subpath-imports).

```ts theme={null}
import type { HttpTransport, HttpTransportRequest } from 'gopay-sdk';

class ObservabilityTransport implements HttpTransport {
  async execute(request: HttpTransportRequest): Promise<Response> {
    const startedAt = Date.now();

    try {
      const response = await fetch(request.url, {
        method: request.method,
        headers: request.headers,
        body: request.body,
      });

      console.log('gopay_request', {
        method: request.method,
        url: request.url,
        status: response.status,
        durationMs: Date.now() - startedAt,
      });

      return response;
    } catch (error) {
      console.error('gopay_request_failed', {
        method: request.method,
        url: request.url,
        durationMs: Date.now() - startedAt,
        error,
      });
      throw error;
    }
  }
}
```

Použití při vytvoření klienta:

```ts theme={null}
import { createGoPayClient } from 'gopay-sdk';

const client = createGoPayClient(
  {
    goid: 8123456789,
    clientId: process.env.GOPAY_CLIENT_ID!,
    clientSecret: process.env.GOPAY_CLIENT_SECRET!,
    gatewayUrl: 'https://gw.sandbox.gopay.com/api',
  },
  {
    transport: new ObservabilityTransport(),
  },
);
```

## Vlastní cache tokenů

Implementujte `TokenCache` pro Redis, Memcached, databázi nebo distribuovanou paměť.

```ts theme={null}
import type { OAuthToken, TokenCache } from 'gopay-sdk';

class MemoryTokenCache implements TokenCache {
  private readonly tokens = new Map<string, OAuthToken>();

  get(key: string): OAuthToken | undefined {
    return this.tokens.get(key);
  }

  set(key: string, value: OAuthToken): void {
    this.tokens.set(key, value);
  }

  delete(key: string): void {
    this.tokens.delete(key);
  }
}
```

```ts theme={null}
import { createGoPayClient } from 'gopay-sdk';

const client = createGoPayClient(
  {
    goid: 8123456789,
    clientId: process.env.GOPAY_CLIENT_ID!,
    clientSecret: process.env.GOPAY_CLIENT_SECRET!,
    gatewayUrl: 'https://gw.sandbox.gopay.com/api',
  },
  {
    tokenCache: new MemoryTokenCache(),
  },
);
```

## Doporučení

* Retry v transportu držte konzervativní (např. jen síťové timeouty).
* Neopakujte slepě neidempotentní vytváření plateb.
* Korelační ID a observabilita centrálně v transportu.
* Sdílenou cache používejte při více instancích se stejnými přihlašovacími údaji.
* Klíč cache držte v souladu s `clientId + gatewayUrl + scope`.
