nothing-browser 0.1.3 → 0.1.4

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 (120) hide show
  1. package/package.json +14 -26
  2. package/piggy/cache/{memory.ts → memory.js} +5 -10
  3. package/piggy/captcha/{index.ts → index.js} +19 -28
  4. package/piggy/capture/index.js +40 -0
  5. package/piggy/client/{index.ts → index.js} +133 -154
  6. package/piggy/dialog/{index.ts → index.js} +15 -31
  7. package/piggy/export/index.js +105 -0
  8. package/piggy/expose/index.js +24 -0
  9. package/piggy/find/{index.ts → index.js} +24 -39
  10. package/piggy/http/{index.ts → index.js} +7 -16
  11. package/piggy/human/{index.ts → index.js} +18 -49
  12. package/piggy/iframe/index.js +56 -0
  13. package/piggy/interactions/{index.ts → index.js} +20 -23
  14. package/piggy/intercept/{scripts.ts → scripts.js} +4 -13
  15. package/piggy/launch/{detect.ts → detect.js} +4 -6
  16. package/piggy/launch/{spawn.ts → spawn.js} +17 -22
  17. package/piggy/media/{index.ts → index.js} +13 -11
  18. package/piggy/navigation/{index.ts → index.js} +16 -14
  19. package/piggy/pool/index.js +76 -0
  20. package/piggy/provide/index.js +97 -0
  21. package/piggy/proxy/index.js +95 -0
  22. package/piggy/register/index.js +543 -0
  23. package/piggy/router/index.js +44 -0
  24. package/piggy/server/{index.ts → index.js} +16 -64
  25. package/piggy/session/index.js +69 -0
  26. package/piggy/store/{index.ts → index.js} +22 -62
  27. package/piggy/tabs/index.js +24 -0
  28. package/piggy/wait/index.js +77 -0
  29. package/{piggy.ts → piggy.js} +122 -146
  30. package/dist/cache/memory.js +0 -35
  31. package/dist/client/index.js +0 -1284
  32. package/dist/human/index.js +0 -82
  33. package/dist/launch/detect.js +0 -782
  34. package/dist/launch/spawn.js +0 -915
  35. package/dist/logger/index.js +0 -733
  36. package/dist/piggy/cache/memory.d.ts +0 -7
  37. package/dist/piggy/cache/memory.d.ts.map +0 -1
  38. package/dist/piggy/captcha/index.d.ts +0 -39
  39. package/dist/piggy/captcha/index.d.ts.map +0 -1
  40. package/dist/piggy/capture/index.d.ts +0 -48
  41. package/dist/piggy/capture/index.d.ts.map +0 -1
  42. package/dist/piggy/client/index.d.ts +0 -146
  43. package/dist/piggy/client/index.d.ts.map +0 -1
  44. package/dist/piggy/dialog/index.d.ts +0 -28
  45. package/dist/piggy/dialog/index.d.ts.map +0 -1
  46. package/dist/piggy/export/index.d.ts +0 -62
  47. package/dist/piggy/export/index.d.ts.map +0 -1
  48. package/dist/piggy/expose/index.d.ts +0 -6
  49. package/dist/piggy/expose/index.d.ts.map +0 -1
  50. package/dist/piggy/find/index.d.ts +0 -52
  51. package/dist/piggy/find/index.d.ts.map +0 -1
  52. package/dist/piggy/http/index.d.ts +0 -14
  53. package/dist/piggy/http/index.d.ts.map +0 -1
  54. package/dist/piggy/human/index.d.ts +0 -39
  55. package/dist/piggy/human/index.d.ts.map +0 -1
  56. package/dist/piggy/iframe/index.d.ts +0 -53
  57. package/dist/piggy/iframe/index.d.ts.map +0 -1
  58. package/dist/piggy/interactions/index.d.ts +0 -24
  59. package/dist/piggy/interactions/index.d.ts.map +0 -1
  60. package/dist/piggy/intercept/scripts.d.ts +0 -13
  61. package/dist/piggy/intercept/scripts.d.ts.map +0 -1
  62. package/dist/piggy/launch/detect.d.ts +0 -3
  63. package/dist/piggy/launch/detect.d.ts.map +0 -1
  64. package/dist/piggy/launch/spawn.d.ts +0 -6
  65. package/dist/piggy/launch/spawn.d.ts.map +0 -1
  66. package/dist/piggy/logger/index.d.ts +0 -3
  67. package/dist/piggy/logger/index.d.ts.map +0 -1
  68. package/dist/piggy/media/index.d.ts +0 -11
  69. package/dist/piggy/media/index.d.ts.map +0 -1
  70. package/dist/piggy/navigation/index.d.ts +0 -16
  71. package/dist/piggy/navigation/index.d.ts.map +0 -1
  72. package/dist/piggy/pool/index.d.ts +0 -23
  73. package/dist/piggy/pool/index.d.ts.map +0 -1
  74. package/dist/piggy/provide/index.d.ts +0 -98
  75. package/dist/piggy/provide/index.d.ts.map +0 -1
  76. package/dist/piggy/proxy/index.d.ts +0 -94
  77. package/dist/piggy/proxy/index.d.ts.map +0 -1
  78. package/dist/piggy/register/index.d.ts +0 -9
  79. package/dist/piggy/register/index.d.ts.map +0 -1
  80. package/dist/piggy/router/index.d.ts +0 -38
  81. package/dist/piggy/router/index.d.ts.map +0 -1
  82. package/dist/piggy/server/index.d.ts +0 -42
  83. package/dist/piggy/server/index.d.ts.map +0 -1
  84. package/dist/piggy/session/index.d.ts +0 -27
  85. package/dist/piggy/session/index.d.ts.map +0 -1
  86. package/dist/piggy/store/index.d.ts +0 -22
  87. package/dist/piggy/store/index.d.ts.map +0 -1
  88. package/dist/piggy/tabs/index.d.ts +0 -12
  89. package/dist/piggy/tabs/index.d.ts.map +0 -1
  90. package/dist/piggy/wait/index.d.ts +0 -28
  91. package/dist/piggy/wait/index.d.ts.map +0 -1
  92. package/dist/piggy.d.ts +0 -10
  93. package/dist/piggy.d.ts.map +0 -1
  94. package/dist/piggy.js +0 -30223
  95. package/dist/register/index.js +0 -23710
  96. package/dist/server/index.js +0 -26831
  97. package/piggy/capture/index.ts +0 -76
  98. package/piggy/export/index.d.ts +0 -117
  99. package/piggy/export/index.ts +0 -147
  100. package/piggy/expose/index.ts +0 -42
  101. package/piggy/iframe/index.ts +0 -79
  102. package/piggy/intercept/scripts.d.ts +0 -13
  103. package/piggy/intercept/scripts.d.ts.map +0 -1
  104. package/piggy/launch/detect.d.ts +0 -3
  105. package/piggy/launch/detect.d.ts.map +0 -1
  106. package/piggy/launch/spawn.d.ts +0 -6
  107. package/piggy/launch/spawn.d.ts.map +0 -1
  108. package/piggy/logger/index.d.ts +0 -3
  109. package/piggy/logger/index.d.ts.map +0 -1
  110. package/piggy/pool/index.d.ts +0 -12
  111. package/piggy/pool/index.ts +0 -75
  112. package/piggy/provide/index.ts +0 -170
  113. package/piggy/proxy/index.ts +0 -154
  114. package/piggy/register/index.ts +0 -575
  115. package/piggy/router/index.ts +0 -69
  116. package/piggy/session/index.ts +0 -76
  117. package/piggy/store/index.d.ts +0 -26
  118. package/piggy/tabs/index.ts +0 -23
  119. package/piggy/wait/index.ts +0 -90
  120. /package/piggy/logger/{index.ts → index.js} +0 -0
