tinbase 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/assets/logo.svg +18 -0
  4. package/dist/auth/handler.d.ts +43 -0
  5. package/dist/auth/handler.js +291 -0
  6. package/dist/auth/handler.js.map +1 -0
  7. package/dist/auth/password.d.ts +3 -0
  8. package/dist/auth/password.js +40 -0
  9. package/dist/auth/password.js.map +1 -0
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.js +181 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/db/bootstrap.d.ts +6 -0
  14. package/dist/db/bootstrap.js +213 -0
  15. package/dist/db/bootstrap.js.map +1 -0
  16. package/dist/db/database.d.ts +83 -0
  17. package/dist/db/database.js +270 -0
  18. package/dist/db/database.js.map +1 -0
  19. package/dist/db/engine.d.ts +30 -0
  20. package/dist/db/engine.js +28 -0
  21. package/dist/db/engine.js.map +1 -0
  22. package/dist/db/pglite-engine.d.ts +3 -0
  23. package/dist/db/pglite-engine.js +39 -0
  24. package/dist/db/pglite-engine.js.map +1 -0
  25. package/dist/index.d.ts +23 -0
  26. package/dist/index.js +145 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/jwt.d.ts +20 -0
  29. package/dist/jwt.js +72 -0
  30. package/dist/jwt.js.map +1 -0
  31. package/dist/node/bun-server.d.ts +8 -0
  32. package/dist/node/bun-server.js +41 -0
  33. package/dist/node/bun-server.js.map +1 -0
  34. package/dist/node/fs-driver.d.ts +11 -0
  35. package/dist/node/fs-driver.js +39 -0
  36. package/dist/node/fs-driver.js.map +1 -0
  37. package/dist/node/index.d.ts +7 -0
  38. package/dist/node/index.js +8 -0
  39. package/dist/node/index.js.map +1 -0
  40. package/dist/node/native/engine.d.ts +13 -0
  41. package/dist/node/native/engine.js +186 -0
  42. package/dist/node/native/engine.js.map +1 -0
  43. package/dist/node/native/wire.d.ts +38 -0
  44. package/dist/node/native/wire.js +345 -0
  45. package/dist/node/native/wire.js.map +1 -0
  46. package/dist/node/project.d.ts +6 -0
  47. package/dist/node/project.js +29 -0
  48. package/dist/node/project.js.map +1 -0
  49. package/dist/node/server-shared.d.ts +6 -0
  50. package/dist/node/server-shared.js +2 -0
  51. package/dist/node/server-shared.js.map +1 -0
  52. package/dist/node/server.d.ts +14 -0
  53. package/dist/node/server.js +83 -0
  54. package/dist/node/server.js.map +1 -0
  55. package/dist/node/ws.d.ts +8 -0
  56. package/dist/node/ws.js +165 -0
  57. package/dist/node/ws.js.map +1 -0
  58. package/dist/realtime/engine.d.ts +53 -0
  59. package/dist/realtime/engine.js +437 -0
  60. package/dist/realtime/engine.js.map +1 -0
  61. package/dist/rest/build.d.ts +53 -0
  62. package/dist/rest/build.js +505 -0
  63. package/dist/rest/build.js.map +1 -0
  64. package/dist/rest/errors.d.ts +2 -0
  65. package/dist/rest/errors.js +48 -0
  66. package/dist/rest/errors.js.map +1 -0
  67. package/dist/rest/handler.d.ts +11 -0
  68. package/dist/rest/handler.js +332 -0
  69. package/dist/rest/handler.js.map +1 -0
  70. package/dist/rest/parse.d.ts +69 -0
  71. package/dist/rest/parse.js +261 -0
  72. package/dist/rest/parse.js.map +1 -0
  73. package/dist/storage/driver.d.ts +9 -0
  74. package/dist/storage/driver.js +18 -0
  75. package/dist/storage/driver.js.map +1 -0
  76. package/dist/storage/handler.d.ts +49 -0
  77. package/dist/storage/handler.js +534 -0
  78. package/dist/storage/handler.js.map +1 -0
  79. package/dist/types.d.ts +51 -0
  80. package/dist/types.js +11 -0
  81. package/dist/types.js.map +1 -0
  82. package/package.json +59 -0
