@akirilyuk/supabase-in-memory-server 1.0.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.
- package/LICENSE +21 -0
- package/README.md +240 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +28 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth-memory.d.ts +40 -0
- package/dist/lib/auth-memory.d.ts.map +1 -0
- package/dist/lib/auth-memory.js +167 -0
- package/dist/lib/auth-memory.js.map +1 -0
- package/dist/lib/http-headers.d.ts +6 -0
- package/dist/lib/http-headers.d.ts.map +1 -0
- package/dist/lib/http-headers.js +14 -0
- package/dist/lib/http-headers.js.map +1 -0
- package/dist/lib/jwt.d.ts +14 -0
- package/dist/lib/jwt.d.ts.map +1 -0
- package/dist/lib/jwt.js +41 -0
- package/dist/lib/jwt.js.map +1 -0
- package/dist/lib/memory-store.d.ts +18 -0
- package/dist/lib/memory-store.d.ts.map +1 -0
- package/dist/lib/memory-store.js +34 -0
- package/dist/lib/memory-store.js.map +1 -0
- package/dist/lib/postgrest.d.ts +9 -0
- package/dist/lib/postgrest.d.ts.map +1 -0
- package/dist/lib/postgrest.js +169 -0
- package/dist/lib/postgrest.js.map +1 -0
- package/dist/lib/server-logger.d.ts +10 -0
- package/dist/lib/server-logger.d.ts.map +1 -0
- package/dist/lib/server-logger.js +36 -0
- package/dist/lib/server-logger.js.map +1 -0
- package/dist/lib/server-options.d.ts +52 -0
- package/dist/lib/server-options.d.ts.map +1 -0
- package/dist/lib/server-options.js +82 -0
- package/dist/lib/server-options.js.map +1 -0
- package/dist/lib/types.d.ts +3 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +3 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/memory-server/MemorySupabaseHttpServer.d.ts +24 -0
- package/dist/memory-server/MemorySupabaseHttpServer.d.ts.map +1 -0
- package/dist/memory-server/MemorySupabaseHttpServer.js +91 -0
- package/dist/memory-server/MemorySupabaseHttpServer.js.map +1 -0
- package/dist/memory-server/auth-routes.d.ts +3 -0
- package/dist/memory-server/auth-routes.d.ts.map +1 -0
- package/dist/memory-server/auth-routes.js +217 -0
- package/dist/memory-server/auth-routes.js.map +1 -0
- package/dist/memory-server/handler-context.d.ts +19 -0
- package/dist/memory-server/handler-context.d.ts.map +1 -0
- package/dist/memory-server/handler-context.js +3 -0
- package/dist/memory-server/handler-context.js.map +1 -0
- package/dist/memory-server/http-utils.d.ts +19 -0
- package/dist/memory-server/http-utils.d.ts.map +1 -0
- package/dist/memory-server/http-utils.js +109 -0
- package/dist/memory-server/http-utils.js.map +1 -0
- package/dist/memory-server/index.d.ts +4 -0
- package/dist/memory-server/index.d.ts.map +1 -0
- package/dist/memory-server/index.js +8 -0
- package/dist/memory-server/index.js.map +1 -0
- package/dist/memory-server/log-meta.d.ts +12 -0
- package/dist/memory-server/log-meta.d.ts.map +1 -0
- package/dist/memory-server/log-meta.js +58 -0
- package/dist/memory-server/log-meta.js.map +1 -0
- package/dist/memory-server/rest-routes.d.ts +3 -0
- package/dist/memory-server/rest-routes.d.ts.map +1 -0
- package/dist/memory-server/rest-routes.js +235 -0
- package/dist/memory-server/rest-routes.js.map +1 -0
- package/dist/memory-server/server-lifecycle.d.ts +19 -0
- package/dist/memory-server/server-lifecycle.d.ts.map +1 -0
- package/dist/memory-server/server-lifecycle.js +75 -0
- package/dist/memory-server/server-lifecycle.js.map +1 -0
- package/dist/memory-server/types.d.ts +33 -0
- package/dist/memory-server/types.d.ts.map +1 -0
- package/dist/memory-server/types.js +3 -0
- package/dist/memory-server/types.js.map +1 -0
- package/package.json +97 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemorySupabaseHttpServer = void 0;
|
|
4
|
+
const auth_memory_js_1 = require("../lib/auth-memory.js");
|
|
5
|
+
const memory_store_js_1 = require("../lib/memory-store.js");
|
|
6
|
+
const auth_routes_js_1 = require("./auth-routes.js");
|
|
7
|
+
const http_utils_js_1 = require("./http-utils.js");
|
|
8
|
+
const log_meta_js_1 = require("./log-meta.js");
|
|
9
|
+
const rest_routes_js_1 = require("./rest-routes.js");
|
|
10
|
+
/**
|
|
11
|
+
* HTTP application: validates `apikey`, then dispatches to auth or REST handlers.
|
|
12
|
+
* Owns {@link MemoryStore} and {@link AuthMemory} for the lifetime of the server.
|
|
13
|
+
*/
|
|
14
|
+
class MemorySupabaseHttpServer {
|
|
15
|
+
anonKey;
|
|
16
|
+
serviceRoleKey;
|
|
17
|
+
logger;
|
|
18
|
+
store = new memory_store_js_1.MemoryStore();
|
|
19
|
+
auth = new auth_memory_js_1.AuthMemory();
|
|
20
|
+
constructor(anonKey, serviceRoleKey, logger) {
|
|
21
|
+
this.anonKey = anonKey;
|
|
22
|
+
this.serviceRoleKey = serviceRoleKey;
|
|
23
|
+
this.logger = logger;
|
|
24
|
+
}
|
|
25
|
+
buildContext(req, res, requestId, logger) {
|
|
26
|
+
return {
|
|
27
|
+
req,
|
|
28
|
+
res,
|
|
29
|
+
auth: this.auth,
|
|
30
|
+
store: this.store,
|
|
31
|
+
serviceRoleKey: this.serviceRoleKey,
|
|
32
|
+
logger,
|
|
33
|
+
requestId,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Full request pipeline (OPTIONS, apikey check, auth routes, REST routes, 404).
|
|
38
|
+
*/
|
|
39
|
+
async handleRequest(req, res) {
|
|
40
|
+
const requestId = (0, log_meta_js_1.newHttpRequestId)();
|
|
41
|
+
const reqLogger = this.logger.child({ requestId });
|
|
42
|
+
let method = 'GET';
|
|
43
|
+
let path = '/';
|
|
44
|
+
try {
|
|
45
|
+
const url = new URL(req.url ?? '/', 'http://localhost');
|
|
46
|
+
path = (0, http_utils_js_1.normalizeRequestPath)(url);
|
|
47
|
+
method = req.method ?? 'GET';
|
|
48
|
+
const query = (0, log_meta_js_1.postgrestQueryForLog)(url.searchParams);
|
|
49
|
+
reqLogger.debug('Incoming request', { requestId, method, path, query });
|
|
50
|
+
if (method === 'OPTIONS') {
|
|
51
|
+
(0, http_utils_js_1.handleOptions)(res);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (!(0, http_utils_js_1.isAuthorizedProjectRequest)(req, this.anonKey, this.serviceRoleKey)) {
|
|
55
|
+
reqLogger.debug('Rejected request: missing or invalid apikey header', {
|
|
56
|
+
method,
|
|
57
|
+
path,
|
|
58
|
+
query,
|
|
59
|
+
});
|
|
60
|
+
(0, http_utils_js_1.sendUnauthorizedApiKey)(res);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const ctx = this.buildContext(req, res, requestId, reqLogger);
|
|
64
|
+
if (await (0, auth_routes_js_1.dispatchAuthRoutes)(ctx, path, method, url))
|
|
65
|
+
return;
|
|
66
|
+
if (await (0, rest_routes_js_1.dispatchRestRoutes)(ctx, path, method, url))
|
|
67
|
+
return;
|
|
68
|
+
reqLogger.debug('No route matched', { method, path, query });
|
|
69
|
+
(0, http_utils_js_1.sendJson)(res, 404, { message: 'Not found', path });
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
const err = e;
|
|
73
|
+
reqLogger.error('Unhandled error while handling HTTP request', {
|
|
74
|
+
message: err.message,
|
|
75
|
+
stack: err.stack,
|
|
76
|
+
});
|
|
77
|
+
(0, http_utils_js_1.sendJson)(res, 500, { message: err.message });
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
reqLogger.debug('Request finished', { requestId, method, path });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** For `http.createServer` — wraps async handler without floating promises. */
|
|
84
|
+
createNodeListener() {
|
|
85
|
+
return (req, res) => {
|
|
86
|
+
void this.handleRequest(req, res);
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.MemorySupabaseHttpServer = MemorySupabaseHttpServer;
|
|
91
|
+
//# sourceMappingURL=MemorySupabaseHttpServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemorySupabaseHttpServer.js","sourceRoot":"","sources":["../../src/memory-server/MemorySupabaseHttpServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-routes.d.ts","sourceRoot":"","sources":["../../src/memory-server/auth-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAiBzE,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,4BAA4B,EACjC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,OAAO,CAAC,CA0BlB"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.dispatchAuthRoutes = dispatchAuthRoutes;
|
|
4
|
+
const http_utils_js_1 = require("./http-utils.js");
|
|
5
|
+
const log_meta_js_1 = require("./log-meta.js");
|
|
6
|
+
function userMetadataFromBody(body) {
|
|
7
|
+
return typeof body.data === 'object' && body.data != null
|
|
8
|
+
? body.data
|
|
9
|
+
: {};
|
|
10
|
+
}
|
|
11
|
+
async function dispatchAuthRoutes(ctx, path, method, url) {
|
|
12
|
+
const { logger } = ctx;
|
|
13
|
+
if (path === '/auth/v1/admin/users' && method === 'GET') {
|
|
14
|
+
handleAdminListUsers(ctx, url);
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
if (path === '/auth/v1/signup' && method === 'POST') {
|
|
18
|
+
await handleSignup(ctx);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
if (path === '/auth/v1/token' && method === 'POST') {
|
|
22
|
+
await handleToken(ctx, url);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
if (path === '/auth/v1/logout' && method === 'POST') {
|
|
26
|
+
handleLogout(ctx);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
if (path === '/auth/v1/user' && method === 'GET') {
|
|
30
|
+
handleGetUser(ctx);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
if (path.startsWith('/auth/')) {
|
|
34
|
+
logger.debug('Auth path not handled by mock', { path, method });
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
function handleAdminListUsers(ctx, url) {
|
|
39
|
+
const { res, auth, serviceRoleKey, logger } = ctx;
|
|
40
|
+
if (!(0, http_utils_js_1.isServiceRoleRequest)(ctx.req, serviceRoleKey)) {
|
|
41
|
+
logger.warn('Auth admin listUsers denied: service role key required');
|
|
42
|
+
(0, http_utils_js_1.sendJson)(res, 403, {
|
|
43
|
+
error: 'not_admin',
|
|
44
|
+
message: 'Admin API requires the service role key',
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const allUsers = auth.listUsers();
|
|
49
|
+
const pageRaw = Number.parseInt(url.searchParams.get('page') ?? '1', 10);
|
|
50
|
+
const page = Math.max(1, Number.isNaN(pageRaw) ? 1 : pageRaw);
|
|
51
|
+
const perRaw = Number.parseInt(url.searchParams.get('per_page') ?? '50', 10);
|
|
52
|
+
const perPage = Math.min(1000, Math.max(1, Number.isNaN(perRaw) ? 50 : perRaw));
|
|
53
|
+
const start = (page - 1) * perPage;
|
|
54
|
+
const users = allUsers.slice(start, start + perPage);
|
|
55
|
+
(0, http_utils_js_1.setCors)(res);
|
|
56
|
+
res.setHeader('Content-Type', 'application/json');
|
|
57
|
+
res.setHeader('x-total-count', String(allUsers.length));
|
|
58
|
+
res.writeHead(200);
|
|
59
|
+
res.end(JSON.stringify({ users }));
|
|
60
|
+
logger.debug('Auth admin listUsers', {
|
|
61
|
+
page,
|
|
62
|
+
perPage,
|
|
63
|
+
totalUsers: allUsers.length,
|
|
64
|
+
returnedUsers: users.length,
|
|
65
|
+
userIds: users.map((u) => u.id),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async function handleSignup(ctx) {
|
|
69
|
+
const { req, res, auth, logger } = ctx;
|
|
70
|
+
const raw = await (0, http_utils_js_1.readBody)(req);
|
|
71
|
+
const body = (0, http_utils_js_1.parseJsonBody)(raw);
|
|
72
|
+
try {
|
|
73
|
+
let session;
|
|
74
|
+
if (typeof body.email === 'string' && typeof body.password === 'string') {
|
|
75
|
+
session = auth.signUpEmail(body.email, body.password, userMetadataFromBody(body));
|
|
76
|
+
}
|
|
77
|
+
else if (typeof body.phone === 'string' && typeof body.password === 'string') {
|
|
78
|
+
session = auth.signUpPhone(body.phone, body.password, userMetadataFromBody(body));
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
logger.debug('Auth signup rejected: missing email/phone or password', {
|
|
82
|
+
bodyKeys: Object.keys(body),
|
|
83
|
+
body: (0, log_meta_js_1.redactAuthJsonForLog)(body),
|
|
84
|
+
});
|
|
85
|
+
(0, http_utils_js_1.sendJson)(res, 400, {
|
|
86
|
+
error: 'invalid_request',
|
|
87
|
+
error_description: 'email or phone and password required',
|
|
88
|
+
});
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
logger.debug('Auth signup succeeded', {
|
|
92
|
+
channel: typeof body.email === 'string' ? 'email' : 'phone',
|
|
93
|
+
userId: session.user.id,
|
|
94
|
+
body: (0, log_meta_js_1.redactAuthJsonForLog)(body),
|
|
95
|
+
});
|
|
96
|
+
(0, http_utils_js_1.sendJson)(res, 200, session);
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
const err = e;
|
|
100
|
+
const status = err.status ?? 500;
|
|
101
|
+
if (status >= 500) {
|
|
102
|
+
logger.error('Auth signup failed', {
|
|
103
|
+
message: err.message,
|
|
104
|
+
status,
|
|
105
|
+
body: (0, log_meta_js_1.redactAuthJsonForLog)(body),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
logger.debug('Auth signup rejected', {
|
|
110
|
+
message: err.message,
|
|
111
|
+
status,
|
|
112
|
+
body: (0, log_meta_js_1.redactAuthJsonForLog)(body),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
(0, http_utils_js_1.sendJson)(res, status, {
|
|
116
|
+
error: 'signup_failed',
|
|
117
|
+
msg: err.message,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function handleToken(ctx, url) {
|
|
122
|
+
const { req, res, auth, logger } = ctx;
|
|
123
|
+
const grant = url.searchParams.get('grant_type');
|
|
124
|
+
const raw = await (0, http_utils_js_1.readBody)(req);
|
|
125
|
+
const body = (0, http_utils_js_1.parseJsonBody)(raw);
|
|
126
|
+
try {
|
|
127
|
+
if (grant === 'password') {
|
|
128
|
+
let session;
|
|
129
|
+
if (typeof body.email === 'string' && typeof body.password === 'string') {
|
|
130
|
+
session = auth.signInEmail(body.email, body.password);
|
|
131
|
+
}
|
|
132
|
+
else if (typeof body.phone === 'string' && typeof body.password === 'string') {
|
|
133
|
+
session = auth.signInPhone(body.phone, body.password);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
logger.debug('Auth token password grant: missing credentials fields', {
|
|
137
|
+
body: (0, log_meta_js_1.redactAuthJsonForLog)(body),
|
|
138
|
+
});
|
|
139
|
+
(0, http_utils_js_1.sendJson)(res, 400, { error: 'invalid_grant', error_description: 'Missing fields' });
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
logger.debug('Auth token password grant succeeded', {
|
|
143
|
+
channel: typeof body.email === 'string' ? 'email' : 'phone',
|
|
144
|
+
userId: session.user.id,
|
|
145
|
+
body: (0, log_meta_js_1.redactAuthJsonForLog)(body),
|
|
146
|
+
});
|
|
147
|
+
(0, http_utils_js_1.sendJson)(res, 200, session);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (grant === 'refresh_token' && typeof body.refresh_token === 'string') {
|
|
151
|
+
const session = auth.refreshSession(body.refresh_token);
|
|
152
|
+
logger.debug('Auth token refresh succeeded', { body: (0, log_meta_js_1.redactAuthJsonForLog)(body) });
|
|
153
|
+
(0, http_utils_js_1.sendJson)(res, 200, session);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
logger.debug('Auth token unsupported or invalid grant_type', {
|
|
157
|
+
grant_type: grant,
|
|
158
|
+
body: (0, log_meta_js_1.redactAuthJsonForLog)(body),
|
|
159
|
+
});
|
|
160
|
+
(0, http_utils_js_1.sendJson)(res, 400, {
|
|
161
|
+
error: 'unsupported_grant_type',
|
|
162
|
+
error_description: String(grant),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
const err = e;
|
|
167
|
+
const status = err.status ?? 500;
|
|
168
|
+
if (status >= 500) {
|
|
169
|
+
logger.error('Auth token endpoint failed', {
|
|
170
|
+
message: err.message,
|
|
171
|
+
status,
|
|
172
|
+
grant_type: grant,
|
|
173
|
+
body: (0, log_meta_js_1.redactAuthJsonForLog)(body),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
logger.debug('Auth token rejected', {
|
|
178
|
+
message: err.message,
|
|
179
|
+
status,
|
|
180
|
+
grant_type: grant,
|
|
181
|
+
body: (0, log_meta_js_1.redactAuthJsonForLog)(body),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
(0, http_utils_js_1.sendJson)(res, status, {
|
|
185
|
+
error: 'invalid_grant',
|
|
186
|
+
error_description: err.message,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function handleLogout(ctx) {
|
|
191
|
+
ctx.logger.debug('Auth logout');
|
|
192
|
+
(0, http_utils_js_1.sendEmpty)(ctx.res, 204);
|
|
193
|
+
}
|
|
194
|
+
function handleGetUser(ctx) {
|
|
195
|
+
const { req, res, auth, logger } = ctx;
|
|
196
|
+
const h = req.headers.authorization;
|
|
197
|
+
const token = h?.startsWith('Bearer ') ? h.slice(7) : undefined;
|
|
198
|
+
if (!token) {
|
|
199
|
+
logger.debug('Auth getUser: no Bearer token');
|
|
200
|
+
(0, http_utils_js_1.sendJson)(res, 403, { error: 'invalid_jwt', msg: 'No token' });
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
const user = auth.getUserFromAccessToken(token);
|
|
205
|
+
logger.debug('Auth getUser succeeded', { userId: user.id, userEmail: user.email });
|
|
206
|
+
(0, http_utils_js_1.sendJson)(res, 200, { user });
|
|
207
|
+
}
|
|
208
|
+
catch (e) {
|
|
209
|
+
const err = e;
|
|
210
|
+
logger.debug('Auth getUser rejected', {
|
|
211
|
+
message: err.message,
|
|
212
|
+
tokenPrefix: `${token.slice(0, 12)}…`,
|
|
213
|
+
});
|
|
214
|
+
(0, http_utils_js_1.sendJson)(res, err.status ?? 403, { error: 'invalid_jwt', msg: err.message });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=auth-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-routes.js","sourceRoot":"","sources":["../../src/memory-server/auth-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import type { Logger } from 'winston';
|
|
3
|
+
import type { AuthMemory } from '../lib/auth-memory.js';
|
|
4
|
+
import type { MemoryStore } from '../lib/memory-store.js';
|
|
5
|
+
/**
|
|
6
|
+
* Per-request inputs plus shared server state for route handlers.
|
|
7
|
+
*/
|
|
8
|
+
export interface MemorySupabaseHandlerContext {
|
|
9
|
+
req: IncomingMessage;
|
|
10
|
+
res: ServerResponse;
|
|
11
|
+
auth: AuthMemory;
|
|
12
|
+
store: MemoryStore;
|
|
13
|
+
serviceRoleKey: string;
|
|
14
|
+
/** Winston logger; `debug` level enabled when the server was started with `debug: true`. */
|
|
15
|
+
logger: Logger;
|
|
16
|
+
/** Same id as in `Incoming request` / `Request finished` logs (also on `logger` defaultMeta). */
|
|
17
|
+
requestId: string;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=handler-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-context.d.ts","sourceRoot":"","sources":["../../src/memory-server/handler-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,EAAE,cAAc,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,4FAA4F;IAC5F,MAAM,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-context.js","sourceRoot":"","sources":["../../src/memory-server/handler-context.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
export declare function setCors(res: ServerResponse): void;
|
|
3
|
+
export declare function readBody(req: IncomingMessage): Promise<string>;
|
|
4
|
+
export declare function sendJson(res: ServerResponse, status: number, body: unknown): void;
|
|
5
|
+
export declare function sendEmpty(res: ServerResponse, status: number): void;
|
|
6
|
+
export declare function handleOptions(res: ServerResponse): void;
|
|
7
|
+
export declare function sendUnauthorizedApiKey(res: ServerResponse): void;
|
|
8
|
+
export declare function preferHeader(req: IncomingMessage): string;
|
|
9
|
+
export declare function preferReturnRepresentation(req: IncomingMessage): boolean;
|
|
10
|
+
export declare function preferResolution(req: IncomingMessage): 'merge' | 'ignore';
|
|
11
|
+
export declare function isUpsertRequest(req: IncomingMessage): boolean;
|
|
12
|
+
export declare function preferCount(req: IncomingMessage): boolean;
|
|
13
|
+
export declare function isObjectAccept(req: IncomingMessage): boolean;
|
|
14
|
+
export declare function parseJsonBody(raw: string): unknown;
|
|
15
|
+
export declare function isAuthorizedProjectRequest(req: IncomingMessage, anonKey: string, serviceRoleKey: string): boolean;
|
|
16
|
+
export declare function isServiceRoleRequest(req: IncomingMessage, serviceRoleKey: string): boolean;
|
|
17
|
+
/** Normalized pathname without trailing slash (except root). */
|
|
18
|
+
export declare function normalizeRequestPath(url: URL): string;
|
|
19
|
+
//# sourceMappingURL=http-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-utils.d.ts","sourceRoot":"","sources":["../../src/memory-server/http-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,wBAAgB,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAIjD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAS9D;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAKjF;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAInE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAIvD;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAKhE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAIzD;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAExE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,GAAG,QAAQ,CAIzE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAG7D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAGzD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAI5D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,OAAO,CAIT;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAM1F;AAED,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setCors = setCors;
|
|
4
|
+
exports.readBody = readBody;
|
|
5
|
+
exports.sendJson = sendJson;
|
|
6
|
+
exports.sendEmpty = sendEmpty;
|
|
7
|
+
exports.handleOptions = handleOptions;
|
|
8
|
+
exports.sendUnauthorizedApiKey = sendUnauthorizedApiKey;
|
|
9
|
+
exports.preferHeader = preferHeader;
|
|
10
|
+
exports.preferReturnRepresentation = preferReturnRepresentation;
|
|
11
|
+
exports.preferResolution = preferResolution;
|
|
12
|
+
exports.isUpsertRequest = isUpsertRequest;
|
|
13
|
+
exports.preferCount = preferCount;
|
|
14
|
+
exports.isObjectAccept = isObjectAccept;
|
|
15
|
+
exports.parseJsonBody = parseJsonBody;
|
|
16
|
+
exports.isAuthorizedProjectRequest = isAuthorizedProjectRequest;
|
|
17
|
+
exports.isServiceRoleRequest = isServiceRoleRequest;
|
|
18
|
+
exports.normalizeRequestPath = normalizeRequestPath;
|
|
19
|
+
const http_headers_js_1 = require("../lib/http-headers.js");
|
|
20
|
+
function setCors(res) {
|
|
21
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
22
|
+
res.setHeader('Access-Control-Allow-Headers', '*');
|
|
23
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET,HEAD,POST,PATCH,DELETE,OPTIONS');
|
|
24
|
+
}
|
|
25
|
+
function readBody(req) {
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
const chunks = [];
|
|
28
|
+
req.on('data', (c) => chunks.push(c));
|
|
29
|
+
req.on('end', () => {
|
|
30
|
+
resolve(Buffer.concat(chunks).toString('utf8'));
|
|
31
|
+
});
|
|
32
|
+
req.on('error', reject);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function sendJson(res, status, body) {
|
|
36
|
+
setCors(res);
|
|
37
|
+
res.setHeader('Content-Type', 'application/json');
|
|
38
|
+
res.writeHead(status);
|
|
39
|
+
res.end(JSON.stringify(body));
|
|
40
|
+
}
|
|
41
|
+
function sendEmpty(res, status) {
|
|
42
|
+
setCors(res);
|
|
43
|
+
res.writeHead(status);
|
|
44
|
+
res.end();
|
|
45
|
+
}
|
|
46
|
+
function handleOptions(res) {
|
|
47
|
+
setCors(res);
|
|
48
|
+
res.writeHead(204);
|
|
49
|
+
res.end();
|
|
50
|
+
}
|
|
51
|
+
function sendUnauthorizedApiKey(res) {
|
|
52
|
+
sendJson(res, 401, {
|
|
53
|
+
message: 'Missing or invalid apikey',
|
|
54
|
+
hint: 'Send header apikey with your anon or service_role key (see SUPABASE_ANON_KEY / SUPABASE_SERVICE_ROLE_KEY).',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function preferHeader(req) {
|
|
58
|
+
const h = req.headers.prefer;
|
|
59
|
+
if (h === undefined)
|
|
60
|
+
return '';
|
|
61
|
+
return Array.isArray(h) ? h.join(', ') : h;
|
|
62
|
+
}
|
|
63
|
+
function preferReturnRepresentation(req) {
|
|
64
|
+
return preferHeader(req).toLowerCase().includes('return=representation');
|
|
65
|
+
}
|
|
66
|
+
function preferResolution(req) {
|
|
67
|
+
const p = preferHeader(req);
|
|
68
|
+
if (p.includes('resolution=ignore-duplicates'))
|
|
69
|
+
return 'ignore';
|
|
70
|
+
return 'merge';
|
|
71
|
+
}
|
|
72
|
+
function isUpsertRequest(req) {
|
|
73
|
+
const p = preferHeader(req).toLowerCase();
|
|
74
|
+
return p.includes('resolution=merge-duplicates') || p.includes('resolution=ignore-duplicates');
|
|
75
|
+
}
|
|
76
|
+
function preferCount(req) {
|
|
77
|
+
const p = preferHeader(req);
|
|
78
|
+
return p.length > 0 && /count=(exact|planned|estimated)/i.test(p);
|
|
79
|
+
}
|
|
80
|
+
function isObjectAccept(req) {
|
|
81
|
+
const a = req.headers.accept;
|
|
82
|
+
const s = a === undefined ? '' : Array.isArray(a) ? a.join(', ') : a;
|
|
83
|
+
return s.includes('application/vnd.pgrst.object+json');
|
|
84
|
+
}
|
|
85
|
+
function parseJsonBody(raw) {
|
|
86
|
+
if (!raw || raw.trim() === '')
|
|
87
|
+
return null;
|
|
88
|
+
return JSON.parse(raw);
|
|
89
|
+
}
|
|
90
|
+
function isAuthorizedProjectRequest(req, anonKey, serviceRoleKey) {
|
|
91
|
+
const apikey = (0, http_headers_js_1.getIncomingHeader)(req, 'apikey');
|
|
92
|
+
if (!apikey)
|
|
93
|
+
return false;
|
|
94
|
+
return apikey === anonKey || apikey === serviceRoleKey;
|
|
95
|
+
}
|
|
96
|
+
function isServiceRoleRequest(req, serviceRoleKey) {
|
|
97
|
+
const apikey = (0, http_headers_js_1.getIncomingHeader)(req, 'apikey');
|
|
98
|
+
if (apikey === serviceRoleKey)
|
|
99
|
+
return true;
|
|
100
|
+
const auth = (0, http_headers_js_1.getIncomingHeader)(req, 'authorization');
|
|
101
|
+
if (auth?.startsWith('Bearer ') && auth.slice('Bearer '.length) === serviceRoleKey)
|
|
102
|
+
return true;
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
/** Normalized pathname without trailing slash (except root). */
|
|
106
|
+
function normalizeRequestPath(url) {
|
|
107
|
+
return url.pathname.replace(/\/$/, '') || '/';
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=http-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-utils.js","sourceRoot":"","sources":["../../src/memory-server/http-utils.ts"],"names":[],"mappings":";;AAIA,0BAIC;AAED,4BASC;AAED,4BAKC;AAED,8BAIC;AAED,sCAIC;AAED,wDAKC;AAED,oCAIC;AAED,gEAEC;AAED,4CAIC;AAED,0CAGC;AAED,kCAGC;AAED,wCAIC;AAED,sCAGC;AAED,gEAQC;AAED,oDAMC;AAGD,oDAEC;AAvGD,4DAA2D;AAE3D,SAAgB,OAAO,CAAC,GAAmB;IACzC,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;IACnD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,oCAAoC,CAAC,CAAC;AACtF,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAoB;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAW,CAAC,CAAC,CAAC;QAChD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;IACzE,OAAO,CAAC,GAAG,CAAC,CAAC;IACb,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAClD,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,SAAS,CAAC,GAAmB,EAAE,MAAc;IAC3D,OAAO,CAAC,GAAG,CAAC,CAAC;IACb,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,GAAG,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,aAAa,CAAC,GAAmB;IAC/C,OAAO,CAAC,GAAG,CAAC,CAAC;IACb,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACnB,GAAG,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,sBAAsB,CAAC,GAAmB;IACxD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE;QACjB,OAAO,EAAE,2BAA2B;QACpC,IAAI,EAAE,4GAA4G;KACnH,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,YAAY,CAAC,GAAoB;IAC/C,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,0BAA0B,CAAC,GAAoB;IAC7D,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;AAC3E,CAAC;AAED,SAAgB,gBAAgB,CAAC,GAAoB;IACnD,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAAE,OAAO,QAAQ,CAAC;IAChE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,eAAe,CAAC,GAAoB;IAClD,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,OAAO,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;AACjG,CAAC;AAED,SAAgB,WAAW,CAAC,GAAoB;IAC9C,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,kCAAkC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,cAAc,CAAC,GAAoB;IACjD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC;AACzD,CAAC;AAED,SAAgB,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;AACpC,CAAC;AAED,SAAgB,0BAA0B,CACxC,GAAoB,EACpB,OAAe,EACf,cAAsB;IAEtB,MAAM,MAAM,GAAG,IAAA,mCAAiB,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,cAAc,CAAC;AACzD,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAoB,EAAE,cAAsB;IAC/E,MAAM,MAAM,GAAG,IAAA,mCAAiB,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChD,IAAI,MAAM,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAA,mCAAiB,EAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACrD,IAAI,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IAChG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gEAAgE;AAChE,SAAgB,oBAAoB,CAAC,GAAQ;IAC3C,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory-server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMemorySupabaseServer = exports.MemorySupabaseHttpServer = void 0;
|
|
4
|
+
var MemorySupabaseHttpServer_js_1 = require("./MemorySupabaseHttpServer.js");
|
|
5
|
+
Object.defineProperty(exports, "MemorySupabaseHttpServer", { enumerable: true, get: function () { return MemorySupabaseHttpServer_js_1.MemorySupabaseHttpServer; } });
|
|
6
|
+
var server_lifecycle_js_1 = require("./server-lifecycle.js");
|
|
7
|
+
Object.defineProperty(exports, "createMemorySupabaseServer", { enumerable: true, get: function () { return server_lifecycle_js_1.createMemorySupabaseServer; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory-server/index.ts"],"names":[],"mappings":";;;AAAA,6EAAyE;AAAhE,uIAAA,wBAAwB,OAAA;AACjC,6DAAmE;AAA1D,iIAAA,0BAA0B,OAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { JsonRecord } from '../lib/types.js';
|
|
2
|
+
/** 10-character hex id for correlating start/finish logs for one HTTP request. */
|
|
3
|
+
export declare function newHttpRequestId(): string;
|
|
4
|
+
/** PostgREST query string as ordered pairs (duplicate keys preserved). */
|
|
5
|
+
export declare function postgrestQueryForLog(params: URLSearchParams): [string, string][];
|
|
6
|
+
/**
|
|
7
|
+
* Shallow + one-level nested redaction for auth JSON bodies (never log raw secrets in debug).
|
|
8
|
+
*/
|
|
9
|
+
export declare function redactAuthJsonForLog(body: Record<string, unknown>): Record<string, unknown>;
|
|
10
|
+
/** Truncate large row arrays in debug metadata while keeping shape visible. */
|
|
11
|
+
export declare function restRowsForLog(rows: JsonRecord[], maxItems?: number): unknown;
|
|
12
|
+
//# sourceMappingURL=log-meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-meta.d.ts","sourceRoot":"","sources":["../../src/memory-server/log-meta.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,kFAAkF;AAClF,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAEhF;AAUD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmB3F;AAID,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,SAA0B,GAAG,OAAO,CAO9F"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.newHttpRequestId = newHttpRequestId;
|
|
4
|
+
exports.postgrestQueryForLog = postgrestQueryForLog;
|
|
5
|
+
exports.redactAuthJsonForLog = redactAuthJsonForLog;
|
|
6
|
+
exports.restRowsForLog = restRowsForLog;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
/** 10-character hex id for correlating start/finish logs for one HTTP request. */
|
|
9
|
+
function newHttpRequestId() {
|
|
10
|
+
return (0, node_crypto_1.randomBytes)(5).toString('hex');
|
|
11
|
+
}
|
|
12
|
+
/** PostgREST query string as ordered pairs (duplicate keys preserved). */
|
|
13
|
+
function postgrestQueryForLog(params) {
|
|
14
|
+
return [...params.entries()];
|
|
15
|
+
}
|
|
16
|
+
const SECRET_BODY_KEYS = new Set([
|
|
17
|
+
'password',
|
|
18
|
+
'refresh_token',
|
|
19
|
+
'access_token',
|
|
20
|
+
'service_role',
|
|
21
|
+
'apikey',
|
|
22
|
+
]);
|
|
23
|
+
/**
|
|
24
|
+
* Shallow + one-level nested redaction for auth JSON bodies (never log raw secrets in debug).
|
|
25
|
+
*/
|
|
26
|
+
function redactAuthJsonForLog(body) {
|
|
27
|
+
const out = {};
|
|
28
|
+
for (const [key, value] of Object.entries(body)) {
|
|
29
|
+
if (SECRET_BODY_KEYS.has(key.toLowerCase())) {
|
|
30
|
+
out[key] = '[redacted]';
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
34
|
+
const nested = value;
|
|
35
|
+
const nestedOut = {};
|
|
36
|
+
for (const [nk, nv] of Object.entries(nested)) {
|
|
37
|
+
nestedOut[nk] = SECRET_BODY_KEYS.has(nk.toLowerCase()) ? '[redacted]' : nv;
|
|
38
|
+
}
|
|
39
|
+
out[key] = nestedOut;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
out[key] = value;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
const DEFAULT_MAX_ARRAY_ITEMS = 80;
|
|
48
|
+
/** Truncate large row arrays in debug metadata while keeping shape visible. */
|
|
49
|
+
function restRowsForLog(rows, maxItems = DEFAULT_MAX_ARRAY_ITEMS) {
|
|
50
|
+
if (rows.length <= maxItems)
|
|
51
|
+
return rows;
|
|
52
|
+
return {
|
|
53
|
+
truncated: true,
|
|
54
|
+
totalRows: rows.length,
|
|
55
|
+
sample: rows.slice(0, maxItems),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=log-meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-meta.js","sourceRoot":"","sources":["../../src/memory-server/log-meta.ts"],"names":[],"mappings":";;AAKA,4CAEC;AAGD,oDAEC;AAaD,oDAmBC;AAKD,wCAOC;AAxDD,6CAA0C;AAI1C,kFAAkF;AAClF,SAAgB,gBAAgB;IAC9B,OAAO,IAAA,yBAAW,EAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,0EAA0E;AAC1E,SAAgB,oBAAoB,CAAC,MAAuB;IAC1D,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,UAAU;IACV,eAAe;IACf,cAAc;IACd,cAAc;IACd,QAAQ;CACT,CAAC,CAAC;AAEH;;GAEG;AACH,SAAgB,oBAAoB,CAAC,IAA6B;IAChE,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;YACxB,SAAS;QACX,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE,MAAM,MAAM,GAAG,KAAgC,CAAC;YAChD,MAAM,SAAS,GAA4B,EAAE,CAAC;YAC9C,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,SAAS,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,+EAA+E;AAC/E,SAAgB,cAAc,CAAC,IAAkB,EAAE,QAAQ,GAAG,uBAAuB;IACnF,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO;QACL,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,MAAM;QACtB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;KAChC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest-routes.d.ts","sourceRoot":"","sources":["../../src/memory-server/rest-routes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAiBzE,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,4BAA4B,EACjC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,OAAO,CAAC,CA0BlB"}
|