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.
- package/package.json +14 -26
- package/piggy/cache/{memory.ts → memory.js} +5 -10
- package/piggy/captcha/{index.ts → index.js} +19 -28
- package/piggy/capture/index.js +40 -0
- package/piggy/client/{index.ts → index.js} +133 -154
- package/piggy/dialog/{index.ts → index.js} +15 -31
- package/piggy/export/index.js +105 -0
- package/piggy/expose/index.js +24 -0
- package/piggy/find/{index.ts → index.js} +24 -39
- package/piggy/http/{index.ts → index.js} +7 -16
- package/piggy/human/{index.ts → index.js} +18 -49
- package/piggy/iframe/index.js +56 -0
- package/piggy/interactions/{index.ts → index.js} +20 -23
- package/piggy/intercept/{scripts.ts → scripts.js} +4 -13
- package/piggy/launch/{detect.ts → detect.js} +4 -6
- package/piggy/launch/{spawn.ts → spawn.js} +17 -22
- package/piggy/media/{index.ts → index.js} +13 -11
- package/piggy/navigation/{index.ts → index.js} +16 -14
- package/piggy/pool/index.js +76 -0
- package/piggy/provide/index.js +97 -0
- package/piggy/proxy/index.js +95 -0
- package/piggy/register/index.js +543 -0
- package/piggy/router/index.js +44 -0
- package/piggy/server/{index.ts → index.js} +16 -64
- package/piggy/session/index.js +69 -0
- package/piggy/store/{index.ts → index.js} +22 -62
- package/piggy/tabs/index.js +24 -0
- package/piggy/wait/index.js +77 -0
- package/{piggy.ts → piggy.js} +122 -146
- package/dist/cache/memory.js +0 -35
- package/dist/client/index.js +0 -1284
- package/dist/human/index.js +0 -82
- package/dist/launch/detect.js +0 -782
- package/dist/launch/spawn.js +0 -915
- package/dist/logger/index.js +0 -733
- package/dist/piggy/cache/memory.d.ts +0 -7
- package/dist/piggy/cache/memory.d.ts.map +0 -1
- package/dist/piggy/captcha/index.d.ts +0 -39
- package/dist/piggy/captcha/index.d.ts.map +0 -1
- package/dist/piggy/capture/index.d.ts +0 -48
- package/dist/piggy/capture/index.d.ts.map +0 -1
- package/dist/piggy/client/index.d.ts +0 -146
- package/dist/piggy/client/index.d.ts.map +0 -1
- package/dist/piggy/dialog/index.d.ts +0 -28
- package/dist/piggy/dialog/index.d.ts.map +0 -1
- package/dist/piggy/export/index.d.ts +0 -62
- package/dist/piggy/export/index.d.ts.map +0 -1
- package/dist/piggy/expose/index.d.ts +0 -6
- package/dist/piggy/expose/index.d.ts.map +0 -1
- package/dist/piggy/find/index.d.ts +0 -52
- package/dist/piggy/find/index.d.ts.map +0 -1
- package/dist/piggy/http/index.d.ts +0 -14
- package/dist/piggy/http/index.d.ts.map +0 -1
- package/dist/piggy/human/index.d.ts +0 -39
- package/dist/piggy/human/index.d.ts.map +0 -1
- package/dist/piggy/iframe/index.d.ts +0 -53
- package/dist/piggy/iframe/index.d.ts.map +0 -1
- package/dist/piggy/interactions/index.d.ts +0 -24
- package/dist/piggy/interactions/index.d.ts.map +0 -1
- package/dist/piggy/intercept/scripts.d.ts +0 -13
- package/dist/piggy/intercept/scripts.d.ts.map +0 -1
- package/dist/piggy/launch/detect.d.ts +0 -3
- package/dist/piggy/launch/detect.d.ts.map +0 -1
- package/dist/piggy/launch/spawn.d.ts +0 -6
- package/dist/piggy/launch/spawn.d.ts.map +0 -1
- package/dist/piggy/logger/index.d.ts +0 -3
- package/dist/piggy/logger/index.d.ts.map +0 -1
- package/dist/piggy/media/index.d.ts +0 -11
- package/dist/piggy/media/index.d.ts.map +0 -1
- package/dist/piggy/navigation/index.d.ts +0 -16
- package/dist/piggy/navigation/index.d.ts.map +0 -1
- package/dist/piggy/pool/index.d.ts +0 -23
- package/dist/piggy/pool/index.d.ts.map +0 -1
- package/dist/piggy/provide/index.d.ts +0 -98
- package/dist/piggy/provide/index.d.ts.map +0 -1
- package/dist/piggy/proxy/index.d.ts +0 -94
- package/dist/piggy/proxy/index.d.ts.map +0 -1
- package/dist/piggy/register/index.d.ts +0 -9
- package/dist/piggy/register/index.d.ts.map +0 -1
- package/dist/piggy/router/index.d.ts +0 -38
- package/dist/piggy/router/index.d.ts.map +0 -1
- package/dist/piggy/server/index.d.ts +0 -42
- package/dist/piggy/server/index.d.ts.map +0 -1
- package/dist/piggy/session/index.d.ts +0 -27
- package/dist/piggy/session/index.d.ts.map +0 -1
- package/dist/piggy/store/index.d.ts +0 -22
- package/dist/piggy/store/index.d.ts.map +0 -1
- package/dist/piggy/tabs/index.d.ts +0 -12
- package/dist/piggy/tabs/index.d.ts.map +0 -1
- package/dist/piggy/wait/index.d.ts +0 -28
- package/dist/piggy/wait/index.d.ts.map +0 -1
- package/dist/piggy.d.ts +0 -10
- package/dist/piggy.d.ts.map +0 -1
- package/dist/piggy.js +0 -30223
- package/dist/register/index.js +0 -23710
- package/dist/server/index.js +0 -26831
- package/piggy/capture/index.ts +0 -76
- package/piggy/export/index.d.ts +0 -117
- package/piggy/export/index.ts +0 -147
- package/piggy/expose/index.ts +0 -42
- package/piggy/iframe/index.ts +0 -79
- package/piggy/intercept/scripts.d.ts +0 -13
- package/piggy/intercept/scripts.d.ts.map +0 -1
- package/piggy/launch/detect.d.ts +0 -3
- package/piggy/launch/detect.d.ts.map +0 -1
- package/piggy/launch/spawn.d.ts +0 -6
- package/piggy/launch/spawn.d.ts.map +0 -1
- package/piggy/logger/index.d.ts +0 -3
- package/piggy/logger/index.d.ts.map +0 -1
- package/piggy/pool/index.d.ts +0 -12
- package/piggy/pool/index.ts +0 -75
- package/piggy/provide/index.ts +0 -170
- package/piggy/proxy/index.ts +0 -154
- package/piggy/register/index.ts +0 -575
- package/piggy/router/index.ts +0 -69
- package/piggy/session/index.ts +0 -76
- package/piggy/store/index.d.ts +0 -26
- package/piggy/tabs/index.ts +0 -23
- package/piggy/wait/index.ts +0 -90
- /package/piggy/logger/{index.ts → index.js} +0 -0
package/{piggy.ts → piggy.js}
RENAMED
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
let
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// ── Internal
|
|
43
|
-
|
|
44
|
-
function guardClient()
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
function buildAPIs(client: PiggyClient) {
|
|
49
|
+
function buildAPIs(client) {
|
|
52
50
|
_router = createRouter(client);
|
|
53
51
|
}
|
|
54
52
|
|
|
55
|
-
|
|
53
|
+
// ── piggy object ──────────────────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
const piggy = {
|
|
56
56
|
|
|
57
57
|
// ── Local launch (unix socket) ────────────────────────────────────────────
|
|
58
|
-
launch: async (opts
|
|
59
|
-
_tabMode = opts
|
|
60
|
-
const binaryMode
|
|
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
|
|
72
|
+
connect: async (opts) => {
|
|
73
73
|
_tabMode = "tab";
|
|
74
|
-
_client
|
|
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
|
|
83
|
-
http: (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
|
|
94
|
-
const poolSize = opts
|
|
95
|
-
const isSingle = opts
|
|
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
|
|
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]
|
|
116
|
-
piggy[name]
|
|
108
|
+
_sites[name] = siteObj;
|
|
109
|
+
piggy[name] = siteObj;
|
|
117
110
|
logger.success(`[${name}] registered with pool of ${poolSize} tabs`);
|
|
118
111
|
} else {
|
|
119
|
-
|
|
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]
|
|
123
|
-
piggy[name]
|
|
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]
|
|
142
|
-
piggy[name]
|
|
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()
|
|
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
|
|
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
|
|
196
|
+
// ── Proxy ─────────────────────────────────────────────────────────────────
|
|
209
197
|
get proxy() {
|
|
210
198
|
const api = _router?.proxy ?? createProxyAPI(guardClient());
|
|
211
199
|
return {
|
|
212
|
-
load: (path
|
|
213
|
-
fetch: (url
|
|
214
|
-
ovpn: (path
|
|
215
|
-
set: (opts
|
|
216
|
-
test: ()
|
|
217
|
-
testStop: ()
|
|
218
|
-
next: ()
|
|
219
|
-
rotate: ()
|
|
220
|
-
disable: ()
|
|
221
|
-
enable: ()
|
|
222
|
-
current: ()
|
|
223
|
-
stats: ()
|
|
224
|
-
list: (limit
|
|
225
|
-
rotation: (mode
|
|
226
|
-
config: (opts
|
|
227
|
-
save: (path
|
|
228
|
-
on: (event
|
|
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
|
|
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
|
|
227
|
+
mode: (m) => { _tabMode = m; return piggy; },
|
|
240
228
|
|
|
241
229
|
// ── Global expose ─────────────────────────────────────────────────────────
|
|
242
|
-
expose: async (name
|
|
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
|
|
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:
|
|
275
|
-
path:
|
|
276
|
-
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
|
|
283
|
-
new Proxy({}
|
|
284
|
-
get: (_, method
|
|
285
|
-
(...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
|
|
289
|
-
new Proxy({}
|
|
290
|
-
get: (_, method
|
|
291
|
-
async (...args
|
|
292
|
-
const results = await Promise.all(sites.map(
|
|
293
|
-
return Object.fromEntries(sites.map((s
|
|
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
|
|
277
|
+
close: async (opts = {}) => {
|
|
299
278
|
stopServer();
|
|
300
279
|
_singleSiteName = null;
|
|
301
|
-
if (opts
|
|
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
|
|
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
|
-
|
|
331
|
-
|
|
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
|
-
|
|
339
|
-
|
|
340
|
-
|
|
313
|
+
module.exports = piggy;
|
|
314
|
+
module.exports.default = piggy;
|
|
315
|
+
module.exports.piggy = piggy;
|
|
316
|
+
module.exports.usePiggy = usePiggy;
|
package/dist/cache/memory.js
DELETED
|
@@ -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
|
-
};
|