Skip to content

Wrangler Proxy exposes Workers API to outside and integrate to your favorite frameworks. Compatible with DrizzleORM.

License

Notifications You must be signed in to change notification settings

chientrm/wrangler-proxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

82 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

wrangler-proxy

Download Version

Wrangler Proxy exposes Workers API to outside and integrate to your favorite frameworks. Compatible with DrizzleORM.

Quick links

Get Started

Install

npm i -D wrangler-proxy

Example wrangler.toml

name = "worker"
compatibility_date = "2023-07-02"

[[d1_databases]]
binding = "D1"
database_name = "D1"
database_id = "<d1-id>"

[[kv_namespaces]]
binding = "KV"
id = "<kv-id>"
preview_id = "<same-kv-id-as-above>"

[[services]]
binding = "WORKER"
service = "<worker-name>"
environment = "production"

Start proxy for dev

Remote mode

wrangler dev node_modules/wrangler-proxy/dist/worker.js --remote

Local mode

wrangler dev node_modules/wrangler-proxy/dist/worker.js

Example SvelteKit project

// file: app.d.ts

declare global {
  namespace App {
    interface Locals {
      D1: D1Database;
    }
    interface Platform {
      env?: {
        D1: D1Database;
      };
    }
  }
}

export {};
// file: src/hooks.server.ts

import { connectD1 } from 'wrangler-proxy';

export const handle = ({ event, resolve }) => {
  event.locals.D1 = event.platform?.env?.D1 ?? connectD1('D1');
  // or connectD1('D1', { hostname: 'custom-host-name' });
  // default hostname is `http://127.0.0.1:8787`
  return resolve(event);
};

Using wrangler-proxy to expose workers API

Init worker

npm create cloudflare@2 - .
// file: src/index.ts
import { createWorker } from 'wrangler-proxy';

export default createWorker();

Features

  • πŸ˜” Need funding
  • 🀷 Not fully tested
  • βœ… Complete

D1

import { connectD1 } from 'wrangler-proxy';
Function Status
prepare() βœ…
batch() βœ…
dump() πŸ˜”
exec() βœ…

PreparedStatement

Function Status
first() βœ…
run() βœ…
all() βœ…
raw() βœ…
bind() βœ…

Service Bindings

import { connectServiceBinding } from 'wrangler-proxy';
Function Status
fetch() βœ…
connect() πŸ˜”

app.d.ts

// app.d.ts

declare global {
  namespace App {
    interface Locals {
      SB: Fetcher;
    }
    interface Platform {
      env?: {
        SB: Fetcher;
      };
    }
  }
}

hooks.server.ts

/// hooks.server.ts

import { connectServiceBinding } from 'wrangler-proxy';

export const handle = async ({ resolve, event }) => {
  event.locals.SB = event.platform?.env?.SB ?? connectServiceBinding('SB');
  return resolve(event);
};

Example usage

event.locals.SB.fetch('http://whatever.fake/send');

http://whatever.fake is required as a dummy hostname. Without a dummy hostname the fetch will fail.

KV

import { connectKV } from 'wrangler-proxy';
Function Status
put() 🀷
get() βœ…
getWithMetadata() 🀷
delete() βœ…
list() 🀷

R2

import { connectR2 } from 'wrangler-proxy';
Function Status
head() πŸ˜”
get() βœ…
put() βœ…
createMultipartUpload() πŸ˜”
resumeMultipartUpload() πŸ˜”
delete() βœ…
list() πŸ˜”

waitUntil

// file: app.d.ts
namespace App {
  interface Platform {
    context: {
      waitUntil(promise: Promise<any>): void;
    };
  }
}
// file: +page.server.ts
import { waitUntil } from 'wrangler-proxy';

export const actions = {
  default: ({ locals, platform }) => {
    waitUntil((async () => {})(), platform?.context);
    return { message: 'success' };
  },
};

Queues πŸ˜”

Hyperdrive πŸ˜”

Workers AI πŸ˜”

AI Gateway πŸ˜”

Stream πŸ˜”

Images πŸ˜”

Contributing

If you find this project helpful, consider supporting it by

Buy Me A Coffee

or

Donating via PayPal

Your donation will help us implement your requested features faster.