@puffle/cookiejar 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.
@@ -0,0 +1,139 @@
1
+ import readline from 'node:readline';
2
+ const TOOLS = [
3
+ {
4
+ name: 'describe_bundle',
5
+ description: 'Describe the cookie bundle this session can use: its name, the hosts it is authenticated for, and what the token is allowed to do.',
6
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
7
+ },
8
+ {
9
+ name: 'get_cookie_header',
10
+ description: 'Return the Cookie header value to send with a request to a URL covered by the bundle. Use this when you want to make the request yourself.',
11
+ inputSchema: {
12
+ type: 'object',
13
+ properties: { url: { type: 'string', description: 'Absolute URL the header will be sent to.' } },
14
+ required: ['url'],
15
+ additionalProperties: false,
16
+ },
17
+ },
18
+ {
19
+ name: 'export_cookies',
20
+ description: 'Export the bundle as a cookie jar. Formats: "netscape" (curl -b / yt-dlp / python-requests), "storage-state" (Playwright/Puppeteer), "json".',
21
+ inputSchema: {
22
+ type: 'object',
23
+ properties: { format: { type: 'string', enum: ['netscape', 'storage-state', 'json'] } },
24
+ required: ['format'],
25
+ additionalProperties: false,
26
+ },
27
+ },
28
+ {
29
+ name: 'http_request',
30
+ description: 'Perform an HTTP request against a host in the bundle with its cookies attached, without ever exposing the cookie values.',
31
+ inputSchema: {
32
+ type: 'object',
33
+ properties: {
34
+ url: { type: 'string' },
35
+ method: { type: 'string', default: 'GET' },
36
+ headers: { type: 'object', additionalProperties: { type: 'string' } },
37
+ body: { type: 'string' },
38
+ },
39
+ required: ['url'],
40
+ additionalProperties: false,
41
+ },
42
+ },
43
+ ];
44
+ export function runMcpServer(options) {
45
+ const input = options.stdin ?? process.stdin;
46
+ const output = options.stdout ?? process.stdout;
47
+ const rl = readline.createInterface({ input, crlfDelay: Infinity });
48
+ let inFlight = 0;
49
+ let closed = false;
50
+ const maybeExit = () => {
51
+ if (closed && inFlight === 0)
52
+ process.exit(0);
53
+ };
54
+ const write = (message) => {
55
+ output.write(`${JSON.stringify(message)}\n`);
56
+ };
57
+ const call = async (path, init) => {
58
+ const response = await fetch(new URL(path, options.daemonUrl), {
59
+ ...init,
60
+ headers: { ...(init?.headers ?? {}), authorization: `Bearer ${options.token}`, 'content-type': 'application/json' },
61
+ });
62
+ const text = await response.text();
63
+ if (!response.ok)
64
+ throw new Error(`cookiejar daemon: ${response.status} ${text}`);
65
+ return text;
66
+ };
67
+ const runTool = async (name, args) => {
68
+ switch (name) {
69
+ case 'describe_bundle':
70
+ return call('/agent/bundle');
71
+ case 'get_cookie_header':
72
+ return call(`/agent/cookies?format=header&url=${encodeURIComponent(String(args.url))}`);
73
+ case 'export_cookies':
74
+ return call(`/agent/cookies?format=${encodeURIComponent(String(args.format))}`);
75
+ case 'http_request':
76
+ return call('/agent/fetch', { method: 'POST', body: JSON.stringify(args) });
77
+ default:
78
+ throw new Error(`unknown tool: ${name}`);
79
+ }
80
+ };
81
+ rl.on('line', (line) => {
82
+ if (!line.trim())
83
+ return;
84
+ let request;
85
+ try {
86
+ request = JSON.parse(line);
87
+ }
88
+ catch {
89
+ return;
90
+ }
91
+ const reply = (result) => {
92
+ if (request.id === undefined)
93
+ return;
94
+ write({ jsonrpc: '2.0', id: request.id, result });
95
+ };
96
+ const fail = (message) => {
97
+ if (request.id === undefined)
98
+ return;
99
+ write({ jsonrpc: '2.0', id: request.id, error: { code: -32000, message } });
100
+ };
101
+ switch (request.method) {
102
+ case 'initialize':
103
+ reply({
104
+ protocolVersion: '2024-11-05',
105
+ capabilities: { tools: {} },
106
+ serverInfo: { name: 'cookiejar', version: '0.1.0' },
107
+ });
108
+ return;
109
+ case 'notifications/initialized':
110
+ return;
111
+ case 'ping':
112
+ reply({});
113
+ return;
114
+ case 'tools/list':
115
+ reply({ tools: TOOLS });
116
+ return;
117
+ case 'tools/call': {
118
+ const params = (request.params ?? {});
119
+ inFlight += 1;
120
+ void runTool(params.name ?? '', params.arguments ?? {})
121
+ .then((text) => reply({ content: [{ type: 'text', text }] }))
122
+ .catch((error) => reply({ content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }], isError: true }))
123
+ .finally(() => {
124
+ inFlight -= 1;
125
+ maybeExit();
126
+ });
127
+ return;
128
+ }
129
+ default:
130
+ fail(`unsupported method: ${request.method}`);
131
+ }
132
+ });
133
+ // Finish any tool call already in flight before shutting down.
134
+ rl.on('close', () => {
135
+ closed = true;
136
+ maybeExit();
137
+ });
138
+ }
139
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,442 @@
1
+ import http from 'node:http';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import crypto from 'node:crypto';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { Vault, newBundleId, BadPasswordError, VaultLockedError } from '../core/vault.js';
7
+ import { audit, readAudit } from '../core/audit.js';
8
+ import { hashToken, newToken } from '../core/crypto.js';
9
+ import { readAllProfiles, toMeta } from '../core/browsers/index.js';
10
+ import { bareDomain, cookieHeaderFor, domainCovers, isExpired, resolveBundle, toNetscape, toStorageState, } from '../core/bundles.js';
11
+ import { AccessDeniedError, authorize, noteUse } from '../core/access.js';
12
+ import { bearerToken, originAllowed, parseCookies, readJsonBody, sendJson } from './util.js';
13
+ const SESSION_COOKIE = 'cjr_session';
14
+ const MIME = {
15
+ '.html': 'text/html; charset=utf-8',
16
+ '.js': 'text/javascript; charset=utf-8',
17
+ '.css': 'text/css; charset=utf-8',
18
+ '.svg': 'image/svg+xml',
19
+ '.woff2': 'font/woff2',
20
+ '.png': 'image/png',
21
+ '.ico': 'image/x-icon',
22
+ };
23
+ export function createServer(options) {
24
+ const vault = new Vault();
25
+ const port = options.port;
26
+ const uiDir = options.uiDir ?? path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'ui');
27
+ const autoLockMs = (options.autoLockMinutes ?? 30) * 60_000;
28
+ let session = null;
29
+ const expireSession = () => {
30
+ if (!session)
31
+ return;
32
+ if (autoLockMs > 0 && Date.now() - session.lastSeen > autoLockMs) {
33
+ session = null;
34
+ vault.lock();
35
+ }
36
+ };
37
+ const hasSession = (req) => {
38
+ expireSession();
39
+ const token = parseCookies(req.headers.cookie)[SESSION_COOKIE];
40
+ if (!session || !token || token !== session.token)
41
+ return false;
42
+ session.lastSeen = Date.now();
43
+ return vault.unlocked;
44
+ };
45
+ const startSession = (res) => {
46
+ session = { token: crypto.randomBytes(32).toString('base64url'), lastSeen: Date.now() };
47
+ res.setHeader('set-cookie', `${SESSION_COOKIE}=${session.token}; Path=/; HttpOnly; SameSite=Strict`);
48
+ };
49
+ const publicBundle = (bundle) => ({
50
+ ...bundle,
51
+ grants: bundle.grants.map(({ tokenHash, ...rest }) => ({ ...rest, id: tokenHash.slice(0, 12), tokenHash })),
52
+ });
53
+ async function handleUiApi(req, res, url) {
54
+ const method = req.method ?? 'GET';
55
+ const route = url.pathname;
56
+ if (route === '/api/state') {
57
+ sendJson(res, 200, {
58
+ vaultExists: vault.exists,
59
+ unlocked: hasSession(req),
60
+ platform: process.platform,
61
+ autoLockMinutes: options.autoLockMinutes ?? 30,
62
+ });
63
+ return true;
64
+ }
65
+ if (route === '/api/vault/create' && method === 'POST') {
66
+ const { password } = await readJsonBody(req);
67
+ if (!password || password.length < 8) {
68
+ sendJson(res, 400, { error: 'master password must be at least 8 characters' });
69
+ return true;
70
+ }
71
+ vault.create(password);
72
+ startSession(res);
73
+ audit({ event: 'unlock', detail: 'vault created' });
74
+ sendJson(res, 200, { ok: true });
75
+ return true;
76
+ }
77
+ if (route === '/api/vault/unlock' && method === 'POST') {
78
+ const { password } = await readJsonBody(req);
79
+ try {
80
+ vault.unlock(password ?? '');
81
+ }
82
+ catch (error) {
83
+ audit({ event: 'unlock_failed' });
84
+ sendJson(res, 401, { error: error instanceof BadPasswordError ? 'wrong master password' : String(error) });
85
+ return true;
86
+ }
87
+ startSession(res);
88
+ audit({ event: 'unlock' });
89
+ sendJson(res, 200, { ok: true });
90
+ return true;
91
+ }
92
+ if (route === '/api/vault/lock' && method === 'POST') {
93
+ session = null;
94
+ vault.lock();
95
+ sendJson(res, 200, { ok: true });
96
+ return true;
97
+ }
98
+ // Everything below needs an unlocked session.
99
+ if (!route.startsWith('/api/'))
100
+ return false;
101
+ if (!hasSession(req)) {
102
+ sendJson(res, 401, { error: 'locked' });
103
+ return true;
104
+ }
105
+ if (route === '/api/vault/password' && method === 'POST') {
106
+ const { current, next } = await readJsonBody(req);
107
+ if (!next || next.length < 8) {
108
+ sendJson(res, 400, { error: 'new password must be at least 8 characters' });
109
+ return true;
110
+ }
111
+ try {
112
+ vault.changePassword(current ?? '', next);
113
+ }
114
+ catch {
115
+ sendJson(res, 401, { error: 'wrong master password' });
116
+ return true;
117
+ }
118
+ sendJson(res, 200, { ok: true });
119
+ return true;
120
+ }
121
+ if (route === '/api/profiles') {
122
+ const reads = readAllProfiles();
123
+ sendJson(res, 200, {
124
+ profiles: reads.map((read) => ({
125
+ ...read.profile,
126
+ cookieCount: read.cookies.length,
127
+ siteCount: new Set(read.cookies.map((c) => bareDomain(c.domain))).size,
128
+ error: read.error ?? null,
129
+ })),
130
+ });
131
+ return true;
132
+ }
133
+ if (route === '/api/sites') {
134
+ const profileIds = url.searchParams.getAll('profileId');
135
+ const query = (url.searchParams.get('q') ?? '').toLowerCase();
136
+ const reads = readAllProfiles(profileIds.length ? profileIds : undefined);
137
+ const sites = new Map();
138
+ for (const read of reads) {
139
+ for (const cookie of read.cookies) {
140
+ const site = bareDomain(cookie.domain);
141
+ if (query && !site.includes(query))
142
+ continue;
143
+ const entry = sites.get(site) ?? { site, cookieCount: 0, profileIds: new Set(), expiring: 0 };
144
+ entry.cookieCount += 1;
145
+ entry.profileIds.add(cookie.profileId);
146
+ if (isExpired(cookie))
147
+ entry.expiring += 1;
148
+ sites.set(site, entry);
149
+ }
150
+ }
151
+ sendJson(res, 200, {
152
+ sites: [...sites.values()]
153
+ .map((entry) => ({ ...entry, profileIds: [...entry.profileIds] }))
154
+ .sort((a, b) => b.cookieCount - a.cookieCount || a.site.localeCompare(b.site)),
155
+ errors: reads.filter((r) => r.error).map((r) => ({ profileId: r.profile.id, error: r.error })),
156
+ });
157
+ return true;
158
+ }
159
+ if (route === '/api/cookies') {
160
+ const site = url.searchParams.get('site');
161
+ if (!site) {
162
+ sendJson(res, 400, { error: 'site is required' });
163
+ return true;
164
+ }
165
+ const profileIds = url.searchParams.getAll('profileId');
166
+ const reads = readAllProfiles(profileIds.length ? profileIds : undefined);
167
+ const cookies = reads
168
+ .flatMap((read) => read.cookies)
169
+ .filter((cookie) => domainCovers(site, cookie.domain))
170
+ .map(toMeta)
171
+ .sort((a, b) => a.domain.localeCompare(b.domain) || a.name.localeCompare(b.name));
172
+ sendJson(res, 200, { cookies });
173
+ return true;
174
+ }
175
+ if (route === '/api/bundles' && method === 'GET') {
176
+ sendJson(res, 200, { bundles: vault.read().bundles.map(publicBundle) });
177
+ return true;
178
+ }
179
+ if (route === '/api/bundles' && method === 'POST') {
180
+ const body = await readJsonBody(req);
181
+ if (!body.name?.trim()) {
182
+ sendJson(res, 400, { error: 'bundle name is required' });
183
+ return true;
184
+ }
185
+ const now = new Date().toISOString();
186
+ const bundle = {
187
+ id: newBundleId(body.name),
188
+ name: body.name.trim(),
189
+ description: body.description?.trim() ?? '',
190
+ createdAt: now,
191
+ updatedAt: now,
192
+ selectors: body.selectors ?? [],
193
+ grants: [],
194
+ };
195
+ vault.write((data) => data.bundles.push(bundle));
196
+ audit({ event: 'bundle_saved', bundleId: bundle.id, detail: 'created' });
197
+ sendJson(res, 200, { bundle: publicBundle(bundle) });
198
+ return true;
199
+ }
200
+ const bundleMatch = /^\/api\/bundles\/([^/]+)(\/.*)?$/.exec(route);
201
+ if (bundleMatch) {
202
+ const bundleId = decodeURIComponent(bundleMatch[1]);
203
+ const sub = bundleMatch[2] ?? '';
204
+ let bundle;
205
+ try {
206
+ bundle = vault.bundle(bundleId);
207
+ }
208
+ catch {
209
+ sendJson(res, 404, { error: 'no such bundle' });
210
+ return true;
211
+ }
212
+ if (sub === '' && method === 'PUT') {
213
+ const body = await readJsonBody(req);
214
+ vault.write((data) => {
215
+ const target = data.bundles.find((b) => b.id === bundleId);
216
+ if (body.name?.trim())
217
+ target.name = body.name.trim();
218
+ if (body.description !== undefined)
219
+ target.description = body.description.trim();
220
+ if (body.selectors)
221
+ target.selectors = body.selectors;
222
+ target.updatedAt = new Date().toISOString();
223
+ });
224
+ audit({ event: 'bundle_saved', bundleId });
225
+ sendJson(res, 200, { bundle: publicBundle(vault.bundle(bundleId)) });
226
+ return true;
227
+ }
228
+ if (sub === '' && method === 'DELETE') {
229
+ vault.write((data) => {
230
+ data.bundles = data.bundles.filter((b) => b.id !== bundleId);
231
+ });
232
+ audit({ event: 'bundle_deleted', bundleId });
233
+ sendJson(res, 200, { ok: true });
234
+ return true;
235
+ }
236
+ if (sub === '/preview' && method === 'GET') {
237
+ const resolved = resolveBundle(bundle);
238
+ sendJson(res, 200, {
239
+ cookies: resolved.cookies.map(toMeta),
240
+ emptySelectors: resolved.emptySelectors,
241
+ errors: resolved.errors,
242
+ });
243
+ return true;
244
+ }
245
+ if (sub === '/grants' && method === 'POST') {
246
+ const body = await readJsonBody(req);
247
+ const token = newToken();
248
+ const grant = {
249
+ tokenHash: hashToken(token),
250
+ label: body.label?.trim() || 'agent',
251
+ createdAt: new Date().toISOString(),
252
+ expiresAt: body.expiresInDays ? Math.floor(Date.now() / 1000 + body.expiresInDays * 86_400) : 0,
253
+ allowFetch: body.allowFetch ?? true,
254
+ redactValues: body.redactValues ?? false,
255
+ lastUsedAt: null,
256
+ useCount: 0,
257
+ revokedAt: null,
258
+ };
259
+ vault.write((data) => data.bundles.find((b) => b.id === bundleId).grants.push(grant));
260
+ audit({ event: 'grant_created', bundleId, grantLabel: grant.label });
261
+ sendJson(res, 200, { token, grant: { ...grant, id: grant.tokenHash.slice(0, 12) } });
262
+ return true;
263
+ }
264
+ const grantMatch = /^\/grants\/([0-9a-f]+)$/.exec(sub);
265
+ if (grantMatch && method === 'DELETE') {
266
+ vault.write((data) => {
267
+ const grant = data.bundles
268
+ .find((b) => b.id === bundleId)
269
+ .grants.find((g) => g.tokenHash.startsWith(grantMatch[1]));
270
+ if (grant)
271
+ grant.revokedAt = new Date().toISOString();
272
+ });
273
+ audit({ event: 'grant_revoked', bundleId });
274
+ sendJson(res, 200, { ok: true });
275
+ return true;
276
+ }
277
+ }
278
+ if (route === '/api/audit') {
279
+ sendJson(res, 200, { entries: readAudit(200) });
280
+ return true;
281
+ }
282
+ sendJson(res, 404, { error: 'no such endpoint' });
283
+ return true;
284
+ }
285
+ async function handleAgentApi(req, res, url) {
286
+ if (!url.pathname.startsWith('/agent/'))
287
+ return false;
288
+ let grantee;
289
+ try {
290
+ grantee = authorize(vault, bearerToken(req));
291
+ }
292
+ catch (error) {
293
+ sendJson(res, error instanceof AccessDeniedError ? 403 : 500, { error: error.message });
294
+ return true;
295
+ }
296
+ const { bundle, grant } = grantee;
297
+ if (url.pathname === '/agent/bundle') {
298
+ const resolved = resolveBundle(bundle);
299
+ noteUse(vault, grantee, 'bundle_read', 'describe');
300
+ sendJson(res, 200, {
301
+ bundle: { id: bundle.id, name: bundle.name, description: bundle.description },
302
+ hosts: [...new Set(resolved.cookies.map((c) => bareDomain(c.domain)))].sort(),
303
+ cookieCount: resolved.cookies.length,
304
+ permissions: { allowFetch: grant.allowFetch, redactValues: grant.redactValues },
305
+ warnings: resolved.errors.map((e) => `${e.profileId}: ${e.error}`),
306
+ });
307
+ return true;
308
+ }
309
+ if (url.pathname === '/agent/cookies') {
310
+ if (grant.redactValues) {
311
+ sendJson(res, 403, { error: 'this token cannot read cookie values; use /agent/fetch instead' });
312
+ return true;
313
+ }
314
+ const resolved = resolveBundle(bundle);
315
+ const format = url.searchParams.get('format') ?? 'json';
316
+ const target = url.searchParams.get('url');
317
+ noteUse(vault, grantee, 'bundle_read', format);
318
+ if (format === 'netscape') {
319
+ res.writeHead(200, { 'content-type': 'text/plain; charset=utf-8', 'cache-control': 'no-store' });
320
+ res.end(toNetscape(resolved.cookies));
321
+ return true;
322
+ }
323
+ if (format === 'storage-state') {
324
+ res.writeHead(200, { 'content-type': 'application/json; charset=utf-8', 'cache-control': 'no-store' });
325
+ res.end(toStorageState(resolved.cookies));
326
+ return true;
327
+ }
328
+ if (format === 'header') {
329
+ if (!target) {
330
+ sendJson(res, 400, { error: 'url is required for format=header' });
331
+ return true;
332
+ }
333
+ sendJson(res, 200, { cookie: cookieHeaderFor(resolved.cookies, target) });
334
+ return true;
335
+ }
336
+ sendJson(res, 200, {
337
+ cookies: resolved.cookies.map(({ profileId, browser, ...cookie }) => cookie),
338
+ });
339
+ return true;
340
+ }
341
+ if (url.pathname === '/agent/fetch' && req.method === 'POST') {
342
+ if (!grant.allowFetch) {
343
+ sendJson(res, 403, { error: 'this token may not proxy requests' });
344
+ return true;
345
+ }
346
+ const body = await readJsonBody(req);
347
+ if (!body.url) {
348
+ sendJson(res, 400, { error: 'url is required' });
349
+ return true;
350
+ }
351
+ const resolved = resolveBundle(bundle);
352
+ let target;
353
+ try {
354
+ target = new URL(body.url);
355
+ }
356
+ catch {
357
+ sendJson(res, 400, { error: 'invalid url' });
358
+ return true;
359
+ }
360
+ const hosts = new Set(resolved.cookies.map((c) => bareDomain(c.domain)));
361
+ const allowed = [...hosts].some((host) => target.hostname === host || target.hostname.endsWith(`.${host}`) || host.endsWith(`.${target.hostname}`));
362
+ if (!allowed) {
363
+ sendJson(res, 403, { error: `bundle "${bundle.name}" holds no cookies for ${target.hostname}` });
364
+ return true;
365
+ }
366
+ const cookieHeader = cookieHeaderFor(resolved.cookies, target.toString());
367
+ noteUse(vault, grantee, 'bundle_fetch', `${body.method ?? 'GET'} ${target.origin}${target.pathname}`);
368
+ const upstream = await fetch(target, {
369
+ method: body.method ?? 'GET',
370
+ headers: { ...(body.headers ?? {}), cookie: cookieHeader },
371
+ body: body.body,
372
+ redirect: 'follow',
373
+ });
374
+ const text = await upstream.text();
375
+ sendJson(res, 200, {
376
+ status: upstream.status,
377
+ headers: Object.fromEntries([...upstream.headers].filter(([k]) => k !== 'set-cookie')),
378
+ body: text.slice(0, 1_000_000),
379
+ truncated: text.length > 1_000_000,
380
+ });
381
+ return true;
382
+ }
383
+ sendJson(res, 404, { error: 'no such endpoint' });
384
+ return true;
385
+ }
386
+ function serveStatic(req, res, url) {
387
+ const relative = url.pathname === '/' ? 'index.html' : url.pathname.replace(/^\/+/, '');
388
+ const candidate = path.join(uiDir, relative);
389
+ const file = candidate.startsWith(uiDir) && fs.existsSync(candidate) && fs.statSync(candidate).isFile()
390
+ ? candidate
391
+ : path.join(uiDir, 'index.html');
392
+ if (!fs.existsSync(file)) {
393
+ res.writeHead(404, { 'content-type': 'text/plain' });
394
+ res.end('UI not built. Run `npm run build:ui`.\n');
395
+ return;
396
+ }
397
+ res.writeHead(200, {
398
+ 'content-type': MIME[path.extname(file)] ?? 'application/octet-stream',
399
+ 'cache-control': file.endsWith('.html') ? 'no-store' : 'public, max-age=3600',
400
+ 'content-security-policy': "default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:",
401
+ 'referrer-policy': 'no-referrer',
402
+ });
403
+ fs.createReadStream(file).pipe(res);
404
+ }
405
+ const server = http.createServer((req, res) => {
406
+ const url = new URL(req.url ?? '/', `http://127.0.0.1:${port}`);
407
+ void (async () => {
408
+ try {
409
+ if (req.method !== 'GET' && !originAllowed(req, port)) {
410
+ sendJson(res, 403, { error: 'cross-origin request refused' });
411
+ return;
412
+ }
413
+ if (await handleAgentApi(req, res, url))
414
+ return;
415
+ if (await handleUiApi(req, res, url))
416
+ return;
417
+ serveStatic(req, res, url);
418
+ }
419
+ catch (error) {
420
+ const status = error instanceof VaultLockedError ? 401 : 500;
421
+ sendJson(res, status, { error: error instanceof Error ? error.message : String(error) });
422
+ }
423
+ })();
424
+ });
425
+ return { server, vault };
426
+ }
427
+ export function startServer(options) {
428
+ const { server } = createServer(options);
429
+ const host = options.host ?? '127.0.0.1';
430
+ return new Promise((resolve, reject) => {
431
+ server.once('error', reject);
432
+ server.listen(options.port, host, () => {
433
+ const address = server.address();
434
+ const port = typeof address === 'object' && address ? address.port : options.port;
435
+ resolve({
436
+ url: `http://${host}:${port}`,
437
+ close: () => new Promise((done) => server.close(() => done())),
438
+ });
439
+ });
440
+ });
441
+ }
442
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}