nothing-browser 0.0.15 → 0.0.16
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/dist/piggy.d.ts +15 -59
- package/dist/piggy.d.ts.map +1 -1
- package/dist/piggy.js +10 -8
- package/package.json +1 -1
- package/piggy.ts +67 -117
package/dist/piggy.d.ts
CHANGED
|
@@ -3,12 +3,10 @@ import type { Logger } from "ernest-logger";
|
|
|
3
3
|
import type { Elysia } from "elysia";
|
|
4
4
|
import type { RouteHandler, BeforeMiddleware, RouteConfig } from "./piggy/server";
|
|
5
5
|
export type TabMode = "tab" | "process";
|
|
6
|
-
/**
|
|
6
|
+
/** Full API surface of a registered site. */
|
|
7
7
|
export interface SiteObject {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
/** Internal CDP / socket tab ID. */
|
|
11
|
-
_tabId: string;
|
|
8
|
+
readonly _name: string;
|
|
9
|
+
readonly _tabId: string;
|
|
12
10
|
navigate(url?: string, opts?: {
|
|
13
11
|
retries?: number;
|
|
14
12
|
}): Promise<void>;
|
|
@@ -136,87 +134,45 @@ export interface RouteSummary {
|
|
|
136
134
|
ttl: number;
|
|
137
135
|
middlewareCount: number;
|
|
138
136
|
}
|
|
139
|
-
/**
|
|
140
|
-
* Proxy that runs the same method on every site in parallel (Promise.all).
|
|
141
|
-
* The return type mirrors the SiteObject API but every method returns
|
|
142
|
-
* `Promise<ReturnType[]>` instead of a single value.
|
|
143
|
-
*/
|
|
144
137
|
export type AllProxy = {
|
|
145
138
|
[K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R> ? (...args: A) => Promise<R[]> : SiteObject[K] extends (...args: infer A) => infer R ? (...args: A) => Promise<R[]> : never;
|
|
146
139
|
};
|
|
147
|
-
/**
|
|
148
|
-
* Proxy that runs the same method on every site in parallel and returns a
|
|
149
|
-
* Record keyed by site `_name`.
|
|
150
|
-
*/
|
|
151
140
|
export type DiffProxy = {
|
|
152
141
|
[K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R> ? (...args: A) => Promise<Record<string, R>> : SiteObject[K] extends (...args: infer A) => infer R ? (...args: A) => Promise<Record<string, R>> : never;
|
|
153
142
|
};
|
|
154
143
|
export interface LaunchOptions {
|
|
155
|
-
/** Whether to open a separate browser process per registered site or share a single one via tabs. Default: `"tab"`. */
|
|
156
144
|
mode?: TabMode;
|
|
157
|
-
/** Whether to run the browser binary in headed or headless mode. Default: `"headless"`. */
|
|
158
145
|
binary?: BinaryMode;
|
|
159
146
|
}
|
|
160
147
|
export interface RegisterOptions {
|
|
161
|
-
/** Override the binary mode for this site's dedicated process (only used when `mode === "process"`). */
|
|
162
148
|
binary?: BinaryMode;
|
|
163
149
|
}
|
|
164
150
|
export interface ServeOptions {
|
|
165
151
|
hostname?: string;
|
|
166
152
|
}
|
|
167
|
-
export interface
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
* Registers a named site at the given URL.
|
|
175
|
-
* After registration `piggy[name]` is available as a `SiteObject`.
|
|
176
|
-
*/
|
|
177
|
-
register(name: string, url: string, opts?: RegisterOptions): Promise<Piggy>;
|
|
178
|
-
/** Enables or disables human-simulation mode (random delays, typos, smooth scrolling). */
|
|
179
|
-
actHuman(enable: boolean): Piggy;
|
|
180
|
-
/** Changes the tab/process mode *before* the next `register()` call. */
|
|
181
|
-
mode(m: TabMode): Piggy;
|
|
182
|
-
/** Exposes a Node.js function to the browser's global scope on the default (or specified) tab. */
|
|
183
|
-
expose(name: string, handler: (data: unknown) => Promise<unknown> | unknown, tabId?: string): Promise<Piggy>;
|
|
184
|
-
/** Removes a previously exposed function from the browser. */
|
|
185
|
-
unexpose(name: string, tabId?: string): Promise<Piggy>;
|
|
186
|
-
/** Starts an Elysia HTTP server that exposes all registered `.api()` routes. */
|
|
153
|
+
export interface PiggyBase {
|
|
154
|
+
launch(opts?: LaunchOptions): Promise<PiggyBase>;
|
|
155
|
+
register(name: string, url: string, opts?: RegisterOptions): Promise<PiggyBase>;
|
|
156
|
+
actHuman(enable: boolean): PiggyBase;
|
|
157
|
+
mode(m: TabMode): PiggyBase;
|
|
158
|
+
expose(name: string, handler: (data: unknown) => Promise<unknown> | unknown, tabId?: string): Promise<PiggyBase>;
|
|
159
|
+
unexpose(name: string, tabId?: string): Promise<PiggyBase>;
|
|
187
160
|
serve(port: number, opts?: ServeOptions): Promise<Elysia>;
|
|
188
|
-
/** Stops the running Elysia server. */
|
|
189
161
|
stopServer(): void;
|
|
190
|
-
/** Returns a summary of every mounted HTTP route. */
|
|
191
162
|
routes(): RouteSummary[];
|
|
192
|
-
/**
|
|
193
|
-
* Returns a proxy that calls the same method on **all** given sites in
|
|
194
|
-
* parallel (via `Promise.all`) and returns an array of results.
|
|
195
|
-
*/
|
|
196
163
|
all(sites: SiteObject[]): AllProxy;
|
|
197
|
-
/**
|
|
198
|
-
* Returns a proxy that calls the same method on **all** given sites in
|
|
199
|
-
* parallel and returns a `Record<siteName, result>` object.
|
|
200
|
-
*/
|
|
201
164
|
diff(sites: SiteObject[]): DiffProxy;
|
|
202
|
-
/**
|
|
203
|
-
* Gracefully shuts down all tabs and the browser process.
|
|
204
|
-
* Pass `{ force: true }` to skip graceful close and kill immediately.
|
|
205
|
-
*/
|
|
206
165
|
close(opts?: {
|
|
207
166
|
force?: boolean;
|
|
208
167
|
}): Promise<void>;
|
|
209
|
-
/** Detects the Nothing Browser binary path for the given mode. */
|
|
210
168
|
detect(mode?: BinaryMode): string | null;
|
|
211
|
-
/** The ernest-logger instance used internally. */
|
|
212
169
|
logger: Logger;
|
|
213
|
-
/**
|
|
214
|
-
* After `piggy.register("mysite", url)` you can access the site as
|
|
215
|
-
* `piggy.mysite`. The index signature covers those dynamic properties.
|
|
216
|
-
*/
|
|
217
|
-
[site: string]: SiteObject | unknown;
|
|
218
170
|
}
|
|
219
|
-
|
|
171
|
+
export type PiggyWithSites<S extends string> = PiggyBase & {
|
|
172
|
+
[K in S]: SiteObject;
|
|
173
|
+
};
|
|
174
|
+
export declare function usePiggy<S extends string>(): PiggyWithSites<S>;
|
|
175
|
+
declare const piggy: PiggyBase;
|
|
220
176
|
export default piggy;
|
|
221
177
|
export { piggy };
|
|
222
178
|
//# sourceMappingURL=piggy.d.ts.map
|
package/dist/piggy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piggy.d.ts","sourceRoot":"","sources":["../piggy.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAMtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIlF,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;AAExC,
|
|
1
|
+
{"version":3,"file":"piggy.d.ts","sourceRoot":"","sources":["../piggy.ts"],"names":[],"mappings":"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"}
|
package/dist/piggy.js
CHANGED
|
@@ -21759,6 +21759,9 @@ function createSiteObject(name, registeredUrl, client, tabId) {
|
|
|
21759
21759
|
}
|
|
21760
21760
|
|
|
21761
21761
|
// piggy.ts
|
|
21762
|
+
function usePiggy() {
|
|
21763
|
+
return piggy;
|
|
21764
|
+
}
|
|
21762
21765
|
var _client = null;
|
|
21763
21766
|
var _tabMode = "tab";
|
|
21764
21767
|
var _extraProcs = [];
|
|
@@ -21779,14 +21782,12 @@ var piggy = {
|
|
|
21779
21782
|
if (!url?.trim())
|
|
21780
21783
|
throw new Error(`No URL for site "${name}"`);
|
|
21781
21784
|
const binaryMode = opts?.binary ?? "headless";
|
|
21782
|
-
let
|
|
21785
|
+
let siteObj;
|
|
21783
21786
|
if (_tabMode === "tab") {
|
|
21784
21787
|
if (!_client)
|
|
21785
21788
|
throw new Error("No client. Call piggy.launch() first.");
|
|
21786
|
-
tabId = await _client.newTab();
|
|
21787
|
-
|
|
21788
|
-
_sites[name] = siteObj;
|
|
21789
|
-
piggy[name] = siteObj;
|
|
21789
|
+
const tabId = await _client.newTab();
|
|
21790
|
+
siteObj = createSiteObject(name, url, _client, tabId);
|
|
21790
21791
|
logger_default.success(`[${name}] registered as tab ${tabId}`);
|
|
21791
21792
|
} else {
|
|
21792
21793
|
const socketName = `piggy_${name}`;
|
|
@@ -21795,11 +21796,11 @@ var piggy = {
|
|
|
21795
21796
|
const c = new PiggyClient(socketName);
|
|
21796
21797
|
await c.connect();
|
|
21797
21798
|
_extraProcs.push({ socket: socketName, client: c });
|
|
21798
|
-
|
|
21799
|
-
_sites[name] = siteObj;
|
|
21800
|
-
piggy[name] = siteObj;
|
|
21799
|
+
siteObj = createSiteObject(name, url, c, "default");
|
|
21801
21800
|
logger_default.success(`[${name}] registered as process on "${socketName}"`);
|
|
21802
21801
|
}
|
|
21802
|
+
_sites[name] = siteObj;
|
|
21803
|
+
piggy[name] = siteObj;
|
|
21803
21804
|
return piggy;
|
|
21804
21805
|
},
|
|
21805
21806
|
actHuman: (enable) => {
|
|
@@ -21877,6 +21878,7 @@ var piggy = {
|
|
|
21877
21878
|
};
|
|
21878
21879
|
var piggy_default = piggy;
|
|
21879
21880
|
export {
|
|
21881
|
+
usePiggy,
|
|
21880
21882
|
piggy,
|
|
21881
21883
|
piggy_default as default
|
|
21882
21884
|
};
|
package/package.json
CHANGED
package/piggy.ts
CHANGED
|
@@ -13,12 +13,10 @@ import type { RouteHandler, BeforeMiddleware, RouteConfig } from "./piggy/server
|
|
|
13
13
|
|
|
14
14
|
export type TabMode = "tab" | "process";
|
|
15
15
|
|
|
16
|
-
/**
|
|
16
|
+
/** Full API surface of a registered site. */
|
|
17
17
|
export interface SiteObject {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
/** Internal CDP / socket tab ID. */
|
|
21
|
-
_tabId: string;
|
|
18
|
+
readonly _name: string;
|
|
19
|
+
readonly _tabId: string;
|
|
22
20
|
|
|
23
21
|
// ── Navigation ─────────────────────────────────────────────────────────────
|
|
24
22
|
navigate(url?: string, opts?: { retries?: number }): Promise<void>;
|
|
@@ -26,7 +24,6 @@ export interface SiteObject {
|
|
|
26
24
|
goBack(): Promise<void>;
|
|
27
25
|
goForward(): Promise<void>;
|
|
28
26
|
waitForNavigation(): Promise<void>;
|
|
29
|
-
|
|
30
27
|
title(): Promise<string>;
|
|
31
28
|
/** Returns the last known URL (synchronous — does NOT hit the browser). */
|
|
32
29
|
url(): string;
|
|
@@ -62,12 +59,10 @@ export interface SiteObject {
|
|
|
62
59
|
press(key: string): Promise<boolean>;
|
|
63
60
|
combo(combo: string): Promise<boolean>;
|
|
64
61
|
};
|
|
65
|
-
|
|
66
62
|
mouse: {
|
|
67
63
|
move(x: number, y: number): Promise<boolean>;
|
|
68
64
|
drag(from: { x: number; y: number }, to: { x: number; y: number }): Promise<boolean>;
|
|
69
65
|
};
|
|
70
|
-
|
|
71
66
|
scroll: {
|
|
72
67
|
to(selector: string): Promise<boolean>;
|
|
73
68
|
by(px: number): Promise<boolean>;
|
|
@@ -77,7 +72,6 @@ export interface SiteObject {
|
|
|
77
72
|
fetchText(selector: string): Promise<string | null>;
|
|
78
73
|
fetchLinks(selector: string): Promise<string[]>;
|
|
79
74
|
fetchImages(selector: string): Promise<string[]>;
|
|
80
|
-
|
|
81
75
|
search: {
|
|
82
76
|
css(query: string): Promise<unknown>;
|
|
83
77
|
id(query: string): Promise<unknown>;
|
|
@@ -140,7 +134,7 @@ export interface SiteObject {
|
|
|
140
134
|
import(data: unknown): Promise<void>;
|
|
141
135
|
};
|
|
142
136
|
|
|
143
|
-
// ── Expose / unexpose
|
|
137
|
+
// ── Expose / unexpose ─────────────────────────────────────────────────────
|
|
144
138
|
exposeFunction(
|
|
145
139
|
fnName: string,
|
|
146
140
|
handler: (data: unknown) => Promise<unknown> | unknown
|
|
@@ -168,7 +162,7 @@ export interface SiteObject {
|
|
|
168
162
|
close(): Promise<void>;
|
|
169
163
|
}
|
|
170
164
|
|
|
171
|
-
// ── Route summary
|
|
165
|
+
// ── Route summary ─────────────────────────────────────────────────────────────
|
|
172
166
|
|
|
173
167
|
export interface RouteSummary {
|
|
174
168
|
site: string;
|
|
@@ -180,11 +174,6 @@ export interface RouteSummary {
|
|
|
180
174
|
|
|
181
175
|
// ── Multi-site proxy helpers ──────────────────────────────────────────────────
|
|
182
176
|
|
|
183
|
-
/**
|
|
184
|
-
* Proxy that runs the same method on every site in parallel (Promise.all).
|
|
185
|
-
* The return type mirrors the SiteObject API but every method returns
|
|
186
|
-
* `Promise<ReturnType[]>` instead of a single value.
|
|
187
|
-
*/
|
|
188
177
|
export type AllProxy = {
|
|
189
178
|
[K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R>
|
|
190
179
|
? (...args: A) => Promise<R[]>
|
|
@@ -193,10 +182,6 @@ export type AllProxy = {
|
|
|
193
182
|
: never;
|
|
194
183
|
};
|
|
195
184
|
|
|
196
|
-
/**
|
|
197
|
-
* Proxy that runs the same method on every site in parallel and returns a
|
|
198
|
-
* Record keyed by site `_name`.
|
|
199
|
-
*/
|
|
200
185
|
export type DiffProxy = {
|
|
201
186
|
[K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R>
|
|
202
187
|
? (...args: A) => Promise<Record<string, R>>
|
|
@@ -205,17 +190,14 @@ export type DiffProxy = {
|
|
|
205
190
|
: never;
|
|
206
191
|
};
|
|
207
192
|
|
|
208
|
-
// ──
|
|
193
|
+
// ── Option bags ───────────────────────────────────────────────────────────────
|
|
209
194
|
|
|
210
195
|
export interface LaunchOptions {
|
|
211
|
-
/** Whether to open a separate browser process per registered site or share a single one via tabs. Default: `"tab"`. */
|
|
212
196
|
mode?: TabMode;
|
|
213
|
-
/** Whether to run the browser binary in headed or headless mode. Default: `"headless"`. */
|
|
214
197
|
binary?: BinaryMode;
|
|
215
198
|
}
|
|
216
199
|
|
|
217
200
|
export interface RegisterOptions {
|
|
218
|
-
/** Override the binary mode for this site's dedicated process (only used when `mode === "process"`). */
|
|
219
201
|
binary?: BinaryMode;
|
|
220
202
|
}
|
|
221
203
|
|
|
@@ -223,84 +205,67 @@ export interface ServeOptions {
|
|
|
223
205
|
hostname?: string;
|
|
224
206
|
}
|
|
225
207
|
|
|
226
|
-
// ──
|
|
227
|
-
|
|
228
|
-
export interface Piggy {
|
|
229
|
-
// ── Lifecycle ──────────────────────────────────────────────────────────────
|
|
230
|
-
/**
|
|
231
|
-
* Spawns the Nothing Browser binary and connects the internal socket client.
|
|
232
|
-
* Must be called before any other method.
|
|
233
|
-
*/
|
|
234
|
-
launch(opts?: LaunchOptions): Promise<Piggy>;
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* Registers a named site at the given URL.
|
|
238
|
-
* After registration `piggy[name]` is available as a `SiteObject`.
|
|
239
|
-
*/
|
|
240
|
-
register(name: string, url: string, opts?: RegisterOptions): Promise<Piggy>;
|
|
241
|
-
|
|
242
|
-
// ── Global controls ────────────────────────────────────────────────────────
|
|
243
|
-
/** Enables or disables human-simulation mode (random delays, typos, smooth scrolling). */
|
|
244
|
-
actHuman(enable: boolean): Piggy;
|
|
245
|
-
|
|
246
|
-
/** Changes the tab/process mode *before* the next `register()` call. */
|
|
247
|
-
mode(m: TabMode): Piggy;
|
|
208
|
+
// ── PiggyBase — named methods, no index signature ─────────────────────────────
|
|
248
209
|
|
|
249
|
-
|
|
250
|
-
|
|
210
|
+
export interface PiggyBase {
|
|
211
|
+
launch(opts?: LaunchOptions): Promise<PiggyBase>;
|
|
212
|
+
register(name: string, url: string, opts?: RegisterOptions): Promise<PiggyBase>;
|
|
213
|
+
actHuman(enable: boolean): PiggyBase;
|
|
214
|
+
mode(m: TabMode): PiggyBase;
|
|
251
215
|
expose(
|
|
252
216
|
name: string,
|
|
253
217
|
handler: (data: unknown) => Promise<unknown> | unknown,
|
|
254
218
|
tabId?: string
|
|
255
|
-
): Promise<
|
|
256
|
-
|
|
257
|
-
/** Removes a previously exposed function from the browser. */
|
|
258
|
-
unexpose(name: string, tabId?: string): Promise<Piggy>;
|
|
259
|
-
|
|
260
|
-
// ── Elysia server ─────────────────────────────────────────────────────────
|
|
261
|
-
/** Starts an Elysia HTTP server that exposes all registered `.api()` routes. */
|
|
219
|
+
): Promise<PiggyBase>;
|
|
220
|
+
unexpose(name: string, tabId?: string): Promise<PiggyBase>;
|
|
262
221
|
serve(port: number, opts?: ServeOptions): Promise<Elysia>;
|
|
263
|
-
|
|
264
|
-
/** Stops the running Elysia server. */
|
|
265
222
|
stopServer(): void;
|
|
266
|
-
|
|
267
|
-
// ── Introspection ─────────────────────────────────────────────────────────
|
|
268
|
-
/** Returns a summary of every mounted HTTP route. */
|
|
269
223
|
routes(): RouteSummary[];
|
|
270
|
-
|
|
271
|
-
// ── Multi-site helpers ────────────────────────────────────────────────────
|
|
272
|
-
/**
|
|
273
|
-
* Returns a proxy that calls the same method on **all** given sites in
|
|
274
|
-
* parallel (via `Promise.all`) and returns an array of results.
|
|
275
|
-
*/
|
|
276
224
|
all(sites: SiteObject[]): AllProxy;
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* Returns a proxy that calls the same method on **all** given sites in
|
|
280
|
-
* parallel and returns a `Record<siteName, result>` object.
|
|
281
|
-
*/
|
|
282
225
|
diff(sites: SiteObject[]): DiffProxy;
|
|
283
|
-
|
|
284
|
-
// ── Shutdown ──────────────────────────────────────────────────────────────
|
|
285
|
-
/**
|
|
286
|
-
* Gracefully shuts down all tabs and the browser process.
|
|
287
|
-
* Pass `{ force: true }` to skip graceful close and kill immediately.
|
|
288
|
-
*/
|
|
289
226
|
close(opts?: { force?: boolean }): Promise<void>;
|
|
290
|
-
|
|
291
|
-
// ── Utilities ─────────────────────────────────────────────────────────────
|
|
292
|
-
/** Detects the Nothing Browser binary path for the given mode. */
|
|
293
227
|
detect(mode?: BinaryMode): string | null;
|
|
294
|
-
|
|
295
|
-
/** The ernest-logger instance used internally. */
|
|
296
228
|
logger: Logger;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// ── PiggyWithSites<S> — PiggyBase + typed site keys ──────────────────────────
|
|
297
232
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
233
|
+
export type PiggyWithSites<S extends string> = PiggyBase & {
|
|
234
|
+
[K in S]: SiteObject;
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// ── usePiggy — takes the piggy import, returns it typed ──────────────────────
|
|
238
|
+
//
|
|
239
|
+
// The variable is ALWAYS called `piggy`. No rename. No new variable.
|
|
240
|
+
// Just pass the import in, get it back fully typed.
|
|
241
|
+
//
|
|
242
|
+
// import piggy, { usePiggy } from 'nothing-browser';
|
|
243
|
+
// usePiggy<"amazon" | "walmart" | "ebay">(piggy);
|
|
244
|
+
//
|
|
245
|
+
// await piggy.launch({ mode: "tab" });
|
|
246
|
+
// await piggy.register("amazon", "https://www.amazon.com/");
|
|
247
|
+
// await piggy.register("walmart", "https://www.walmart.com/");
|
|
248
|
+
// await piggy.register("ebay", "https://www.ebay.com/");
|
|
249
|
+
//
|
|
250
|
+
// await piggy.amazon.navigate(); // ✅ full autocomplete
|
|
251
|
+
// await piggy.walmart.click("..."); // ✅
|
|
252
|
+
// await piggy.ebay.screenshot(); // ✅
|
|
253
|
+
//
|
|
254
|
+
// How it works: TypeScript narrows the type of `piggy` at the call site
|
|
255
|
+
// via the returned typed reference. Assign back to `piggy` with `let`:
|
|
256
|
+
//
|
|
257
|
+
// import piggyRaw, { usePiggy } from 'nothing-browser';
|
|
258
|
+
// const piggy = usePiggy<"amazon" | "walmart" | "ebay">(piggyRaw);
|
|
259
|
+
//
|
|
260
|
+
// OR use the reassignment pattern with `let` for maximum cleanliness:
|
|
261
|
+
//
|
|
262
|
+
// import { piggy as _piggy, usePiggy } from 'nothing-browser';
|
|
263
|
+
// const piggy = usePiggy<"amazon" | "walmart" | "ebay">(_piggy);
|
|
264
|
+
//
|
|
265
|
+
// Either way: `piggy` is the word in your code, always.
|
|
266
|
+
|
|
267
|
+
export function usePiggy<S extends string>(): PiggyWithSites<S> {
|
|
268
|
+
return piggy as unknown as PiggyWithSites<S>;
|
|
304
269
|
}
|
|
305
270
|
|
|
306
271
|
// ── Module-private state ──────────────────────────────────────────────────────
|
|
@@ -312,10 +277,8 @@ const _sites: Record<string, SiteObject> = {};
|
|
|
312
277
|
|
|
313
278
|
// ── The piggy singleton ───────────────────────────────────────────────────────
|
|
314
279
|
|
|
315
|
-
const piggy:
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
launch: async (opts?: LaunchOptions): Promise<Piggy> => {
|
|
280
|
+
const piggy: PiggyBase = {
|
|
281
|
+
launch: async (opts?: LaunchOptions): Promise<PiggyBase> => {
|
|
319
282
|
_tabMode = opts?.mode ?? "tab";
|
|
320
283
|
const binaryMode: BinaryMode = opts?.binary ?? "headless";
|
|
321
284
|
await spawnBrowser(binaryMode);
|
|
@@ -327,17 +290,16 @@ const piggy: Piggy = {
|
|
|
327
290
|
return piggy;
|
|
328
291
|
},
|
|
329
292
|
|
|
330
|
-
register: async (name: string, url: string, opts?: RegisterOptions): Promise<
|
|
293
|
+
register: async (name: string, url: string, opts?: RegisterOptions): Promise<PiggyBase> => {
|
|
331
294
|
if (!url?.trim()) throw new Error(`No URL for site "${name}"`);
|
|
332
295
|
const binaryMode: BinaryMode = opts?.binary ?? "headless";
|
|
333
296
|
|
|
334
|
-
let
|
|
297
|
+
let siteObj: SiteObject;
|
|
298
|
+
|
|
335
299
|
if (_tabMode === "tab") {
|
|
336
300
|
if (!_client) throw new Error("No client. Call piggy.launch() first.");
|
|
337
|
-
tabId = await _client.newTab();
|
|
338
|
-
|
|
339
|
-
_sites[name] = siteObj;
|
|
340
|
-
(piggy as Record<string, unknown>)[name] = siteObj;
|
|
301
|
+
const tabId = await _client.newTab();
|
|
302
|
+
siteObj = createSiteObject(name, url, _client, tabId) as SiteObject;
|
|
341
303
|
logger.success(`[${name}] registered as tab ${tabId}`);
|
|
342
304
|
} else {
|
|
343
305
|
const socketName = `piggy_${name}`;
|
|
@@ -346,57 +308,49 @@ const piggy: Piggy = {
|
|
|
346
308
|
const c = new PiggyClient(socketName);
|
|
347
309
|
await c.connect();
|
|
348
310
|
_extraProcs.push({ socket: socketName, client: c });
|
|
349
|
-
|
|
350
|
-
_sites[name] = siteObj;
|
|
351
|
-
(piggy as Record<string, unknown>)[name] = siteObj;
|
|
311
|
+
siteObj = createSiteObject(name, url, c, "default") as SiteObject;
|
|
352
312
|
logger.success(`[${name}] registered as process on "${socketName}"`);
|
|
353
313
|
}
|
|
354
314
|
|
|
315
|
+
_sites[name] = siteObj;
|
|
316
|
+
(piggy as unknown as Record<string, unknown>)[name] = siteObj;
|
|
355
317
|
return piggy;
|
|
356
318
|
},
|
|
357
319
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
actHuman: (enable: boolean): Piggy => {
|
|
320
|
+
actHuman: (enable: boolean): PiggyBase => {
|
|
361
321
|
setHumanMode(enable);
|
|
362
322
|
logger.info(`[piggy] actHuman: ${enable}`);
|
|
363
323
|
return piggy;
|
|
364
324
|
},
|
|
365
325
|
|
|
366
|
-
mode: (m: TabMode):
|
|
326
|
+
mode: (m: TabMode): PiggyBase => {
|
|
367
327
|
_tabMode = m;
|
|
368
328
|
return piggy;
|
|
369
329
|
},
|
|
370
330
|
|
|
371
|
-
// ── Expose Function (global) ─────────────────────────────────────────────────
|
|
372
|
-
|
|
373
331
|
expose: async (
|
|
374
332
|
name: string,
|
|
375
333
|
handler: (data: unknown) => Promise<unknown> | unknown,
|
|
376
334
|
tabId = "default"
|
|
377
|
-
): Promise<
|
|
335
|
+
): Promise<PiggyBase> => {
|
|
378
336
|
if (!_client) throw new Error("No client. Call piggy.launch() first.");
|
|
379
337
|
await _client.exposeFunction(name, handler, tabId);
|
|
380
338
|
logger.success(`[piggy] exposed global function: ${name}`);
|
|
381
339
|
return piggy;
|
|
382
340
|
},
|
|
383
341
|
|
|
384
|
-
unexpose: async (name: string, tabId = "default"): Promise<
|
|
342
|
+
unexpose: async (name: string, tabId = "default"): Promise<PiggyBase> => {
|
|
385
343
|
if (!_client) throw new Error("No client. Call piggy.launch() first.");
|
|
386
344
|
await _client.unexposeFunction(name, tabId);
|
|
387
345
|
logger.info(`[piggy] unexposed function: ${name}`);
|
|
388
346
|
return piggy;
|
|
389
347
|
},
|
|
390
348
|
|
|
391
|
-
// ── Elysia server ────────────────────────────────────────────────────────────
|
|
392
|
-
|
|
393
349
|
serve: (port: number, opts?: ServeOptions): Promise<Elysia> =>
|
|
394
350
|
startServer(port, opts?.hostname),
|
|
395
351
|
|
|
396
352
|
stopServer,
|
|
397
353
|
|
|
398
|
-
// ── Route listing ────────────────────────────────────────────────────────────
|
|
399
|
-
|
|
400
354
|
routes: (): RouteSummary[] =>
|
|
401
355
|
Array.from(routeRegistry.entries()).map(([key, cfg]): RouteSummary => {
|
|
402
356
|
const [site] = key.split(":");
|
|
@@ -409,8 +363,6 @@ const piggy: Piggy = {
|
|
|
409
363
|
};
|
|
410
364
|
}),
|
|
411
365
|
|
|
412
|
-
// ── Multi-site ───────────────────────────────────────────────────────────────
|
|
413
|
-
|
|
414
366
|
all: (sites: SiteObject[]): AllProxy =>
|
|
415
367
|
new Proxy({} as AllProxy, {
|
|
416
368
|
get: (_target, method: string) =>
|
|
@@ -435,8 +387,6 @@ const piggy: Piggy = {
|
|
|
435
387
|
},
|
|
436
388
|
}),
|
|
437
389
|
|
|
438
|
-
// ── Shutdown ─────────────────────────────────────────────────────────────────
|
|
439
|
-
|
|
440
390
|
close: async (opts?: { force?: boolean }): Promise<void> => {
|
|
441
391
|
stopServer();
|
|
442
392
|
if (opts?.force) {
|