import {z} from 'zod' export type AgentKey = string; export type Expires = string; export type MerchantKey = string; export type Scope = {merchantKey?: MerchantKey | undefined}; export type Permission = 'acceptors:Activate' | 'acceptors:All' | 'acceptors:Archive' | 'acceptors:Get' | 'acceptors:GetActive' | 'acceptors:GetDraft' | 'acceptors:List' | 'acceptors:Update' | 'agents:Activate' | 'agents:All' | 'agents:CreateBearerToken' | 'agents:Get' | 'agents:GetBin' | 'agents:ListBins' | 'agents:Update' | 'all:All' | 'apiKeys:All' | 'apiKeys:Archive' | 'apiKeys:Create' | 'apiKeys:Disable' | 'apiKeys:Enable' | 'apiKeys:Get' | 'apiKeys:List' | 'apiKeys:Update' | 'bep:All' | 'bep:Create' | 'bep:Get' | 'bep:Update' | 'cardInfo:GetInfo' | 'cardManagement:All' | 'cardManagement:Create' | 'cardManagement:Get' | 'charges:All' | 'charges:Cancel' | 'charges:CancelOrRefund' | 'charges:Clear' | 'charges:Create' | 'charges:CreateAtm' | 'charges:CreateMitFunding' | 'charges:CreatePayout' | 'charges:CreatePos' | 'charges:Get' | 'charges:GetRecords' | 'charges:GetResponses' | 'charges:Increment' | 'charges:List' | 'charges:OfflineRefund' | 'charges:Refund' | 'charges:Reverse' | 'currencyRate:All' | 'currencyRate:GetInfo' | 'disputes:Accept' | 'disputes:AddDocument' | 'disputes:All' | 'disputes:ArchiveDocument' | 'disputes:Defend' | 'disputes:DownloadFile' | 'disputes:Get' | 'disputes:GetDocument' | 'disputes:GetHistory' | 'disputes:List' | 'disputes:ListDocuments' | 'disputes:ListHistory' | 'disputes:RejectEvidence' | 'disputes:SubmitEvidence' | 'disputes:UploadFile' | 'distributions:All' | 'distributions:Archive' | 'distributions:Create' | 'distributions:Distribute' | 'distributions:Get' | 'distributions:List' | 'distributions:Update' | 'documents:All' | 'documents:Archive' | 'documents:Download' | 'documents:Get' | 'documents:Upload' | 'enrollments:All' | 'enrollments:Archive' | 'enrollments:Create' | 'enrollments:Get' | 'enrollments:List' | 'eventSubscriptions:All' | 'eventSubscriptions:Archive' | 'eventSubscriptions:Create' | 'eventSubscriptions:Get' | 'eventSubscriptions:List' | 'eventSubscriptions:Update' | 'fees:Interchange' | 'fees:Scheme' | 'fileSubscription:All' | 'fileSubscription:Create' | 'fileSubscription:Delete' | 'fileSubscription:List' | 'fileSubscription:Update' | 'fraudNotifications:Get' | 'fraudNotifications:List' | 'merchants:All' | 'merchants:Archive' | 'merchants:Create' | 'merchants:CreateAcceptor' | 'merchants:Get' | 'merchants:List' | 'merchants:ListAcceptors' | 'merchants:Update' | 'networkTokens:All' | 'networkTokens:Archive' | 'networkTokens:Create' | 'networkTokens:CreateNetworkTokenCryptogram' | 'networkTokens:Get' | 'networkTokens:GetCardArt' | 'networkTokens:GetNetworkTokenData' | 'networkTokens:List' | 'processorTokens:All' | 'processorTokens:Archive' | 'processorTokens:Create' | 'processorTokens:Get' | 'processorTokens:GetCardData' | 'processorTokens:List' | 'reports:All' | 'reports:Create' | 'reports:CreateCharges' | 'reports:CreateDisputeHistoryEvents' | 'reports:CreateFraudNotifications' | 'reports:CreateNetworkFundsTransfers' | 'reports:CreateReconciliationDetails' | 'reports:CreateSchemeFeeDetails' | 'reports:CreateSchemeFeeDetailsSchedule' | 'reports:DailySettlementTotals' | 'reports:DisputeMonitoring' | 'reports:Download' | 'reports:DownloadAmmfReport' | 'reports:DownloadCharges' | 'reports:DownloadDisputeHistoryEvents' | 'reports:DownloadFraudNotifications' | 'reports:DownloadNetworkFundsTransfers' | 'reports:DownloadQuarterlySchemeReport' | 'reports:DownloadReconciliationDetails' | 'reports:DownloadSchemeFeeDetails' | 'reports:DownloadSettlementDetails' | 'reports:Get' | 'reports:GetCharges' | 'reports:GetDisputeHistoryEvents' | 'reports:GetFraudNotifications' | 'reports:GetNetworkFundsTransfers' | 'reports:GetReconciliationDetails' | 'reports:GetSchemeFeeDetails' | 'reports:GetSchemeFeeDetailsData' | 'reports:List' | 'reports:NetworkFundsTransfers' | 'reports:QuarterlyNetwork' | 'reports:SettlementDetails' | 'reportSchedules:All' | 'reportSchedules:Archive' | 'reportSchedules:Create' | 'reportSchedules:Get' | 'reportSchedules:List' | 'reportSchedules:Update' | 'riskAssessments:Create' | 'screenings:All' | 'screenings:Archive' | 'screenings:Create' | 'screenings:Get' | 'screenings:List' | 'threeDs:Create' | 'threeDs:Get' | 'threeDs:List' | 'trustAnchors:All' | 'trustAnchors:Archive' | 'trustAnchors:Create' | 'trustAnchors:Get' | 'trustAnchors:List'; export type Permissions = Array; export type IpRange = string; export type IpRanges = Array; export type BearerTokenCreate = {expires: Expires, scope?: Scope | undefined, permissions: Permissions, ipRanges?: IpRanges | undefined}; export type CreateApiAgentsAgentKeyBearerTokenArgs = {agentKey: AgentKey, body: BearerTokenCreate}; export type CreateApiAgentsAgentKeyBearerTokenOptions = {baseUrl?: string | undefined, ApiKey?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const bearerTokenKey = z.string(); export const bearerToken = z.object({key: bearerTokenKey, token: z.string()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Create Bearer Token * * POST /agents/{agentKey}/bearerToken * * Also accepts auth: BearerToken */ export const createApiAgentsAgentKeyBearerToken = async (args: CreateApiAgentsAgentKeyBearerTokenArgs, options?: CreateApiAgentsAgentKeyBearerTokenOptions) => { const {baseUrl = "https://eu-west-1.api.silverflow.com/v1", fetch: fetchFn = fetch, ApiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (ApiKey !== undefined) headers.set('authorization', `Basic ${btoa(`${ApiKey.username}:${ApiKey.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/agents/${encodeURIComponent(String(args.agentKey))}/bearerToken${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(bearerToken, await res.json()) };