<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aiji Uejima</title>
    <description>The latest articles on DEV Community by Aiji Uejima (@aiji42).</description>
    <link>https://dev.to/aiji42</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F888614%2F2af9c8bb-b699-4583-966b-4fbfecf4e546.jpeg</url>
      <title>DEV Community: Aiji Uejima</title>
      <link>https://dev.to/aiji42</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aiji42"/>
    <language>en</language>
    <item>
      <title>Reduce the latency of Prisma Data Proxy by self-hosting</title>
      <dc:creator>Aiji Uejima</dc:creator>
      <pubDate>Fri, 08 Jul 2022 01:20:33 +0000</pubDate>
      <link>https://dev.to/aiji42/solving-the-problem-of-latency-in-prisma-data-proxy-2pio</link>
      <guid>https://dev.to/aiji42/solving-the-problem-of-latency-in-prisma-data-proxy-2pio</guid>
      <description>&lt;h2&gt;
  
  
  What is this post?
&lt;/h2&gt;

&lt;p&gt;This is a post about Prisma Data Proxy being slow, and I solved the problem by creating my own library to self-host it.&lt;/p&gt;

&lt;p&gt;The library created and introduced in this post is released as OSS &amp;amp; published to npm, so please feel free to use it.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/aiji42" rel="noopener noreferrer"&gt;
        aiji42
      &lt;/a&gt; / &lt;a href="https://github.com/aiji42/prisma-data-proxy-alt" rel="noopener noreferrer"&gt;
        prisma-data-proxy-alt
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This is a library to alternate and self-host the Prisma Data Proxy (cloud.prisma.io)
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://badge.fury.io/js/prisma-data-proxy-alt" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bacab867b42e4a464b8d5e3e9ee752912a0f21ece090488f3b4624c1384c2efc/68747470733a2f2f62616467652e667572792e696f2f6a732f707269736d612d646174612d70726f78792d616c742e737667" alt="npm version"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/aiji42/prisma-data-proxy-alt" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a3cac74f99855928475cf670426939f518f88b64ce12f559ad5768506f5d0a01/68747470733a2f2f636f6465636f762e696f2f67682f61696a6934322f707269736d612d646174612d70726f78792d616c742f6272616e63682f6d61696e2f67726170682f62616467652e7376673f746f6b656e3d4e535438394a484b5245" alt="codecov"&gt;&lt;/a&gt;
&lt;a href="https://github.com/aiji42/prisma-data-proxy-alt/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/aiji42/prisma-data-proxy-alt/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Alternative Prisma Data Proxy&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;This is a library to alternate and self-host the &lt;a href="https://www.prisma.io/docs/concepts/data-platform/data-proxy" rel="nofollow noopener noreferrer"&gt;Prisma Data Proxy (cloud.prisma.io)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In order to deploy your project to edge runtimes (such as Cloudflare Workers or Vercel Edge Functions) and use Prisma, you will need to use the Prisma Data Proxy.&lt;br&gt;
However, at present, instances can only be built in limited areas, and there are also delays caused by cold standby. This is a very stressful problem.&lt;/p&gt;
&lt;p&gt;Therefore, we have created a server library to replace Prisma Data Proxy. With it, you are free from stressful limitations
You can deploy it on any platform in any region you like and use any data source you like, such as Supabase or Planetscale.&lt;/p&gt;
&lt;p&gt;No changes are required to your prisma client code, just set the &lt;code&gt;DATABASE_URL&lt;/code&gt; to the URL you self-hosted with this library.&lt;br&gt;
This is not an official library, but it works the same as…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/aiji42/prisma-data-proxy-alt" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  What is Prisma Data Proxy?
&lt;/h2&gt;

&lt;p&gt;Prisma.io provides a proxy server for database connection management and pooling.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;From &lt;a href="https://www.prisma.io/data-platform" rel="noopener noreferrer"&gt;https://www.prisma.io/data-platform&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;With the Proxy&lt;/th&gt;
&lt;th&gt;Without the Proxy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fzenn%2Fimage%2Ffetch%2Fs--NojPQmqR--%2Fhttps%3A%2F%2Fwww.prisma.io%2Fdata-platform%2Foptimise-2-with-the-proxy.svg" alt="With the Proxy"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fzenn%2Fimage%2Ffetch%2Fs--eLKsnLp1--%2Fhttps%3A%2F%2Fwww.prisma.io%2Fdata-platform%2Foptimise-2-without-the-proxy.svg" alt="Without the Proxy"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cloudflare Workers and Vecel Edge Functions, for example, do not have a native (TCP) connection to the database.&lt;br&gt;
So, Data Proxy intervenes between the connection to the database, and from the Worker, a virtual connection to the database is achieved through an HTTP connection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2u42e0bjwwj2yjibq3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2u42e0bjwwj2yjibq3g.png" alt="Prisma Data Proxy overview"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Prisma Data Proxy Weaknesses
&lt;/h2&gt;

