[{"data":1,"prerenderedAt":628},["ShallowReactive",2],{"page:\u002Fextensions\u002Fkubb-labs\u002Fplugin-fetch\u002Fguides\u002Ftransport":3},{"id":4,"title":5,"body":6,"description":609,"extension":617,"frontmatter":618,"heading":5,"meta":619,"navigation":620,"order":621,"path":622,"seo":623,"sitemap":624,"source":4,"stem":625,"__hash__":626,"hasPopups":627},"extensions\u002Fextensions\u002Fkubb-labs\u002Fplugin-fetch\u002Fguides\u002Ftransport.md","Use a custom transport",{"type":7,"value":8,"toc":608},"minimark",[9,13,16,21,28,295,313,317,320,512,515,519,534,538,549],[10,11,12],"p",{},"Set a transport at runtime to replace the network send. The client still builds URLs, serializes parameters, resolves authentication, and handles results.",[10,14,15],{},"The transport is a function. Use interceptors for request headers or response logging.",[17,18,20],"h2",{"id":19},"write-a-transport-function","Write a transport function",[10,22,23,27],{},[24,25,26],"code",{},"@kubb\u002Fplugin-fetch"," types the transport as a function that receives a fully resolved request and returns a result:",[29,30,34],"pre",{"language":31,"code":32,"class":33},"typescript","type Transport = (request: ResolvedRequest) => Promise\u003CTransportResult>\n\ntype ResolvedRequest = {\n  url: string\n  method: string\n  headers: Record\u003Cstring, string>\n  body?: RequestBody\n  signal?: AbortSignal\n  credentials?: RequestCredentials\n  options?: FetchOptions\n  responseType?: ResponseType\n}\n\ntype TransportResult\u003CTData = unknown> = {\n  data: TData\n  status: number\n  statusText: string\n  headers: Headers\n  contentType?: string\n  request: Request\n  response: Response\n}","shiki shiki-themes github-light github-dark dark:github-dark",[24,35,37,85,86,85,88,85,99,85,110,85,119,85,141,85,152,85,162,85,172,85,182,85,192,85,197,85,199,85,224,85,234,85,244,85,253,85,262,85,271,85,281,85,291],{"class":36},"language-typescript",[38,39,42,46,50,53,57,61,64,67,70,73,76,79,82],"span",{"class":40,"style":41},"line","display: inline",[38,43,45],{"style":44},"color:#D73A49;--shiki-dark:#F97583","type",[38,47,49],{"style":48},"color:#6F42C1;--shiki-dark:#B392F0"," Transport",[38,51,52],{"style":44}," =",[38,54,56],{"style":55},"color:#24292E;--shiki-dark:#E1E4E8"," (",[38,58,60],{"style":59},"color:#E36209;--shiki-dark:#FFAB70","request",[38,62,63],{"style":44},":",[38,65,66],{"style":48}," ResolvedRequest",[38,68,69],{"style":55},") ",[38,71,72],{"style":44},"=>",[38,74,75],{"style":48}," Promise",[38,77,78],{"style":55},"\u003C",[38,80,81],{"style":48},"TransportResult",[38,83,84],{"style":55},">","\n",[38,87],{"class":40,"style":41},[38,89,90,92,94,96],{"class":40,"style":41},[38,91,45],{"style":44},[38,93,66],{"style":48},[38,95,52],{"style":44},[38,97,98],{"style":55}," {",[38,100,101,104,106],{"class":40,"style":41},[38,102,103],{"style":59},"  url",[38,105,63],{"style":44},[38,107,109],{"style":108},"color:#005CC5;--shiki-dark:#79B8FF"," string",[38,111,112,115,117],{"class":40,"style":41},[38,113,114],{"style":59},"  method",[38,116,63],{"style":44},[38,118,109],{"style":108},[38,120,121,124,126,129,131,134,137,139],{"class":40,"style":41},[38,122,123],{"style":59},"  headers",[38,125,63],{"style":44},[38,127,128],{"style":48}," Record",[38,130,78],{"style":55},[38,132,133],{"style":108},"string",[38,135,136],{"style":55},", ",[38,138,133],{"style":108},[38,140,84],{"style":55},[38,142,143,146,149],{"class":40,"style":41},[38,144,145],{"style":59},"  body",[38,147,148],{"style":44},"?:",[38,150,151],{"style":48}," RequestBody",[38,153,154,157,159],{"class":40,"style":41},[38,155,156],{"style":59},"  signal",[38,158,148],{"style":44},[38,160,161],{"style":48}," AbortSignal",[38,163,164,167,169],{"class":40,"style":41},[38,165,166],{"style":59},"  credentials",[38,168,148],{"style":44},[38,170,171],{"style":48}," RequestCredentials",[38,173,174,177,179],{"class":40,"style":41},[38,175,176],{"style":59},"  options",[38,178,148],{"style":44},[38,180,181],{"style":48}," FetchOptions",[38,183,184,187,189],{"class":40,"style":41},[38,185,186],{"style":59},"  responseType",[38,188,148],{"style":44},[38,190,191],{"style":48}," ResponseType",[38,193,194],{"class":40,"style":41},[38,195,196],{"style":55},"}",[38,198],{"class":40,"style":41},[38,200,201,203,206,208,211,213,216,219,222],{"class":40,"style":41},[38,202,45],{"style":44},[38,204,205],{"style":48}," TransportResult",[38,207,78],{"style":55},[38,209,210],{"style":48},"TData",[38,212,52],{"style":44},[38,214,215],{"style":108}," unknown",[38,217,218],{"style":55},"> ",[38,220,221],{"style":44},"=",[38,223,98],{"style":55},[38,225,226,229,231],{"class":40,"style":41},[38,227,228],{"style":59},"  data",[38,230,63],{"style":44},[38,232,233],{"style":48}," TData",[38,235,236,239,241],{"class":40,"style":41},[38,237,238],{"style":59},"  status",[38,240,63],{"style":44},[38,242,243],{"style":108}," number",[38,245,246,249,251],{"class":40,"style":41},[38,247,248],{"style":59},"  statusText",[38,250,63],{"style":44},[38,252,109],{"style":108},[38,254,255,257,259],{"class":40,"style":41},[38,256,123],{"style":59},[38,258,63],{"style":44},[38,260,261],{"style":48}," Headers",[38,263,264,267,269],{"class":40,"style":41},[38,265,266],{"style":59},"  contentType",[38,268,148],{"style":44},[38,270,109],{"style":108},[38,272,273,276,278],{"class":40,"style":41},[38,274,275],{"style":59},"  request",[38,277,63],{"style":44},[38,279,280],{"style":48}," Request",[38,282,283,286,288],{"class":40,"style":41},[38,284,285],{"style":59},"  response",[38,287,63],{"style":44},[38,289,290],{"style":48}," Response",[38,292,293],{"class":40,"style":41},[38,294,196],{"style":55},[10,296,297,298,301,302,305,306,308,309,312],{},"The core hands you a ",[24,299,300],{},"ResolvedRequest"," with the URL built, the query and body serialized, and auth headers set. Return the parsed ",[24,303,304],{},"data"," along with the native ",[24,307,60],{}," and ",[24,310,311],{},"response",", so status, headers, and the raw body stay reachable on the result.",[17,314,316],{"id":315},"mock-the-network-in-tests","Mock the network in tests",[10,318,319],{},"Return a fixed result from an isolated client in tests:",[29,321,323],{"language":31,"code":322,"class":33},"import { createClient } from '.\u002Fgen\u002F.kubb\u002Fclient'\nimport { getPetById } from '.\u002Fgen\u002Fclients\u002FgetPetById'\n\nconst testClient = createClient({\n  transport: async (request) => ({\n    data: { id: 1, name: 'Fluffy' },\n    status: 200,\n    statusText: 'OK',\n    headers: new Headers(),\n    request: new Request(request.url),\n    response: new Response(),\n  }),\n})\n\nconst { data } = await getPetById({ path: { petId: 1 }, client: testClient })\n\u002F\u002F      ^ { id: 1, name: 'Fluffy' }",[24,324,325,85,340,85,352,85,354,85,370,85,392,85,409,85,420,85,430,85,443,85,455,85,466,85,471,85,476,85,478,85,506],{"class":36},[38,326,327,330,333,336],{"class":40,"style":41},[38,328,329],{"style":44},"import",[38,331,332],{"style":55}," { createClient } ",[38,334,335],{"style":44},"from",[38,337,339],{"style":338},"color:#032F62;--shiki-dark:#9ECBFF"," '.\u002Fgen\u002F.kubb\u002Fclient'",[38,341,342,344,347,349],{"class":40,"style":41},[38,343,329],{"style":44},[38,345,346],{"style":55}," { getPetById } ",[38,348,335],{"style":44},[38,350,351],{"style":338}," '.\u002Fgen\u002Fclients\u002FgetPetById'",[38,353],{"class":40,"style":41},[38,355,356,359,362,364,367],{"class":40,"style":41},[38,357,358],{"style":44},"const",[38,360,361],{"style":108}," testClient",[38,363,52],{"style":44},[38,365,366],{"style":48}," createClient",[38,368,369],{"style":55},"({",[38,371,372,375,378,381,383,385,387,389],{"class":40,"style":41},[38,373,374],{"style":48},"  transport",[38,376,377],{"style":55},": ",[38,379,380],{"style":44},"async",[38,382,56],{"style":55},[38,384,60],{"style":59},[38,386,69],{"style":55},[38,388,72],{"style":44},[38,390,391],{"style":55}," ({",[38,393,394,397,400,403,406],{"class":40,"style":41},[38,395,396],{"style":55},"    data: { id: ",[38,398,399],{"style":108},"1",[38,401,402],{"style":55},", name: ",[38,404,405],{"style":338},"'Fluffy'",[38,407,408],{"style":55}," },",[38,410,411,414,417],{"class":40,"style":41},[38,412,413],{"style":55},"    status: ",[38,415,416],{"style":108},"200",[38,418,419],{"style":55},",",[38,421,422,425,428],{"class":40,"style":41},[38,423,424],{"style":55},"    statusText: ",[38,426,427],{"style":338},"'OK'",[38,429,419],{"style":55},[38,431,432,435,438,440],{"class":40,"style":41},[38,433,434],{"style":55},"    headers: ",[38,436,437],{"style":44},"new",[38,439,261],{"style":48},[38,441,442],{"style":55},"(),",[38,444,445,448,450,452],{"class":40,"style":41},[38,446,447],{"style":55},"    request: ",[38,449,437],{"style":44},[38,451,280],{"style":48},[38,453,454],{"style":55},"(request.url),",[38,456,457,460,462,464],{"class":40,"style":41},[38,458,459],{"style":55},"    response: ",[38,461,437],{"style":44},[38,463,290],{"style":48},[38,465,442],{"style":55},[38,467,468],{"class":40,"style":41},[38,469,470],{"style":55},"  }),",[38,472,473],{"class":40,"style":41},[38,474,475],{"style":55},"})",[38,477],{"class":40,"style":41},[38,479,480,482,485,487,490,492,495,498,501,503],{"class":40,"style":41},[38,481,358],{"style":44},[38,483,484],{"style":55}," { ",[38,486,304],{"style":108},[38,488,489],{"style":55}," } ",[38,491,221],{"style":44},[38,493,494],{"style":44}," await",[38,496,497],{"style":48}," getPetById",[38,499,500],{"style":55},"({ path: { petId: ",[38,502,399],{"style":108},[38,504,505],{"style":55}," }, client: testClient })",[38,507,508],{"class":40,"style":41},[38,509,511],{"style":510},"color:#6A737D;--shiki-dark:#6A737D","\u002F\u002F      ^ { id: 1, name: 'Fluffy' }",[10,513,514],{},"Pass the isolated client per operation or to a query plugin.",[17,516,518],{"id":517},"where-to-set-it","Where to set it",[10,520,521,522,525,526,529,530,533],{},"Use ",[24,523,524],{},"client.setConfig({ transport })"," for shared configuration, ",[24,527,528],{},"createClient({ transport })"," for an isolated instance, or pass ",[24,531,532],{},"transport"," on an operation to override it for one call.",[17,535,537],{"id":536},"wrap-the-default-transport","Wrap the default transport",[10,539,540,541,544,545,548],{},"The generated client exports ",[24,542,543],{},"defaultTransport",", the ",[24,546,547],{},"fetch","-based send it uses when no transport is set. Wrap it to add tracing, timing, or headers and keep the built-in request and response handling:",[29,550,552],{"language":31,"code":551,"class":33},"import { client, defaultTransport } from '.\u002Fgen\u002F.kubb\u002Fclient'\n\nclient.setConfig({\n  transport: (request) => withSpan(request, () => defaultTransport(request)),\n})",[24,553,554,85,565,85,567,85,577,85,604],{"class":36},[38,555,556,558,561,563],{"class":40,"style":41},[38,557,329],{"style":44},[38,559,560],{"style":55}," { client, defaultTransport } ",[38,562,335],{"style":44},[38,564,339],{"style":338},[38,566],{"class":40,"style":41},[38,568,569,572,575],{"class":40,"style":41},[38,570,571],{"style":55},"client.",[38,573,574],{"style":48},"setConfig",[38,576,369],{"style":55},[38,578,579,581,584,586,588,590,593,596,598,601],{"class":40,"style":41},[38,580,374],{"style":48},[38,582,583],{"style":55},": (",[38,585,60],{"style":59},[38,587,69],{"style":55},[38,589,72],{"style":44},[38,591,592],{"style":48}," withSpan",[38,594,595],{"style":55},"(request, () ",[38,597,72],{"style":44},[38,599,600],{"style":48}," defaultTransport",[38,602,603],{"style":55},"(request)),",[38,605,606],{"class":40,"style":41},[38,607,475],{"style":55},{"title":609,"searchDepth":610,"depth":610,"links":611},"",5,[612,614,615,616],{"id":19,"depth":613,"text":20},2,{"id":315,"depth":613,"text":316},{"id":517,"depth":613,"text":518},{"id":536,"depth":613,"text":537},"md",{},{},true,null,"\u002Fextensions\u002Fkubb-labs\u002Fplugin-fetch\u002Fguides\u002Ftransport",{"title":5},{"loc":622},"extensions\u002Fkubb-labs\u002Fplugin-fetch\u002Fguides\u002Ftransport","m7xeSzYbQuI4aL9X_FZ9zpbkN3xeQcIJhng-zSZ04SU",false,1792762692017]