@@ -0,0 +1,345 @@
1
+ /**
2
+ * Minimal Postgres wire-protocol (v3) client — enough for tinbase's needs:
3
+ * trust auth over a unix socket, simple + extended queries, typed decoding,
4
+ * LISTEN/NOTIFY. Pure Node, no dependencies.
5
+ */
6
+ import { createConnection } from 'node:net';
7
+ export class PgWireError extends Error {
8
+ code;
9
+ detail;
10
+ hint;
11
+ severity;
12
+ constructor(fields) {
13
+ super(fields.get('M') ?? 'postgres error');
14
+ this.code = fields.get('C');
15
+ this.detail = fields.get('D');
16
+ this.hint = fields.get('H');
17
+ this.severity = fields.get('S');
18
+ }
19
+ }
20
+ export class PgWireClient {
21
+ socket;
22
+ buffer = Buffer.alloc(0);
23
+ pending = null;
24
+ queue = Promise.resolve();
25
+ closed = false;
26
+ onNotification = null;
27
+ static async connect(opts) {
28
+ const client = new PgWireClient();
29
+ await client.open(opts);
30
+ return client;
31
+ }
32
+ open(opts) {
33
+ return new Promise((resolve, reject) => {
34
+ this.socket = opts.socketPath
35
+ ? createConnection(opts.socketPath)
36
+ : createConnection(opts.port ?? 5432, opts.host ?? '127.0.0.1');
37
+ this.socket.on('error', (e) => {
38
+ if (this.pending)
39
+ this.pending.reject(e);
40
+ reject(e);
41
+ });
42
+ this.socket.on('close', () => {
43
+ this.closed = true;
44
+ this.pending?.reject(new Error('connection closed'));
45
+ });
46
+ this.socket.on('connect', () => {
47
+ // StartupMessage: length, protocol 196608, key/value pairs
48
+ const params = `user\0${opts.user}\0database\0${opts.database}\0client_encoding\0UTF8\0\0`;
49
+ const body = Buffer.from(params, 'utf8');
50
+ const msg = Buffer.alloc(8 + body.length);
51
+ msg.writeInt32BE(8 + body.length, 0);
52
+ msg.writeInt32BE(196608, 4);
53
+ body.copy(msg, 8);
54
+ this.socket.write(msg);
55
+ });
56
+ // Startup phase: consume until first ReadyForQuery
57
+ const startupHandler = (chunk) => {
58
+ this.buffer = Buffer.concat([this.buffer, chunk]);
59
+ let msg;
60
+ while ((msg = this.nextMessage()) !== null) {
61
+ const [type, payload] = msg;
62
+ if (type === 0x52) {
63
+ // Authentication — only trust (code 0) supported
64
+ const code = payload.readInt32BE(0);
65
+ if (code !== 0) {
66
+ reject(new Error(`unsupported auth method ${code} (tinbase native uses trust over unix socket)`));
67
+ return;
68
+ }
69
+ }
70
+ else if (type === 0x45) {
71
+ reject(new PgWireError(parseErrorFields(payload)));
72
+ return;
73
+ }
74
+ else if (type === 0x5a) {
75
+ // ReadyForQuery
76
+ this.socket.off('data', startupHandler);
77
+ this.socket.on('data', (c) => {
78
+ this.buffer = Buffer.concat([this.buffer, c]);
79
+ this.processMessages();
80
+ });
81
+ resolve();
82
+ return;
83
+ }
84
+ // ParameterStatus (S), BackendKeyData (K), NoticeResponse (N) — ignore
85
+ }
86
+ };
87
+ this.socket.on('data', startupHandler);
88
+ });
89
+ }
90
+ /** One protocol op at a time; queued to be safe under concurrency. */
91
+ run(send) {
92
+ const op = this.queue.then(() => new Promise((resolve, reject) => {
93
+ if (this.closed)
94
+ return reject(new Error('connection closed'));
95
+ this.pending = { resolve, reject, results: [], columns: [], error: null };
96
+ send();
97
+ }));
98
+ this.queue = op.catch(() => { });
99
+ return op;
100
+ }
101
+ /** Simple query protocol — supports multiple statements. */
102
+ async exec(sql) {
103
+ return this.run(() => this.socket.write(message(0x51, cstring(sql))));
104
+ }
105
+ /** Extended query protocol with text-format params. */
106
+ async query(sql, params = []) {
107
+ const results = await this.run(() => {
108
+ const parse = message(0x50, Buffer.concat([cstring(''), cstring(sql), int16(0)]));
109
+ const paramBufs = [int16(0), int16(params.length)];
110
+ for (const p of params) {
111
+ if (p === null || p === undefined) {
112
+ paramBufs.push(int32(-1));
113
+ }
114
+ else {
115
+ const b = Buffer.from(String(p), 'utf8');
116
+ paramBufs.push(int32(b.length), b);
117
+ }
118
+ }
119
+ paramBufs.push(int16(0));
120
+ const bind = message(0x42, Buffer.concat([cstring(''), cstring(''), ...paramBufs]));
121
+ const describe = message(0x44, Buffer.concat([Buffer.from('P'), cstring('')]));
122
+ const execute = message(0x45, Buffer.concat([cstring(''), int32(0)]));
123
+ const sync = message(0x53, Buffer.alloc(0));
124
+ this.socket.write(Buffer.concat([parse, bind, describe, execute, sync]));
125
+ });
126
+ return (results[0] ?? { rows: [] });
127
+ }
128
+ close() {
129
+ return new Promise((resolve) => {
130
+ if (this.closed)
131
+ return resolve();
132
+ this.socket.write(message(0x58, Buffer.alloc(0))); // Terminate
133
+ this.socket.end(() => resolve());
134
+ });
135
+ }
136
+ // ── message pump ──────────────────────────────────────────────────────
137
+ nextMessage() {
138
+ if (this.buffer.length < 5)
139
+ return null;
140
+ const type = this.buffer[0];
141
+ const length = this.buffer.readInt32BE(1);
142
+ if (this.buffer.length < 1 + length)
143
+ return null;
144
+ const payload = this.buffer.subarray(5, 1 + length);
145
+ this.buffer = this.buffer.subarray(1 + length);
146
+ return [type, Buffer.from(payload)];
147
+ }
148
+ processMessages() {
149
+ let msg;
150
+ while ((msg = this.nextMessage()) !== null) {
151
+ const [type, payload] = msg;
152
+ const p = this.pending;
153
+ switch (type) {
154
+ case 0x54: {
155
+ // RowDescription
156
+ if (!p)
157
+ break;
158
+ const count = payload.readInt16BE(0);
159
+ let off = 2;
160
+ const columns = [];
161
+ for (let i = 0; i < count; i++) {
162
+ const end = payload.indexOf(0, off);
163
+ const name = payload.toString('utf8', off, end);
164
+ off = end + 1;
165
+ const typeOid = payload.readInt32BE(off + 6);
166
+ off += 18;
167
+ columns.push({ name, typeOid });
168
+ }
169
+ p.columns = columns;
170
+ break;
171
+ }
172
+ case 0x44: {
173
+ // DataRow
174
+ if (!p)
175
+ break;
176
+ const count = payload.readInt16BE(0);
177
+ let off = 2;
178
+ const row = {};
179
+ for (let i = 0; i < count; i++) {
180
+ const len = payload.readInt32BE(off);
181
+ off += 4;
182
+ let value = null;
183
+ if (len >= 0) {
184
+ value = decodeValue(payload.toString('utf8', off, off + len), p.columns[i]?.typeOid ?? 25);
185
+ off += len;
186
+ }
187
+ row[p.columns[i]?.name ?? `col${i}`] = value;
188
+ }
189
+ if (p.results.length === 0)
190
+ p.results.push({ rows: [] });
191
+ p.results[p.results.length - 1].rows.push(row);
192
+ break;
193
+ }
194
+ case 0x43: {
195
+ // CommandComplete — tag like "INSERT 0 5" / "UPDATE 3" / "SELECT 2"
196
+ if (!p)
197
+ break;
198
+ const tag = payload.toString('utf8', 0, payload.length - 1);
199
+ const parts = tag.split(' ');
200
+ const affected = parseInt(parts[parts.length - 1], 10);
201
+ if (p.results.length === 0)
202
+ p.results.push({ rows: [] });
203
+ const current = p.results[p.results.length - 1];
204
+ if (!Number.isNaN(affected))
205
+ current.affectedRows = affected;
206
+ // next statement in a multi-statement exec starts a fresh result
207
+ p.results.push({ rows: [] });
208
+ p.columns = [];
209
+ break;
210
+ }
211
+ case 0x45: {
212
+ // ErrorResponse — final resolution happens at ReadyForQuery
213
+ if (p)
214
+ p.error = new PgWireError(parseErrorFields(payload));
215
+ break;
216
+ }
217
+ case 0x41: {
218
+ // NotificationResponse
219
+ payload.readInt32BE(0); // sender pid
220
+ const channelEnd = payload.indexOf(0, 4);
221
+ const channel = payload.toString('utf8', 4, channelEnd);
222
+ const payloadEnd = payload.indexOf(0, channelEnd + 1);
223
+ const body = payload.toString('utf8', channelEnd + 1, payloadEnd);
224
+ this.onNotification?.(channel, body);
225
+ break;
226
+ }
227
+ case 0x5a: {
228
+ // ReadyForQuery — op finished
229
+ if (!p)
230
+ break;
231
+ this.pending = null;
232
+ if (p.error)
233
+ p.reject(p.error);
234
+ else {
235
+ // drop the trailing empty result opened by the last CommandComplete
236
+ const results = p.results.filter((r, i) => i < p.results.length - 1 || r.rows.length > 0 || r.affectedRows !== undefined);
237
+ p.resolve(results.length > 0 ? results : [{ rows: [] }]);
238
+ }
239
+ break;
240
+ }
241
+ // ParseComplete (1), BindComplete (2), NoData (n), EmptyQueryResponse (I),
242
+ // NoticeResponse (N), ParameterStatus (S) — ignored
243
+ }
244
+ }
245
+ }
246
+ }
247
+ // ── helpers ───────────────────────────────────────────────────────────────
248
+ function message(type, body) {
249
+ const out = Buffer.alloc(5 + body.length);
250
+ out[0] = type;
251
+ out.writeInt32BE(4 + body.length, 1);
252
+ body.copy(out, 5);
253
+ return out;
254
+ }
255
+ const cstring = (s) => Buffer.from(s + '\0', 'utf8');
256
+ const int16 = (n) => {
257
+ const b = Buffer.alloc(2);
258
+ b.writeInt16BE(n);
259
+ return b;
260
+ };
261
+ const int32 = (n) => {
262
+ const b = Buffer.alloc(4);
263
+ b.writeInt32BE(n);
264
+ return b;
265
+ };
266
+ function parseErrorFields(payload) {
267
+ const fields = new Map();
268
+ let off = 0;
269
+ while (off < payload.length && payload[off] !== 0) {
270
+ const key = String.fromCharCode(payload[off]);
271
+ const end = payload.indexOf(0, off + 1);
272
+ fields.set(key, payload.toString('utf8', off + 1, end));
273
+ off = end + 1;
274
+ }
275
+ return fields;
276
+ }
277
+ /** Decode a text-format value by type OID to match PGlite's JS types. */
278
+ function decodeValue(text, oid) {
279
+ switch (oid) {
280
+ case 16: // bool
281
+ return text === 't';
282
+ case 20: // int8
283
+ case 21: // int2
284
+ case 23: // int4
285
+ case 26: // oid
286
+ return Number(text);
287
+ case 700:
288
+ case 701: // float4/8
289
+ return Number(text);
290
+ case 114: // json
291
+ case 3802: // jsonb
292
+ return JSON.parse(text);
293
+ case 1114: // timestamp
294
+ return new Date(text.replace(' ', 'T') + 'Z');
295
+ case 1184: {
296
+ // timestamptz: "2026-07-05 14:00:00.1+00"
297
+ let iso = text.replace(' ', 'T');
298
+ if (/[+-]\d\d$/.test(iso))
299
+ iso += ':00';
300
+ return new Date(iso);
301
+ }
302
+ case 1000: // _bool
303
+ return parsePgArray(text).map((v) => v === 't');
304
+ case 1007: // _int4
305
+ case 1016: // _int8
306
+ return parsePgArray(text).map((v) => (v === null ? null : Number(v)));
307
+ case 1009: // _text
308
+ case 1015: // _varchar
309
+ return parsePgArray(text);
310
+ default:
311
+ return text;
312
+ }
313
+ }
314
+ /** Parse a one-dimensional Postgres array literal: {a,"b c",NULL} */
315
+ export function parsePgArray(text) {
316
+ const out = [];
317
+ if (text.length < 2)
318
+ return out;
319
+ let i = 1;
320
+ while (i < text.length - 1) {
321
+ if (text[i] === ',') {
322
+ i++;
323
+ continue;
324
+ }
325
+ if (text[i] === '"') {
326
+ let value = '';
327
+ i++;
328
+ while (text[i] !== '"') {
329
+ if (text[i] === '\\')
330
+ i++;
331
+ value += text[i++];
332
+ }
333
+ i++;
334
+ out.push(value);
335
+ }
336
+ else {
337
+ let value = '';
338
+ while (i < text.length - 1 && text[i] !== ',')
339
+ value += text[i++];
340
+ out.push(value === 'NULL' ? null : value);
341
+ }
342
+ }
343
+ return out;
344
+ }
345
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../src/node/native/wire.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { MigrationFile } from '../types.js';
2
+ export interface SupabaseProject {
3
+ migrations: MigrationFile[];
4
+ seedSql?: string;
5
+ }
6
+ export declare function loadSupabaseProject(projectDir: string): Promise<SupabaseProject>;
@@ -0,0 +1,29 @@
1
+ /** Loads migrations + seed following Supabase CLI conventions (supabase/ dir). */
2
+ import { readdir, readFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ export async function loadSupabaseProject(projectDir) {
5
+ const migrationsDir = join(projectDir, 'supabase', 'migrations');
6
+ const migrations = [];
7
+ let entries = [];
8
+ try {
9
+ entries = await readdir(migrationsDir);
10
+ }
11
+ catch {
12
+ // no migrations directory — that's fine
13
+ }
14
+ for (const entry of entries.sort()) {
15
+ if (!entry.endsWith('.sql'))
16
+ continue;
17
+ const sql = await readFile(join(migrationsDir, entry), 'utf8');
18
+ migrations.push({ name: entry.replace(/\.sql$/, ''), sql });
19
+ }
20
+ let seedSql;
21
+ try {
22
+ seedSql = await readFile(join(projectDir, 'supabase', 'seed.sql'), 'utf8');
23
+ }
24
+ catch {
25
+ // no seed file
26
+ }
27
+ return { migrations, seedSql };
28
+ }
29
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/node/project.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAQhC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAkB;IAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAA;IAChE,MAAM,UAAU,GAAoB,EAAE,CAAA;IAEtC,IAAI,OAAO,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAA;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAQ;QACrC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAA;QAC9D,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,OAA2B,CAAA;IAC/B,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAA;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;AAChC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { RealtimeEngine } from '../realtime/engine.js';
2
+ /** The slice of a backend that servers need — keeps bun/node servers decoupled. */
3
+ export interface SupaliteBackendShape {
4
+ fetch: (req: Request) => Promise<Response>;
5
+ realtime: RealtimeEngine;
6
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-shared.js","sourceRoot":"","sources":["../../src/node/server-shared.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ /** Node HTTP wrapper: serves the backend's fetch handler and upgrades /realtime/v1 WebSockets. */
2
+ import { type Server } from 'node:http';
3
+ import type { TinbaseBackend } from '../index.js';
4
+ export interface ServeOptions {
5
+ port?: number;
6
+ host?: string;
7
+ }
8
+ export interface RunningServer {
9
+ server: Server;
10
+ port: number;
11
+ url: string;
12
+ close: () => Promise<void>;
13
+ }
14
+ export declare function serve(backend: TinbaseBackend, opts?: ServeOptions): Promise<RunningServer>;
@@ -0,0 +1,83 @@
1
+ /** Node HTTP wrapper: serves the backend's fetch handler and upgrades /realtime/v1 WebSockets. */
2
+ import { createServer } from 'node:http';
3
+ import { acceptWebSocket } from './ws.js';
4
+ export async function serve(backend, opts = {}) {
5
+ const host = opts.host ?? '127.0.0.1';
6
+ const server = createServer(async (req, res) => {
7
+ try {
8
+ const request = await toRequest(req, host);
9
+ const response = await backend.fetch(request);
10
+ await writeResponse(response, res);
11
+ }
12
+ catch (e) {
13
+ res.writeHead(500, { 'content-type': 'application/json' });
14
+ res.end(JSON.stringify({ message: e instanceof Error ? e.message : String(e) }));
15
+ }
16
+ });
17
+ server.on('upgrade', (req, socket, head) => {
18
+ const url = new URL(req.url ?? '/', `http://${req.headers.host ?? host}`);
19
+ if (!url.pathname.startsWith('/realtime/v1')) {
20
+ socket.write('HTTP/1.1 404 Not Found\r\n\r\n');
21
+ socket.destroy();
22
+ return;
23
+ }
24
+ const ws = acceptWebSocket(req, socket, head);
25
+ if (!ws)
26
+ return;
27
+ const session = backend.realtime.connect(ws, { vsn: url.searchParams.get('vsn') ?? '1.0.0' });
28
+ ws.onMessage = session.onMessage;
29
+ ws.onClose = session.onClose;
30
+ });
31
+ await new Promise((resolve, reject) => {
32
+ server.once('error', reject);
33
+ server.listen(opts.port ?? 54321, host, () => resolve());
34
+ });
35
+ const address = server.address();
36
+ const port = typeof address === 'object' && address ? address.port : (opts.port ?? 54321);
37
+ return {
38
+ server,
39
+ port,
40
+ url: `http://${host}:${port}`,
41
+ close: () => new Promise((resolve, reject) => {
42
+ server.closeAllConnections?.();
43
+ server.close((err) => (err ? reject(err) : resolve()));
44
+ }),
45
+ };
46
+ }
47
+ async function toRequest(req, fallbackHost) {
48
+ const url = `http://${req.headers.host ?? fallbackHost}${req.url ?? '/'}`;
49
+ const method = req.method ?? 'GET';
50
+ const headers = new Headers();
51
+ for (const [key, value] of Object.entries(req.headers)) {
52
+ if (value === undefined)
53
+ continue;
54
+ if (Array.isArray(value))
55
+ for (const v of value)
56
+ headers.append(key, v);
57
+ else
58
+ headers.set(key, value);
59
+ }
60
+ let body;
61
+ if (method !== 'GET' && method !== 'HEAD') {
62
+ const chunks = [];
63
+ for await (const chunk of req)
64
+ chunks.push(chunk);
65
+ body = Buffer.concat(chunks);
66
+ }
67
+ return new Request(url, { method, headers, body: body });
68
+ }
69
+ async function writeResponse(response, res) {
70
+ const headers = {};
71
+ response.headers.forEach((value, key) => {
72
+ headers[key] = value;
73
+ });
74
+ res.writeHead(response.status, headers);
75
+ if (response.body) {
76
+ const buf = Buffer.from(await response.arrayBuffer());
77
+ res.end(buf);
78
+ }
79
+ else {
80
+ res.end();
81
+ }
82
+ }
83
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/node/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { IncomingMessage } from 'node:http';
2
+ import type { Duplex } from 'node:stream';
3
+ import type { RealtimeSocketLike } from '../realtime/engine.js';
4
+ export interface WsConnection extends RealtimeSocketLike {
5
+ onMessage: ((data: string | Uint8Array) => void) | null;
6
+ onClose: (() => void) | null;
7
+ }
8
+ export declare function acceptWebSocket(req: IncomingMessage, socket: Duplex, head: Buffer): WsConnection | null;