&lt;p&gt;The Data Proxy can be built by creating an instance on the web console at &lt;a href="https://cloud.prisma.io" rel="noopener noreferrer"&gt;https://cloud.prisma.io&lt;/a&gt;.&lt;br&gt;
However, as of July 7, 2022, there are only two regions to choose from: Northern Virginia and Frankfurt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqj3tpg8owbd3ftlo36vn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqj3tpg8owbd3ftlo36vn.png" alt="regions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And since it is a serverless service, it is also affected by the latency caused by cold standby.&lt;/p&gt;

&lt;p&gt;The majority of Data Proxy use cases are for data source usage from the edge side, such as Cloudflare Workers, but the benefits of the edge case are diminished if the latency of the data request is high.&lt;/p&gt;

&lt;p&gt;In the measurements from Japan, when I selected an instance in Northern Virginia and built and connected to Planetscale in the same region, I observed a latency of &lt;strong&gt;around2.6s with cold standby and600ms without cold standby&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With this performance, it is not realistic to put it into service.&lt;/p&gt;

&lt;p&gt;I wanted to take advantage of Prisma's powerful type generation capabilities, so I decided to self-host the Data Proxy in the Japan region and build it on an architecture that would be less susceptible to cold standby.&lt;/p&gt;
&lt;h2&gt;
  
  
  Reasoning about Data Proxy implementation
&lt;/h2&gt;

&lt;p&gt;Since the server-side code for the Prisma Data Proxy is not publicly available, I have deduced a black-box Data Proxy implementation from the client-side implementation.&lt;/p&gt;

&lt;p&gt;The following source code shows that the Prisma client communicates with the Data Proxy in the GraphQL schema.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/prisma/prisma/blob/main/packages/engine-core/src/data-proxy/DataProxyEngine.ts#L140-L151" rel="noopener noreferrer"&gt;https://github.com/prisma/prisma/blob/main/packages/engine-core/src/data-proxy/DataProxyEngine.ts#L140-L151&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;requestInternal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;logEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;info&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Calling &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;graphql&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt; (n=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;graphql&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;clientVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientVersion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I actually inserted &lt;code&gt;console.log&lt;/code&gt; into the source code to check it.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;db.link.findMany(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;findManyLink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;createdAt&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;updatedAt&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Alternative Data Proxy
&lt;/h2&gt;