@@ -1,63 +1,63 @@
1
- // piggy.ts — patched: adds single:true + piggy.extend()
2
- import { detectBinary, type BinaryMode } from "./piggy/launch/detect";
3
- import { spawnBrowser, killBrowser, spawnBrowserOnSocket } from "./piggy/launch/spawn";
4
- import { PiggyClient } from "./piggy/client";
5
- import { setClient, setHumanMode, createSiteObject, type SiteObject } from "./piggy/register";
6
- import { routeRegistry, keepAliveSites, startServer, stopServer } from "./piggy/server";
7
- import { TabPool } from "./piggy/pool";
8
- import { createRouter, type PiggyRouter } from "./piggy/router";
9
- import { createCaptureAPI } from "./piggy/capture";
10
- import { createCaptchaAPI } from "./piggy/captcha";
11
- import { createDialogAPI } from "./piggy/dialog";
12
- import { createExportAPI } from "./piggy/export";
13
- import { createFindAPI } from "./piggy/find";
14
- import { createHumanAPI } from "./piggy/human";
15
- import { createIframeAPI } from "./piggy/iframe";
16
- import { createInteractionsAPI } from "./piggy/interactions";
17
- import { createMediaAPI } from "./piggy/media";
18
- import { createNavigationAPI } from "./piggy/navigation";
19
- import { createProvideAPI } from "./piggy/provide";
20
- import { createProxyAPI } from "./piggy/proxy";
21
- import { createSessionAPI } from "./piggy/session";
22
- import { createTabsAPI } from "./piggy/tabs";
23
- import { createWaitAPI, createEvaluateAPI, createFetchAPI } from "./piggy/wait";
24
- import { createHttpClient, type HttpClientOptions } from "./piggy/http";
25
- import logger from "./piggy/logger";
26
-
27
- type TabMode = "tab" | "process";
28
-
29
- // A plugin installer is an async function that receives a site and enriches it.
30
- type PluginInstaller = (site: SiteObject) => Promise<any>;
31
-
32
- let _client: PiggyClient | null = null;
33
- let _router: PiggyRouter | null = null;
34
- let _tabMode: TabMode = "tab";
35
- const _extraProcs: { socket: string; client: PiggyClient }[] = [];
36
- const _sites: Record<string, SiteObject> = {};
37
-
38
- // ── Single-site tracking for extend() ────────────────────────────────────────
39
- // Only one site may be registered with { single: true } at a time.
40
- let _singleSiteName: string | null = null;
41
-
42
- // ── Internal guard ────────────────────────────────────────────────────────────
43
-
44
- function guardClient(): PiggyClient {
1
+ 'use strict';
2
+
3
+ const { detectBinary } = require("./piggy/launch/detect");
4
+ const { spawnBrowser, killBrowser,
5
+ spawnBrowserOnSocket } = require("./piggy/launch/spawn");
6
+ const { PiggyClient } = require("./piggy/client");
7
+ const { setClient, setHumanMode,
8
+ createSiteObject } = require("./piggy/register");
9
+ const { routeRegistry, keepAliveSites,
10
+ startServer, stopServer } = require("./piggy/server");
11
+ const { TabPool } = require("./piggy/pool");
12
+ const { createRouter } = require("./piggy/router");
13
+ const { createCaptureAPI } = require("./piggy/capture");
14
+ const { createCaptchaAPI } = require("./piggy/captcha");
15
+ const { createDialogAPI } = require("./piggy/dialog");
16
+ const { createExportAPI } = require("./piggy/export");
17
+ const { createFindAPI } = require("./piggy/find");
18
+ const { createHumanAPI } = require("./piggy/human");
19
+ const { createIframeAPI } = require("./piggy/iframe");
20
+ const { createInteractionsAPI } = require("./piggy/interactions");
21
+ const { createMediaAPI } = require("./piggy/media");
22
+ const { createNavigationAPI } = require("./piggy/navigation");
23
+ const { createProvideAPI } = require("./piggy/provide");
24
+ const { createProxyAPI } = require("./piggy/proxy");
25
+ const { createSessionAPI } = require("./piggy/session");
26
+ const { createTabsAPI } = require("./piggy/tabs");
27
+ const { createWaitAPI, createEvaluateAPI,
28
+ createFetchAPI } = require("./piggy/wait");
29
+ const { createHttpClient } = require("./piggy/http");
30
+ const logger = require("./piggy/logger");
31
+
32
+ // ── State ─────────────────────────────────────────────────────────────────────
33
+
34
+ let _client = null;
35
+ let _router = null;
36
+ let _tabMode = "tab";
37
+ let _singleSiteName = null;
38
+
39
+ const _extraProcs = [];
40
+ const _sites = {};
41
+
42
+ // ── Internal helpers ──────────────────────────────────────────────────────────
43
+
44
+ function guardClient() {
45
45
  if (!_client) throw new Error("No client. Call piggy.launch() or piggy.connect() first.");
46
46
  return _client;
47
47
  }
48
48
 
49
- // ── Build sub-APIs from a client ──────────────────────────────────────────────
50
-
51
- function buildAPIs(client: PiggyClient) {
49
+ function buildAPIs(client) {
52
50
  _router = createRouter(client);
53
51
  }
54
52
 
55
- const piggy: any = {
53
+ // ── piggy object ──────────────────────────────────────────────────────────────
54
+
55
+ const piggy = {
56
56
 
57
57
  // ── Local launch (unix socket) ────────────────────────────────────────────
58
- launch: async (opts?: { mode?: TabMode; binary?: BinaryMode }) => {
59
- _tabMode = opts?.mode ?? "tab";
60
- const binaryMode: BinaryMode = opts?.binary ?? "headless";
58
+ launch: async (opts = {}) => {
59
+ _tabMode = opts.mode ?? "tab";
60
+ const binaryMode = opts.binary ?? "headless";
61
61
  await spawnBrowser(binaryMode);
62
62
  await new Promise(r => setTimeout(r, 500));
63
63
  _client = new PiggyClient();
@@ -69,9 +69,9 @@ const piggy: any = {
69
69
  },
70
70
 
71
71
  // ── Remote connect (HTTP) ─────────────────────────────────────────────────
72
- connect: async (opts: { host: string; key: string }) => {
72
+ connect: async (opts) => {
73
73
  _tabMode = "tab";
74
- _client = new PiggyClient({ host: opts.host, key: opts.key });
74
+ _client = new PiggyClient({ host: opts.host, key: opts.key });
75
75
  await _client.connect();
76
76
  setClient(_client);
77
77
  buildAPIs(_client);
@@ -79,24 +79,17 @@ const piggy: any = {
79
79
  return piggy;
80
80
  },
81
81
 
82
- // ── HTTP client (port 2005 direct) ────────────────────────────────────────
83
- http: (opts: HttpClientOptions) => createHttpClient(opts),
82
+ // ── HTTP client ───────────────────────────────────────────────────────────
83
+ http: (opts) => createHttpClient(opts),
84
84
 
85
85
  // ── Register ──────────────────────────────────────────────────────────────
86
- register: async (
87
- name: string,
88
- url: string,
89
- opts?: { binary?: BinaryMode; pool?: number; single?: boolean }
90
- ) => {
86
+ register: async (name, url, opts = {}) => {
91
87
  if (!url?.trim()) throw new Error(`No URL for site "${name}"`);
92
88
 
93
- const binaryMode: BinaryMode = opts?.binary ?? "headless";
94
- const poolSize = opts?.pool ?? 0;
95
- const isSingle = opts?.single === true;
89
+ const binaryMode = opts.binary ?? "headless";
90
+ const poolSize = opts.pool ?? 0;
91
+ const isSingle = opts.single === true;
96
92
 
97
- // ── single: true enforcement ───────────────────────────────────────────
98
- // A single-site registration uses the default tab and blocks tab.new so
99
- // the binary stays strictly single-tab. Only one site may be single.
100
93
  if (isSingle && _singleSiteName && _singleSiteName !== name) {
101
94
  throw new Error(
102
95
  `piggy: site "${_singleSiteName}" is already registered as single. ` +
@@ -109,18 +102,17 @@ const piggy: any = {
109
102
 
110
103
  if (poolSize > 1) {
111
104
  if (isSingle) throw new Error('piggy: { single: true } is incompatible with pool > 1');
112
- const pool = new TabPool(client, poolSize, url, name);
105
+ const pool = new TabPool(client, poolSize, url, name);
113
106
  await pool.init();
114
107
  const siteObj = createSiteObject(name, url, client, "default", pool);
115
- _sites[name] = siteObj;
116
- piggy[name] = siteObj;
108
+ _sites[name] = siteObj;
109
+ piggy[name] = siteObj;
117
110
  logger.success(`[${name}] registered with pool of ${poolSize} tabs`);
118
111
  } else {
119
- // single: true → reuse the default tab, never call newTab()
120
- const tabId = isSingle ? "default" : await client.newTab();
112
+ const tabId = isSingle ? "default" : await client.newTab();
121
113
  const siteObj = createSiteObject(name, url, client, tabId);
122
- _sites[name] = siteObj;
123
- piggy[name] = siteObj;
114
+ _sites[name] = siteObj;
115
+ piggy[name] = siteObj;
124
116
 
125
117
  if (isSingle) {
126
118
  _singleSiteName = name;
@@ -138,26 +130,16 @@ const piggy: any = {
138
130
  await c.connect();
139
131
  _extraProcs.push({ socket: socketName, client: c });
140
132
  const siteObj = createSiteObject(name, url, c, "default");
141
- _sites[name] = siteObj;
142
- piggy[name] = siteObj;
133
+ _sites[name] = siteObj;
134
+ piggy[name] = siteObj;
143
135
  logger.success(`[${name}] registered as process on "${socketName}"`);
144
136
  }
145
137
 
146
138
  return piggy;
147
139
  },
148
140
 
149
- // ── extend() — installs plugins onto the single-flagged site ─────────────
150
- //
151
- // Each installer is an async function returned by a plugin factory, e.g.:
152
- // innerstorage({ path: './wa-storage.json' }) → installer fn
153
- //
154
- // Usage:
155
- // await piggy.extend(
156
- // innerstorage({ path: './wa-storage.json' }),
157
- // cookiesinject({ cookieFile: './wa-cookies.json' }),
158
- // mediacapture({ downloadDir: './wa-media/' })
159
- // );
160
- extend: async (...installers: PluginInstaller[]) => {
141
+ // ── extend() ─────────────────────────────────────────────────────────────
142
+ extend: async (...installers) => {
161
143
  if (!_singleSiteName) {
162
144
  throw new Error(
163
145
  'piggy.extend() requires a site registered with { single: true }.\n' +
@@ -174,6 +156,13 @@ const piggy: any = {
174
156
  throw new Error(`piggy.extend(): site "${_singleSiteName}" not found — register it first`);
175
157
  }
176
158
 
159
+ // Inject _send before any installer runs so plugins can reach C++ commands.
160
+ if (typeof site._send !== 'function') {
161
+ const client = guardClient();
162
+ const tabId = site._tabId ?? 'default';
163
+ site._send = (cmd, payload = {}) => client.send(cmd, { tabId, ...payload });
164
+ }
165
+
177
166
  for (const installer of installers) {
178
167
  if (typeof installer !== 'function') {
179
168
  throw new Error('piggy.extend(): each argument must be a plugin installer function');
@@ -185,8 +174,7 @@ const piggy: any = {
185
174
  return piggy;
186
175
  },
187
176
 
188
- // ── Sub-APIs (1:1 with C++ files, available after launch/connect) ─────────
189
-
177
+ // ── Sub-APIs ──────────────────────────────────────────────────────────────
190
178
  get tabs() { return _router?.tabs ?? createTabsAPI(guardClient()); },
191
179
  get tab() { return _router?.tabs ?? createTabsAPI(guardClient()); },
192
180
  get navigation() { return _router?.navigation ?? createNavigationAPI(guardClient()); },
@@ -205,63 +193,54 @@ const piggy: any = {
205
193
  get session() { return _router?.session ?? createSessionAPI(guardClient()); },
206
194
  get export() { return _router?.export ?? createExportAPI(guardClient()); },
207
195
 
208
- // ── Proxy (global, not per-tab) ───────────────────────────────────────────
196
+ // ── Proxy ─────────────────────────────────────────────────────────────────
209
197
  get proxy() {
210
198
  const api = _router?.proxy ?? createProxyAPI(guardClient());
211
199
  return {
212
- load: (path: string) => api.load(path),
213
- fetch: (url: string) => api.fetch(url),
214
- ovpn: (path: string) => api.ovpn(path),
215
- set: (opts: Parameters<typeof api.set>[0]) => api.set(opts),
216
- test: () => api.test(),
217
- testStop: () => api.testStop(),
218
- next: () => api.next(),
219
- rotate: () => api.rotate(),
220
- disable: () => api.disable(),
221
- enable: () => api.enable(),
222
- current: () => api.current(),
223
- stats: () => api.stats(),
224
- list: (limit?: number) => api.list(limit),
225
- rotation: (mode: "none" | "timed" | "perrequest", interval?: number) => api.rotation(mode, interval),
226
- config: (opts: { skipDead?: boolean; autoCheck?: boolean }) => api.config(opts),
227
- save: (path: string, filter?: "alive" | "dead" | "all") => api.save(path, filter),
228
- on: (event: string, handler: (data: any) => void) => guardClient().onProxyEvent(event, handler),
200
+ load: (path) => api.load(path),
201
+ fetch: (url) => api.fetch(url),
202
+ ovpn: (path) => api.ovpn(path),
203
+ set: (opts) => api.set(opts),
204
+ test: () => api.test(),
205
+ testStop: () => api.testStop(),
206
+ next: () => api.next(),
207
+ rotate: () => api.rotate(),
208
+ disable: () => api.disable(),
209
+ enable: () => api.enable(),
210
+ current: () => api.current(),
211
+ stats: () => api.stats(),
212
+ list: (limit) => api.list(limit),
213
+ rotation: (mode, interval) => api.rotation(mode, interval),
214
+ config: (opts) => api.config(opts),
215
+ save: (path, filter) => api.save(path, filter),
216
+ on: (event, handler) => guardClient().onProxyEvent(event, handler),
229
217
  };
230
218
  },
231
219
 
232
220
  // ── Global controls ───────────────────────────────────────────────────────
233
- actHuman: (enable: boolean) => {
221
+ actHuman: (enable) => {
234
222
  setHumanMode(enable);
235
223
  logger.info(`[piggy] actHuman: ${enable}`);
236
224
  return piggy;
237
225
  },
238
226
 
239
- mode: (m: TabMode) => { _tabMode = m; return piggy; },
227
+ mode: (m) => { _tabMode = m; return piggy; },
240
228
 
241
229
  // ── Global expose ─────────────────────────────────────────────────────────
242
- expose: async (name: string, handler: (data: any) => Promise<any> | any, tabId = "default") => {
230
+ expose: async (name, handler, tabId = "default") => {
243
231
  await guardClient().exposeFunction(name, handler, tabId);
244
232
  logger.success(`[piggy] exposed global function: ${name}`);
245
233
  return piggy;
246
234
  },
247
235
 
248
- unexpose: async (name: string, tabId = "default") => {
236
+ unexpose: async (name, tabId = "default") => {
249
237
  await guardClient().unexposeFunction(name, tabId);
250
238
  logger.info(`[piggy] unexposed function: ${name}`);
251
239
  return piggy;
252
240
  },
253
241
 
254
242
  // ── Elysia server ─────────────────────────────────────────────────────────
255
- serve: (
256
- port: number,
257
- opts?: {
258
- hostname?: string;
259
- title?: string;
260
- version?: string;
261
- description?: string;
262
- path?: string;
263
- }
264
- ) => startServer(port, opts?.hostname, opts),
243
+ serve: (port, opts) => startServer(port, opts?.hostname, opts),
265
244
 
266
245
  stopServer,
267
246
 
@@ -271,34 +250,34 @@ const piggy: any = {
271
250
  const [site] = key.split(":");
272
251
  return {
273
252
  site,
274
- method: cfg.method,
275
- path: `/${site}${cfg.path}`,
276
- ttl: cfg.ttl,
253
+ method: cfg.method,
254
+ path: `/${site}${cfg.path}`,
255
+ ttl: cfg.ttl,
277
256
  middlewareCount: cfg.before.length,
278
257
  };
279
258
  }),
280
259
 
281
260
  // ── Multi-site helpers ────────────────────────────────────────────────────
282
- all: (sites: SiteObject[]) =>
283
- new Proxy({} as any, {
284
- get: (_, method: string) =>
285
- (...args: any[]) => Promise.all(sites.map((s: any) => s[method]?.(...args))),
261
+ all: (sites) =>
262
+ new Proxy({}, {
263
+ get: (_, method) =>
264
+ (...args) => Promise.all(sites.map(s => s[method]?.(...args))),
286
265
  }),
287
266
 
288
- diff: (sites: SiteObject[]) =>
289
- new Proxy({} as any, {
290
- get: (_, method: string) =>
291
- async (...args: any[]) => {
292
- const results = await Promise.all(sites.map((s: any) => s[method]?.(...args)));
293
- return Object.fromEntries(sites.map((s: any, i) => [s._name ?? i, results[i]]));
267
+ diff: (sites) =>
268
+ new Proxy({}, {
269
+ get: (_, method) =>
270
+ async (...args) => {
271
+ const results = await Promise.all(sites.map(s => s[method]?.(...args)));
272
+ return Object.fromEntries(sites.map((s, i) => [s._name ?? i, results[i]]));
294
273
  },
295
274
  }),
296
275
 
297
276
  // ── Shutdown ──────────────────────────────────────────────────────────────
298
- close: async (opts?: { force?: boolean }) => {
277
+ close: async (opts = {}) => {
299
278
  stopServer();
300
279
  _singleSiteName = null;
301
- if (opts?.force) {
280
+ if (opts.force) {
302
281
  for (const { client: c } of _extraProcs) c.disconnect();
303
282
  _client?.disconnect();
304
283
  killBrowser();
@@ -306,7 +285,7 @@ const piggy: any = {
306
285
  keepAliveSites.clear();
307
286
  } else {
308
287
  for (const [name, site] of Object.entries(_sites)) {
309
- if (!keepAliveSites.has(name)) await (site as any).close?.();
288
+ if (!keepAliveSites.has(name)) await site.close?.();
310
289
  }
311
290
  if (keepAliveSites.size === 0) {
312
291
  for (const { client: c } of _extraProcs) c.disconnect();
@@ -327,14 +306,11 @@ const piggy: any = {
327
306
 
328
307
  // ── usePiggy ──────────────────────────────────────────────────────────────────
329
308
 
330
- type TypedPiggy<Sites extends string> = typeof piggy & {
331
- [K in Sites]: SiteObject;
332
- };
333
-
334
- export function usePiggy<Sites extends string>(): TypedPiggy<Sites> {
335
- return piggy as TypedPiggy<Sites>;
309
+ function usePiggy() {
310
+ return piggy;
336
311
  }
337
312
 
338
- export type { SiteObject };
339
- export default piggy;
340
- export { piggy };
313
+ module.exports = piggy;
314
+ module.exports.default = piggy;
315
+ module.exports.piggy = piggy;
316
+ module.exports.usePiggy = usePiggy;
@@ -1,35 +0,0 @@
1
- // piggy/cache/memory.ts
2
- var store = new Map;
3
- function get(key) {
4
- const entry = store.get(key);
5
- if (!entry)
6
- return null;
7
- if (Date.now() > entry.expires) {
8
- store.delete(key);
9
- return null;
10
- }
11
- return entry.data;
12
- }
13
- function set(key, data, ttlMs) {
14
- store.set(key, { data, expires: Date.now() + ttlMs });
15
- }
16
- function del(key) {
17
- store.delete(key);
18
- }
19
- function clear() {
20
- store.clear();
21
- }
22
- function size() {
23
- return store.size;
24
- }
25
- function keys() {
26
- return Array.from(store.keys());
27
- }
28
- export {
29
- size,
30
- set,
31
- keys,
32
- get,
33
- del,
34
- clear
35
- };