nothing-browser 0.1.2 → 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.js +316 -0
- 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 -30186
- 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.ts +0 -274
- /package/piggy/logger/{index.ts → index.js} +0 -0
package/piggy.js
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
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
|
+
if (!_client) throw new Error("No client. Call piggy.launch() or piggy.connect() first.");
|
|
46
|
+
return _client;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function buildAPIs(client) {
|
|
50
|
+
_router = createRouter(client);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ── piggy object ──────────────────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
const piggy = {
|
|
56
|
+
|
|
57
|
+
// ── Local launch (unix socket) ────────────────────────────────────────────
|
|
58
|
+
launch: async (opts = {}) => {
|
|
59
|
+
_tabMode = opts.mode ?? "tab";
|
|
60
|
+
const binaryMode = opts.binary ?? "headless";
|
|
61
|
+
await spawnBrowser(binaryMode);
|
|
62
|
+
await new Promise(r => setTimeout(r, 500));
|
|
63
|
+
_client = new PiggyClient();
|
|
64
|
+
await _client.connect();
|
|
65
|
+
setClient(_client);
|
|
66
|
+
buildAPIs(_client);
|
|
67
|
+
logger.info(`[piggy] launched — tab mode: "${_tabMode}", binary: "${binaryMode}"`);
|
|
68
|
+
return piggy;
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
// ── Remote connect (HTTP) ─────────────────────────────────────────────────
|
|
72
|
+
connect: async (opts) => {
|
|
73
|
+
_tabMode = "tab";
|
|
74
|
+
_client = new PiggyClient({ host: opts.host, key: opts.key });
|
|
75
|
+
await _client.connect();
|
|
76
|
+
setClient(_client);
|
|
77
|
+
buildAPIs(_client);
|
|
78
|
+
logger.info(`[piggy] connected (HTTP) → ${opts.host}`);
|
|
79
|
+
return piggy;
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
// ── HTTP client ───────────────────────────────────────────────────────────
|
|
83
|
+
http: (opts) => createHttpClient(opts),
|
|
84
|
+
|
|
85
|
+
// ── Register ──────────────────────────────────────────────────────────────
|
|
86
|
+
register: async (name, url, opts = {}) => {
|
|
87
|
+
if (!url?.trim()) throw new Error(`No URL for site "${name}"`);
|
|
88
|
+
|
|
89
|
+
const binaryMode = opts.binary ?? "headless";
|
|
90
|
+
const poolSize = opts.pool ?? 0;
|
|
91
|
+
const isSingle = opts.single === true;
|
|
92
|
+
|
|
93
|
+
if (isSingle && _singleSiteName && _singleSiteName !== name) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
`piggy: site "${_singleSiteName}" is already registered as single. ` +
|
|
96
|
+
`Only one site may use { single: true } at a time.`
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (_tabMode === "tab") {
|
|
101
|
+
const client = guardClient();
|
|
102
|
+
|
|
103
|
+
if (poolSize > 1) {
|
|
104
|
+
if (isSingle) throw new Error('piggy: { single: true } is incompatible with pool > 1');
|
|
105
|
+
const pool = new TabPool(client, poolSize, url, name);
|
|
106
|
+
await pool.init();
|
|
107
|
+
const siteObj = createSiteObject(name, url, client, "default", pool);
|
|
108
|
+
_sites[name] = siteObj;
|
|
109
|
+
piggy[name] = siteObj;
|
|
110
|
+
logger.success(`[${name}] registered with pool of ${poolSize} tabs`);
|
|
111
|
+
} else {
|
|
112
|
+
const tabId = isSingle ? "default" : await client.newTab();
|
|
113
|
+
const siteObj = createSiteObject(name, url, client, tabId);
|
|
114
|
+
_sites[name] = siteObj;
|
|
115
|
+
piggy[name] = siteObj;
|
|
116
|
+
|
|
117
|
+
if (isSingle) {
|
|
118
|
+
_singleSiteName = name;
|
|
119
|
+
logger.success(`[${name}] registered as single-tab site (default tab)`);
|
|
120
|
+
} else {
|
|
121
|
+
logger.success(`[${name}] registered as tab ${tabId}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
} else {
|
|
125
|
+
if (isSingle) throw new Error('piggy: { single: true } is only supported in tab mode');
|
|
126
|
+
const socketName = `piggy_${name}`;
|
|
127
|
+
await spawnBrowserOnSocket(socketName, binaryMode);
|
|
128
|
+
await new Promise(r => setTimeout(r, 500));
|
|
129
|
+
const c = new PiggyClient(socketName);
|
|
130
|
+
await c.connect();
|
|
131
|
+
_extraProcs.push({ socket: socketName, client: c });
|
|
132
|
+
const siteObj = createSiteObject(name, url, c, "default");
|
|
133
|
+
_sites[name] = siteObj;
|
|
134
|
+
piggy[name] = siteObj;
|
|
135
|
+
logger.success(`[${name}] registered as process on "${socketName}"`);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return piggy;
|
|
139
|
+
},
|
|
140
|
+
|
|
141
|
+
// ── extend() ─────────────────────────────────────────────────────────────
|
|
142
|
+
extend: async (...installers) => {
|
|
143
|
+
if (!_singleSiteName) {
|
|
144
|
+
throw new Error(
|
|
145
|
+
'piggy.extend() requires a site registered with { single: true }.\n' +
|
|
146
|
+
'Example: await piggy.register("mysite", url, { single: true })'
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
if (installers.length === 0) {
|
|
150
|
+
logger.warn('[piggy] extend() called with no plugins — nothing to do');
|
|
151
|
+
return piggy;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const site = _sites[_singleSiteName];
|
|
155
|
+
if (!site) {
|
|
156
|
+
throw new Error(`piggy.extend(): site "${_singleSiteName}" not found — register it first`);
|
|
157
|
+
}
|
|
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
|
+
|
|
166
|
+
for (const installer of installers) {
|
|
167
|
+
if (typeof installer !== 'function') {
|
|
168
|
+
throw new Error('piggy.extend(): each argument must be a plugin installer function');
|
|
169
|
+
}
|
|
170
|
+
await installer(site);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
logger.success(`[piggy] ${installers.length} plugin(s) installed on "${_singleSiteName}"`);
|
|
174
|
+
return piggy;
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
// ── Sub-APIs ──────────────────────────────────────────────────────────────
|
|
178
|
+
get tabs() { return _router?.tabs ?? createTabsAPI(guardClient()); },
|
|
179
|
+
get tab() { return _router?.tabs ?? createTabsAPI(guardClient()); },
|
|
180
|
+
get navigation() { return _router?.navigation ?? createNavigationAPI(guardClient()); },
|
|
181
|
+
get interactions() { return _router?.interactions ?? createInteractionsAPI(guardClient()); },
|
|
182
|
+
get media() { return _router?.media ?? createMediaAPI(guardClient()); },
|
|
183
|
+
get capture() { return _router?.capture ?? createCaptureAPI(guardClient()); },
|
|
184
|
+
get find() { return _router?.find ?? createFindAPI(guardClient()); },
|
|
185
|
+
get provide() { return _router?.provide ?? createProvideAPI(guardClient()); },
|
|
186
|
+
get wait() { return _router?.wait ?? createWaitAPI(guardClient()); },
|
|
187
|
+
get evaluate() { return _router?.evaluate ?? createEvaluateAPI(guardClient()); },
|
|
188
|
+
get fetch() { return _router?.fetch ?? createFetchAPI(guardClient()); },
|
|
189
|
+
get captcha() { return _router?.captcha ?? createCaptchaAPI(guardClient()); },
|
|
190
|
+
get dialog() { return _router?.dialog ?? createDialogAPI(guardClient()); },
|
|
191
|
+
get human() { return _router?.human ?? createHumanAPI(guardClient()); },
|
|
192
|
+
get iframe() { return _router?.iframe ?? createIframeAPI(guardClient()); },
|
|
193
|
+
get session() { return _router?.session ?? createSessionAPI(guardClient()); },
|
|
194
|
+
get export() { return _router?.export ?? createExportAPI(guardClient()); },
|
|
195
|
+
|
|
196
|
+
// ── Proxy ─────────────────────────────────────────────────────────────────
|
|
197
|
+
get proxy() {
|
|
198
|
+
const api = _router?.proxy ?? createProxyAPI(guardClient());
|
|
199
|
+
return {
|
|
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),
|
|
217
|
+
};
|
|
218
|
+
},
|
|
219
|
+
|
|
220
|
+
// ── Global controls ───────────────────────────────────────────────────────
|
|
221
|
+
actHuman: (enable) => {
|
|
222
|
+
setHumanMode(enable);
|
|
223
|
+
logger.info(`[piggy] actHuman: ${enable}`);
|
|
224
|
+
return piggy;
|
|
225
|
+
},
|
|
226
|
+
|
|
227
|
+
mode: (m) => { _tabMode = m; return piggy; },
|
|
228
|
+
|
|
229
|
+
// ── Global expose ─────────────────────────────────────────────────────────
|
|
230
|
+
expose: async (name, handler, tabId = "default") => {
|
|
231
|
+
await guardClient().exposeFunction(name, handler, tabId);
|
|
232
|
+
logger.success(`[piggy] exposed global function: ${name}`);
|
|
233
|
+
return piggy;
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
unexpose: async (name, tabId = "default") => {
|
|
237
|
+
await guardClient().unexposeFunction(name, tabId);
|
|
238
|
+
logger.info(`[piggy] unexposed function: ${name}`);
|
|
239
|
+
return piggy;
|
|
240
|
+
},
|
|
241
|
+
|
|
242
|
+
// ── Elysia server ─────────────────────────────────────────────────────────
|
|
243
|
+
serve: (port, opts) => startServer(port, opts?.hostname, opts),
|
|
244
|
+
|
|
245
|
+
stopServer,
|
|
246
|
+
|
|
247
|
+
// ── Route listing ─────────────────────────────────────────────────────────
|
|
248
|
+
routes: () =>
|
|
249
|
+
Array.from(routeRegistry.entries()).map(([key, cfg]) => {
|
|
250
|
+
const [site] = key.split(":");
|
|
251
|
+
return {
|
|
252
|
+
site,
|
|
253
|
+
method: cfg.method,
|
|
254
|
+
path: `/${site}${cfg.path}`,
|
|
255
|
+
ttl: cfg.ttl,
|
|
256
|
+
middlewareCount: cfg.before.length,
|
|
257
|
+
};
|
|
258
|
+
}),
|
|
259
|
+
|
|
260
|
+
// ── Multi-site helpers ────────────────────────────────────────────────────
|
|
261
|
+
all: (sites) =>
|
|
262
|
+
new Proxy({}, {
|
|
263
|
+
get: (_, method) =>
|
|
264
|
+
(...args) => Promise.all(sites.map(s => s[method]?.(...args))),
|
|
265
|
+
}),
|
|
266
|
+
|
|
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]]));
|
|
273
|
+
},
|
|
274
|
+
}),
|
|
275
|
+
|
|
276
|
+
// ── Shutdown ──────────────────────────────────────────────────────────────
|
|
277
|
+
close: async (opts = {}) => {
|
|
278
|
+
stopServer();
|
|
279
|
+
_singleSiteName = null;
|
|
280
|
+
if (opts.force) {
|
|
281
|
+
for (const { client: c } of _extraProcs) c.disconnect();
|
|
282
|
+
_client?.disconnect();
|
|
283
|
+
killBrowser();
|
|
284
|
+
routeRegistry.clear();
|
|
285
|
+
keepAliveSites.clear();
|
|
286
|
+
} else {
|
|
287
|
+
for (const [name, site] of Object.entries(_sites)) {
|
|
288
|
+
if (!keepAliveSites.has(name)) await site.close?.();
|
|
289
|
+
}
|
|
290
|
+
if (keepAliveSites.size === 0) {
|
|
291
|
+
for (const { client: c } of _extraProcs) c.disconnect();
|
|
292
|
+
_extraProcs.length = 0;
|
|
293
|
+
_client?.disconnect();
|
|
294
|
+
_client = null;
|
|
295
|
+
_router = null;
|
|
296
|
+
setClient(null);
|
|
297
|
+
killBrowser();
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
logger.info("[piggy] closed");
|
|
301
|
+
},
|
|
302
|
+
|
|
303
|
+
detect: detectBinary,
|
|
304
|
+
logger,
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
// ── usePiggy ──────────────────────────────────────────────────────────────────
|
|
308
|
+
|
|
309
|
+
function usePiggy() {
|
|
310
|
+
return piggy;
|
|
311
|
+
}
|
|
312
|
+
|
|
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
|
-
};
|