&lt;p&gt;Finally, I have completed an implementation of the Alternative Data Proxy, which is available on npm and free to use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogz6gggth40uqz98x3e8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogz6gggth40uqz98x3e8.png" alt="alternative data proxy"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/aiji42" rel="noopener noreferrer"&gt;
        aiji42
      &lt;/a&gt; / &lt;a href="https://github.com/aiji42/prisma-data-proxy-alt" rel="noopener noreferrer"&gt;
        prisma-data-proxy-alt
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This is a library to alternate and self-host the Prisma Data Proxy (cloud.prisma.io)
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://badge.fury.io/js/prisma-data-proxy-alt" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bacab867b42e4a464b8d5e3e9ee752912a0f21ece090488f3b4624c1384c2efc/68747470733a2f2f62616467652e667572792e696f2f6a732f707269736d612d646174612d70726f78792d616c742e737667" alt="npm version"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/aiji42/prisma-data-proxy-alt" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a3cac74f99855928475cf670426939f518f88b64ce12f559ad5768506f5d0a01/68747470733a2f2f636f6465636f762e696f2f67682f61696a6934322f707269736d612d646174612d70726f78792d616c742f6272616e63682f6d61696e2f67726170682f62616467652e7376673f746f6b656e3d4e535438394a484b5245" alt="codecov"&gt;&lt;/a&gt;
&lt;a href="https://github.com/aiji42/prisma-data-proxy-alt/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/aiji42/prisma-data-proxy-alt/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Alternative Prisma Data Proxy&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This is a library to alternate and self-host the &lt;a href="https://www.prisma.io/docs/concepts/data-platform/data-proxy" rel="nofollow noopener noreferrer"&gt;Prisma Data Proxy (cloud.prisma.io)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In order to deploy your project to edge runtimes (such as Cloudflare Workers or Vercel Edge Functions) and use Prisma, you will need to use the Prisma Data Proxy.&lt;br&gt;
However, at present, instances can only be built in limited areas, and there are also delays caused by cold standby. This is a very stressful problem.&lt;/p&gt;
&lt;p&gt;Therefore, we have created a server library to replace Prisma Data Proxy. With it, you are free from stressful limitations
You can deploy it on any platform in any region you like and use any data source you like, such as Supabase or Planetscale.&lt;/p&gt;
&lt;p&gt;No changes are required to your prisma client code, just set the &lt;code&gt;DATABASE_URL&lt;/code&gt; to the URL you self-hosted with this library.&lt;br&gt;
This is not an official library, but it works the same as…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/aiji42/prisma-data-proxy-alt" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add prisma-data-proxy-alt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You need to set environment variables. This library also supports &lt;code&gt;.env&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PRISMA_SCHEMA_PATH=/absolute/path/for/your/schema.prisma
DATABASE_URL={database URL scheme e.g. postgresql://postgres:pass@db:5432/postgres?schema=public}
DATA_PROXY_API_KEY={random string for authentication}
PORT={server port e.g. 3000}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Launch proxy server
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn pdp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Self-certification ssl is required for local startup.&lt;/p&gt;
&lt;h3&gt;
  
  
  Deploy to Cloud Run
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:16.15-bullseye-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; tini ca-certificates &lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get clean &lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package.json .&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; yarn.lock .&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; prisma/schema.prisma ./prisma/schema.prisma&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;yarn &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;yarn prisma generate

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; base&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/node_modules ./node_modules&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/package.json ./package.json&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PRISMA_SCHEMA_PATH=/app/node_modules/.prisma/client/schema.prisma&lt;/span&gt;

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; node&lt;/span&gt;

&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["/usr/bin/tini", "--"]&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["yarn", "pdp"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Create &lt;code&gt;cloudbuild.yml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gcr.io/kaniko-project/executor:latest'&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--destination=gcr.io/$PROJECT_ID/prisma-data-proxy-alt:$SHORT_SHA&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--destination=gcr.io/$PROJECT_ID/prisma-data-proxy-alt:latest&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--cache=true&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gcr.io/google.com/cloudsdktool/cloud-sdk'&lt;/span&gt;
    &lt;span class="na"&gt;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gcloud&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;run&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;prisma-data-proxy-alt&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--image&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;gcr.io/$PROJECT_ID/prisma-data-proxy-alt:latest&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--region&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;$_REGION&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--allow-unauthenticated&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--set-env-vars&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=$_DATABASE_URL&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--set-env-vars&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATA_PROXY_API_KEY=$_DATA_PROXY_API_KEY&lt;/span&gt;
&lt;span class="na"&gt;substitutions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;asia-northeast1&lt;/span&gt;
  &lt;span class="na"&gt;_DATABASE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your_database_url&lt;/span&gt;
  &lt;span class="na"&gt;_DATA_PROXY_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your_api_key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Create a new trigger from the GCP Cloud Build web console and link it to your repository.&lt;/p&gt;

&lt;p&gt;Set &lt;code&gt;_REGION&lt;/code&gt;, &lt;code&gt;_DATABASE_URL&lt;/code&gt;, and &lt;code&gt;_DATA_PROXY_API_KEY&lt;/code&gt; in the substitution values.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxybh4y2fzbntkav9o9fd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxybh4y2fzbntkav9o9fd.png" alt="cloud build substitution values"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;_REGION&lt;/code&gt;: The region of deploy target for Cloud Run&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_DATABASE_URL&lt;/code&gt;: Connection URL to your data source (mysql, postgres, etc...)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_DATA_PROXY_API_KEY&lt;/code&gt;: Arbitrary string to be used when connecting data proxy.

&lt;ul&gt;
&lt;li&gt;e.g. &lt;code&gt;prisma://your.deployed.domain?api_key={DATA_PROXY_API_KEY}&lt;/code&gt;
(do not divulge it to outside parties)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Connect from client
&lt;/h3&gt;

&lt;p&gt;On the client side, generate the Prisma client in data proxy mode &lt;code&gt;--data-proxy&lt;/code&gt;. &lt;a href="https://www.prisma.io/docs/data-platform/data-proxy#step-4-generate-the-client" rel="noopener noreferrer"&gt;official document&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set the &lt;code&gt;DATABSE_URL&lt;/code&gt; from the domain of the server you deployed and the api key (&lt;code&gt;DATA_PROXY_API_KEY&lt;/code&gt;) you set for it.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DATABSE_URL=prisma://${YOUR_DEPLOYED_PROJECT_DOMAIN}?api_key=${DATA_PROXY_API_KEY}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now you can connect to the Alternative Data Proxy from your application. 🎉&lt;/p&gt;
&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;Let's actually connect and measure the performance.&lt;/p&gt;
&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;I used Planetscale for the database and place it in the same region as each Data Proxy instance.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Official Data Proxy provided by cloud.prisma.io (Northern Virginia) + Planetscale (Northern Virginia)&lt;/li&gt;
&lt;li&gt;Alternative Data Proxy deployed on Cloud Run (Tokyo) + Planetscale (Tokyo)&lt;/li&gt;
&lt;li&gt;Alternative Data Proxy deployed on Cloud Run (Northern Virginia) + Planetscale (Northern Virginia)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Measurement results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Official PD Virginia&lt;/th&gt;
&lt;th&gt;Self-Hosted PD Tokyo&lt;/th&gt;
&lt;th&gt;Self Hosted PD Virginia&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;669.82ms&lt;/td&gt;
&lt;td&gt;98.33ms&lt;/td&gt;
&lt;td&gt;243.41ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;685.02ms&lt;/td&gt;
&lt;td&gt;110.36ms&lt;/td&gt;
&lt;td&gt;235.07ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;747.65ms&lt;/td&gt;
&lt;td&gt;95.04ms&lt;/td&gt;
&lt;td&gt;242.25ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;639.58ms&lt;/td&gt;
&lt;td&gt;91.52ms&lt;/td&gt;
&lt;td&gt;242.83ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;634.05ms&lt;/td&gt;
&lt;td&gt;106.34ms&lt;/td&gt;
&lt;td&gt;254.64ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg&lt;/td&gt;
&lt;td&gt;675.23ms 🥉&lt;/td&gt;
&lt;td&gt;100.32ms 🥇&lt;/td&gt;
&lt;td&gt;243.64ms 🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Once again, we can see that the latency of the official Data Proxy is quite large.&lt;br&gt;
What is surprising is that not only the self-hosted Data Proxy in the Tokyo region is faster, but also the Data Proxy in Northern Virginia in the same region has much lower latency than the official Data Proxy.&lt;br&gt;
Presumably, the official Data Proxy is making every connection to the database, which leads to the increased latency.&lt;/p&gt;

&lt;p&gt;Official Data Proxy regions will be added in due course, but the latency caused by cold standby and database connections cannot be eliminated, so it seems well worth using this Alternative Data Proxy.&lt;/p&gt;
&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Solved Prisma Data Proxy's weaknesses - region limitations and cold standby latency - by self-hosting a replacement server&lt;/li&gt;
&lt;li&gt;The source of Prisma Data Proxy is not publicly available, but from the client and the actual request, I guessed that the reality is GraphQL, and succeeded in making it into a library!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've managed to get Prisma to work satisfactorily from Cloudflare Workers.&lt;/p&gt;

&lt;p&gt;The library created and introduced in this article is released as OSS &amp;amp; published to npm, so please feel free to use it.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/aiji42" rel="noopener noreferrer"&gt;
        aiji42
      &lt;/a&gt; / &lt;a href="https://github.com/aiji42/prisma-data-proxy-alt" rel="noopener noreferrer"&gt;
        prisma-data-proxy-alt
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This is a library to alternate and self-host the Prisma Data Proxy (cloud.prisma.io)
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://badge.fury.io/js/prisma-data-proxy-alt" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bacab867b42e4a464b8d5e3e9ee752912a0f21ece090488f3b4624c1384c2efc/68747470733a2f2f62616467652e667572792e696f2f6a732f707269736d612d646174612d70726f78792d616c742e737667" alt="npm version"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/aiji42/prisma-data-proxy-alt" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a3cac74f99855928475cf670426939f518f88b64ce12f559ad5768506f5d0a01/68747470733a2f2f636f6465636f762e696f2f67682f61696a6934322f707269736d612d646174612d70726f78792d616c742f6272616e63682f6d61696e2f67726170682f62616467652e7376673f746f6b656e3d4e535438394a484b5245" alt="codecov"&gt;&lt;/a&gt;
&lt;a href="https://github.com/aiji42/prisma-data-proxy-alt/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/aiji42/prisma-data-proxy-alt/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Alternative Prisma Data Proxy&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This is a library to alternate and self-host the &lt;a href="https://www.prisma.io/docs/concepts/data-platform/data-proxy" rel="nofollow noopener noreferrer"&gt;Prisma Data Proxy (cloud.prisma.io)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In order to deploy your project to edge runtimes (such as Cloudflare Workers or Vercel Edge Functions) and use Prisma, you will need to use the Prisma Data Proxy.&lt;br&gt;
However, at present, instances can only be built in limited areas, and there are also delays caused by cold standby. This is a very stressful problem.&lt;/p&gt;
&lt;p&gt;Therefore, we have created a server library to replace Prisma Data Proxy. With it, you are free from stressful limitations
You can deploy it on any platform in any region you like and use any data source you like, such as Supabase or Planetscale.&lt;/p&gt;
&lt;p&gt;No changes are required to your prisma client code, just set the &lt;code&gt;DATABASE_URL&lt;/code&gt; to the URL you self-hosted with this library.&lt;br&gt;
This is not an official library, but it works the same as…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/aiji42/prisma-data-proxy-alt" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>typescript</category>
      <category>prisma</category>
      <category>node</category>
    </item>
  </channel>
</rss>
