nothing-browser 0.0.14 → 0.0.15
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/cache/memory.d.ts +1 -0
- package/dist/piggy/cache/memory.d.ts.map +1 -0
- package/dist/piggy/client/index.d.ts +1 -0
- package/dist/piggy/client/index.d.ts.map +1 -0
- package/dist/piggy/human/index.d.ts +1 -0
- package/dist/piggy/human/index.d.ts.map +1 -0
- package/dist/piggy/intercept/scripts.d.ts +1 -0
- package/dist/piggy/intercept/scripts.d.ts.map +1 -0
- package/dist/piggy/launch/detect.d.ts +1 -0
- package/dist/piggy/launch/detect.d.ts.map +1 -0
- package/dist/piggy/launch/spawn.d.ts +1 -0
- package/dist/piggy/launch/spawn.d.ts.map +1 -0
- package/dist/piggy/logger/index.d.ts +1 -0
- package/dist/piggy/logger/index.d.ts.map +1 -0
- package/dist/piggy/open/index.d.ts +1 -0
- package/dist/piggy/open/index.d.ts.map +1 -0
- package/dist/piggy/register/index.d.ts +1 -0
- package/dist/piggy/register/index.d.ts.map +1 -0
- package/dist/piggy/server/index.d.ts +1 -0
- package/dist/piggy/server/index.d.ts.map +1 -0
- package/dist/piggy.d.ts +220 -1
- package/dist/piggy.d.ts.map +1 -0
- package/dist/piggy.js +3 -3
- package/package.json +25 -15
- package/piggy.ts +344 -33
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../piggy/cache/memory.ts"],"names":[],"mappings":"AASA,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAQ3C;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,QAExD;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,QAE9B;AAED,wBAAgB,KAAK,SAEpB;AAED,wBAAgB,IAAI,WAEnB;AAED,wBAAgB,IAAI,aAEnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../piggy/client/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../piggy/human/index.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA0CxD"}
|
|
@@ -10,3 +10,4 @@ export declare function buildRespondScript(pattern: string, status: number, cont
|
|
|
10
10
|
* or an empty object {} to pass through unchanged.
|
|
11
11
|
*/
|
|
12
12
|
export declare function buildModifyResponseScript(pattern: string, exposedFnName: string): string;
|
|
13
|
+
//# sourceMappingURL=scripts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../../../piggy/intercept/scripts.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,MAAM,CAyER;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CA0DxF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../piggy/launch/detect.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAOhD,wBAAgB,YAAY,CAAC,IAAI,GAAE,UAAuB,GAAG,MAAM,GAAG,IAAI,CA+BzE"}
|
|
@@ -3,3 +3,4 @@ export declare function killAllBrowsers(): void;
|
|
|
3
3
|
export declare function spawnBrowser(mode?: BinaryMode): Promise<string>;
|
|
4
4
|
export declare function spawnBrowserOnSocket(socketName: string, mode?: BinaryMode): Promise<void>;
|
|
5
5
|
export declare function killBrowser(): void;
|
|
6
|
+
//# sourceMappingURL=spawn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../piggy/launch/spawn.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AASzD,wBAAgB,eAAe,IAAI,IAAI,CAiBtC;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,UAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqEjF;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,UAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED,wBAAgB,WAAW,IAAI,IAAI,CAmBlC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../piggy/logger/index.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,gCAiDV,CAAC;AAKH,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../piggy/open/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,IAAI;;EAI3B"}
|
|
@@ -4,3 +4,4 @@ export declare function setClient(c: PiggyClient | null): void;
|
|
|
4
4
|
export declare function setHumanMode(v: boolean): void;
|
|
5
5
|
export declare function createSiteObject(name: string, registeredUrl: string, client: PiggyClient, tabId: string): any;
|
|
6
6
|
export declare function createExposedAPI<T extends Record<string, (data: any) => any>>(site: any, apiName: string, handlers: T): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../piggy/register/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,eAAO,IAAI,SAAS,SAAQ,CAAC;AAE7B,wBAAgB,SAAS,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,QAAuB;AACtE,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,QAAoB;AAgB3D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,OAmcvG;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CASrI"}
|
|
@@ -18,3 +18,4 @@ export declare const routeRegistry: Map<string, RouteConfig>;
|
|
|
18
18
|
export declare const keepAliveSites: Set<string>;
|
|
19
19
|
export declare function startServer(port: number, hostname?: string): Promise<Elysia>;
|
|
20
20
|
export declare function stopServer(): void;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../piggy/server/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,GAAG,EAAE,GAAG,CAAC;CACV,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3B,MAAM,MAAM,YAAY,GAAG,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,IAAI,EAAE,GAAG,KACN,OAAO,CAAC,GAAG,CAAC,CAAC;AAElB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,aAAa,0BAAiC,CAAC;AAC5D,eAAO,MAAM,cAAc,aAAoB,CAAC;AAmBhD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAoFrF;AAED,wBAAgB,UAAU,SAGzB"}
|
package/dist/piggy.d.ts
CHANGED
|
@@ -1,3 +1,222 @@
|
|
|
1
|
-
|
|
1
|
+
import { type BinaryMode } from "./piggy/launch/detect";
|
|
2
|
+
import type { Logger } from "ernest-logger";
|
|
3
|
+
import type { Elysia } from "elysia";
|
|
4
|
+
import type { RouteHandler, BeforeMiddleware, RouteConfig } from "./piggy/server";
|
|
5
|
+
export type TabMode = "tab" | "process";
|
|
6
|
+
/** Returned by createSiteObject — full API surface of a registered site. */
|
|
7
|
+
export interface SiteObject {
|
|
8
|
+
/** Internal name used when registering. */
|
|
9
|
+
_name: string;
|
|
10
|
+
/** Internal CDP / socket tab ID. */
|
|
11
|
+
_tabId: string;
|
|
12
|
+
navigate(url?: string, opts?: {
|
|
13
|
+
retries?: number;
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
reload(): Promise<void>;
|
|
16
|
+
goBack(): Promise<void>;
|
|
17
|
+
goForward(): Promise<void>;
|
|
18
|
+
waitForNavigation(): Promise<void>;
|
|
19
|
+
title(): Promise<string>;
|
|
20
|
+
/** Returns the last known URL (synchronous — does NOT hit the browser). */
|
|
21
|
+
url(): string;
|
|
22
|
+
content(): Promise<string>;
|
|
23
|
+
wait(ms: number): Promise<void>;
|
|
24
|
+
waitForSelector(selector: string, timeout?: number): Promise<void>;
|
|
25
|
+
waitForVisible(selector: string, timeout?: number): Promise<void>;
|
|
26
|
+
waitForResponse(pattern: string, timeout?: number): Promise<void>;
|
|
27
|
+
addInitScript(js: string | (() => void)): Promise<SiteObject>;
|
|
28
|
+
on(event: "navigate", handler: (url: string) => void): () => void;
|
|
29
|
+
on(event: string, handler: (data: unknown) => void): () => void;
|
|
30
|
+
off(event: string, handler: (data: unknown) => void): void;
|
|
31
|
+
click(selector: string, opts?: {
|
|
32
|
+
retries?: number;
|
|
33
|
+
timeout?: number;
|
|
34
|
+
}): Promise<boolean>;
|
|
35
|
+
doubleClick(selector: string): Promise<boolean>;
|
|
36
|
+
hover(selector: string): Promise<boolean>;
|
|
37
|
+
type(selector: string, text: string, opts?: {
|
|
38
|
+
delay?: number;
|
|
39
|
+
retries?: number;
|
|
40
|
+
fact?: boolean;
|
|
41
|
+
wpm?: number;
|
|
42
|
+
}): Promise<boolean>;
|
|
43
|
+
select(selector: string, value: string): Promise<boolean>;
|
|
44
|
+
evaluate<T = unknown>(js: string | ((...args: unknown[]) => T), ...args: unknown[]): Promise<T>;
|
|
45
|
+
keyboard: {
|
|
46
|
+
press(key: string): Promise<boolean>;
|
|
47
|
+
combo(combo: string): Promise<boolean>;
|
|
48
|
+
};
|
|
49
|
+
mouse: {
|
|
50
|
+
move(x: number, y: number): Promise<boolean>;
|
|
51
|
+
drag(from: {
|
|
52
|
+
x: number;
|
|
53
|
+
y: number;
|
|
54
|
+
}, to: {
|
|
55
|
+
x: number;
|
|
56
|
+
y: number;
|
|
57
|
+
}): Promise<boolean>;
|
|
58
|
+
};
|
|
59
|
+
scroll: {
|
|
60
|
+
to(selector: string): Promise<boolean>;
|
|
61
|
+
by(px: number): Promise<boolean>;
|
|
62
|
+
};
|
|
63
|
+
fetchText(selector: string): Promise<string | null>;
|
|
64
|
+
fetchLinks(selector: string): Promise<string[]>;
|
|
65
|
+
fetchImages(selector: string): Promise<string[]>;
|
|
66
|
+
search: {
|
|
67
|
+
css(query: string): Promise<unknown>;
|
|
68
|
+
id(query: string): Promise<unknown>;
|
|
69
|
+
};
|
|
70
|
+
screenshot(filePath?: string): Promise<string>;
|
|
71
|
+
pdf(filePath?: string): Promise<string>;
|
|
72
|
+
blockImages(): Promise<void>;
|
|
73
|
+
unblockImages(): Promise<void>;
|
|
74
|
+
cookies: {
|
|
75
|
+
set(name: string, value: string, domain: string, path?: string): Promise<void>;
|
|
76
|
+
get(name: string): Promise<unknown>;
|
|
77
|
+
delete(name: string): Promise<void>;
|
|
78
|
+
list(): Promise<unknown[]>;
|
|
79
|
+
};
|
|
80
|
+
intercept: {
|
|
81
|
+
block(pattern: string): Promise<void>;
|
|
82
|
+
redirect(pattern: string, redirectUrl: string): Promise<void>;
|
|
83
|
+
headers(pattern: string, headers: Record<string, string>): Promise<void>;
|
|
84
|
+
respond(pattern: string, handlerOrResponse: {
|
|
85
|
+
status?: number;
|
|
86
|
+
contentType?: string;
|
|
87
|
+
body: string;
|
|
88
|
+
} | ((req: {
|
|
89
|
+
url: string;
|
|
90
|
+
method: string;
|
|
91
|
+
}) => {
|
|
92
|
+
status?: number;
|
|
93
|
+
contentType?: string;
|
|
94
|
+
body: string;
|
|
95
|
+
})): Promise<SiteObject>;
|
|
96
|
+
modifyResponse(pattern: string, handler: (response: {
|
|
97
|
+
body: string;
|
|
98
|
+
status: number;
|
|
99
|
+
headers: Record<string, string>;
|
|
100
|
+
}) => Promise<{
|
|
101
|
+
body?: string;
|
|
102
|
+
status?: number;
|
|
103
|
+
headers?: Record<string, string>;
|
|
104
|
+
} | void> | void): Promise<SiteObject>;
|
|
105
|
+
clear(): Promise<void>;
|
|
106
|
+
};
|
|
107
|
+
capture: {
|
|
108
|
+
start(): Promise<void>;
|
|
109
|
+
stop(): Promise<void>;
|
|
110
|
+
requests(): Promise<unknown[]>;
|
|
111
|
+
ws(): Promise<unknown[]>;
|
|
112
|
+
cookies(): Promise<unknown[]>;
|
|
113
|
+
storage(): Promise<unknown>;
|
|
114
|
+
clear(): Promise<void>;
|
|
115
|
+
};
|
|
116
|
+
session: {
|
|
117
|
+
export(): Promise<unknown>;
|
|
118
|
+
import(data: unknown): Promise<void>;
|
|
119
|
+
};
|
|
120
|
+
exposeFunction(fnName: string, handler: (data: unknown) => Promise<unknown> | unknown): Promise<SiteObject>;
|
|
121
|
+
unexposeFunction(fnName: string): Promise<SiteObject>;
|
|
122
|
+
clearExposedFunctions(): Promise<SiteObject>;
|
|
123
|
+
exposeAndInject(fnName: string, handler: (data: unknown) => Promise<unknown> | unknown, injectionJs: string | ((fnName: string) => string)): Promise<SiteObject>;
|
|
124
|
+
api(path: string, handler: RouteHandler, opts?: {
|
|
125
|
+
ttl?: number;
|
|
126
|
+
before?: BeforeMiddleware[];
|
|
127
|
+
method?: "GET" | "POST" | "PUT" | "DELETE";
|
|
128
|
+
}): SiteObject;
|
|
129
|
+
noclose(): SiteObject;
|
|
130
|
+
close(): Promise<void>;
|
|
131
|
+
}
|
|
132
|
+
export interface RouteSummary {
|
|
133
|
+
site: string;
|
|
134
|
+
method: RouteConfig["method"];
|
|
135
|
+
path: string;
|
|
136
|
+
ttl: number;
|
|
137
|
+
middlewareCount: number;
|
|
138
|
+
}
|
|
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
|
+
export type AllProxy = {
|
|
145
|
+
[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
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Proxy that runs the same method on every site in parallel and returns a
|
|
149
|
+
* Record keyed by site `_name`.
|
|
150
|
+
*/
|
|
151
|
+
export type DiffProxy = {
|
|
152
|
+
[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
|
+
};
|
|
154
|
+
export interface LaunchOptions {
|
|
155
|
+
/** Whether to open a separate browser process per registered site or share a single one via tabs. Default: `"tab"`. */
|
|
156
|
+
mode?: TabMode;
|
|
157
|
+
/** Whether to run the browser binary in headed or headless mode. Default: `"headless"`. */
|
|
158
|
+
binary?: BinaryMode;
|
|
159
|
+
}
|
|
160
|
+
export interface RegisterOptions {
|
|
161
|
+
/** Override the binary mode for this site's dedicated process (only used when `mode === "process"`). */
|
|
162
|
+
binary?: BinaryMode;
|
|
163
|
+
}
|
|
164
|
+
export interface ServeOptions {
|
|
165
|
+
hostname?: string;
|
|
166
|
+
}
|
|
167
|
+
export interface Piggy {
|
|
168
|
+
/**
|
|
169
|
+
* Spawns the Nothing Browser binary and connects the internal socket client.
|
|
170
|
+
* Must be called before any other method.
|
|
171
|
+
*/
|
|
172
|
+
launch(opts?: LaunchOptions): Promise<Piggy>;
|
|
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. */
|
|
187
|
+
serve(port: number, opts?: ServeOptions): Promise<Elysia>;
|
|
188
|
+
/** Stops the running Elysia server. */
|
|
189
|
+
stopServer(): void;
|
|
190
|
+
/** Returns a summary of every mounted HTTP route. */
|
|
191
|
+
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
|
+
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
|
+
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
|
+
close(opts?: {
|
|
207
|
+
force?: boolean;
|
|
208
|
+
}): Promise<void>;
|
|
209
|
+
/** Detects the Nothing Browser binary path for the given mode. */
|
|
210
|
+
detect(mode?: BinaryMode): string | null;
|
|
211
|
+
/** The ernest-logger instance used internally. */
|
|
212
|
+
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
|
+
}
|
|
219
|
+
declare const piggy: Piggy;
|
|
2
220
|
export default piggy;
|
|
3
221
|
export { piggy };
|
|
222
|
+
//# sourceMappingURL=piggy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"piggy.d.ts","sourceRoot":"","sources":["../piggy.ts"],"names":[],"mappings":"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"}
|
package/dist/piggy.js
CHANGED
|
@@ -21830,7 +21830,7 @@ var piggy = {
|
|
|
21830
21830
|
routes: () => Array.from(routeRegistry.entries()).map(([key, cfg]) => {
|
|
21831
21831
|
const [site] = key.split(":");
|
|
21832
21832
|
return {
|
|
21833
|
-
site,
|
|
21833
|
+
site: site ?? key,
|
|
21834
21834
|
method: cfg.method,
|
|
21835
21835
|
path: `/${site}${cfg.path}`,
|
|
21836
21836
|
ttl: cfg.ttl,
|
|
@@ -21838,10 +21838,10 @@ var piggy = {
|
|
|
21838
21838
|
};
|
|
21839
21839
|
}),
|
|
21840
21840
|
all: (sites) => new Proxy({}, {
|
|
21841
|
-
get: (
|
|
21841
|
+
get: (_target, method) => (...args) => Promise.all(sites.map((s) => s[method]?.(...args)))
|
|
21842
21842
|
}),
|
|
21843
21843
|
diff: (sites) => new Proxy({}, {
|
|
21844
|
-
get: (
|
|
21844
|
+
get: (_target, method) => async (...args) => {
|
|
21845
21845
|
const results = await Promise.all(sites.map((s) => s[method]?.(...args)));
|
|
21846
21846
|
return Object.fromEntries(sites.map((s, i) => [s._name ?? i, results[i]]));
|
|
21847
21847
|
}
|
package/package.json
CHANGED
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nothing-browser",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.15",
|
|
4
4
|
"description": "Browser automation library powered by Nothing Browser",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"homepage": "https://github.com/ernest-tech-house-co-operation/nothing-browser#readme",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/ernest-tech-house-co-operation/nothing-browser.git"
|
|
9
|
+
},
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/ernest-tech-house-co-operation/nothing-browser/issues"
|
|
12
|
+
},
|
|
13
|
+
"author": {
|
|
14
|
+
"name": "Pease Ernest",
|
|
15
|
+
"email": "pease@ernest.com",
|
|
16
|
+
"url": "https://github.com/ernest-tech-house-co-operation"
|
|
17
|
+
},
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"main": "./dist/piggy.js",
|
|
20
|
+
"types": "./dist/piggy.d.ts",
|
|
7
21
|
"exports": {
|
|
8
22
|
".": {
|
|
9
23
|
"bun": "./piggy.ts",
|
|
10
24
|
"node": "./dist/piggy.js",
|
|
11
|
-
"default": "./dist/piggy.js"
|
|
25
|
+
"default": "./dist/piggy.js",
|
|
26
|
+
"types": "./dist/piggy.d.ts"
|
|
12
27
|
},
|
|
13
28
|
"./register": {
|
|
14
29
|
"bun": "./piggy/register/index.ts",
|
|
@@ -26,16 +41,13 @@
|
|
|
26
41
|
"types": "./dist/logger/index.d.ts"
|
|
27
42
|
}
|
|
28
43
|
},
|
|
29
|
-
|
|
30
|
-
|
|
31
44
|
"scripts": {
|
|
32
|
-
"
|
|
45
|
+
"clean": "rm -rf dist",
|
|
46
|
+
"build:types": "tsc --project tsconfig.json --emitDeclarationOnly --outDir dist",
|
|
33
47
|
"build:js": "bun build ./piggy.ts --outdir ./dist --target node && bun build ./piggy/client/index.ts --outdir ./dist/client --target node && bun build ./piggy/register/index.ts --outdir ./dist/register --target node && bun build ./piggy/server/index.ts --outdir ./dist/server --target node && bun build ./piggy/logger/index.ts --outdir ./dist/logger --target node && bun build ./piggy/launch/detect.ts --outdir ./dist/launch --target node && bun build ./piggy/launch/spawn.ts --outdir ./dist/launch --target node && bun build ./piggy/cache/memory.ts --outdir ./dist/cache --target node && bun build ./piggy/human/index.ts --outdir ./dist/human --target node",
|
|
34
|
-
"build": "bun run build:types && bun run build:js",
|
|
48
|
+
"build": "bun run clean && bun run build:types && bun run build:js",
|
|
35
49
|
"prepublishOnly": "bun run build"
|
|
36
50
|
},
|
|
37
|
-
|
|
38
|
-
|
|
39
51
|
"dependencies": {
|
|
40
52
|
"elysia": "^1.0.0"
|
|
41
53
|
},
|
|
@@ -43,9 +55,9 @@
|
|
|
43
55
|
"elysia": "^1.0.0"
|
|
44
56
|
},
|
|
45
57
|
"devDependencies": {
|
|
46
|
-
"@types/node": "^
|
|
58
|
+
"@types/node": "^20.0.0",
|
|
47
59
|
"bun-types": "latest",
|
|
48
|
-
"typescript": "^
|
|
60
|
+
"typescript": "^5.8.0"
|
|
49
61
|
},
|
|
50
62
|
"engines": {
|
|
51
63
|
"node": ">=18.0.0",
|
|
@@ -66,7 +78,5 @@
|
|
|
66
78
|
"webdriver",
|
|
67
79
|
"chromium",
|
|
68
80
|
"nothing-browser"
|
|
69
|
-
]
|
|
70
|
-
"author": "",
|
|
71
|
-
"license": "MIT"
|
|
81
|
+
]
|
|
72
82
|
}
|
package/piggy.ts
CHANGED
|
@@ -5,24 +5,321 @@ import { PiggyClient } from "./piggy/client";
|
|
|
5
5
|
import { setClient, setHumanMode, createSiteObject } from "./piggy/register";
|
|
6
6
|
import { routeRegistry, keepAliveSites, startServer, stopServer } from "./piggy/server";
|
|
7
7
|
import logger from "./piggy/logger";
|
|
8
|
+
import type { Logger } from "ernest-logger";
|
|
9
|
+
import type { Elysia } from "elysia";
|
|
10
|
+
import type { RouteHandler, BeforeMiddleware, RouteConfig } from "./piggy/server";
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
12
|
+
// ── Core types ───────────────────────────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
export type TabMode = "tab" | "process";
|
|
15
|
+
|
|
16
|
+
/** Returned by createSiteObject — full API surface of a registered site. */
|
|
17
|
+
export interface SiteObject {
|
|
18
|
+
/** Internal name used when registering. */
|
|
19
|
+
_name: string;
|
|
20
|
+
/** Internal CDP / socket tab ID. */
|
|
21
|
+
_tabId: string;
|
|
22
|
+
|
|
23
|
+
// ── Navigation ─────────────────────────────────────────────────────────────
|
|
24
|
+
navigate(url?: string, opts?: { retries?: number }): Promise<void>;
|
|
25
|
+
reload(): Promise<void>;
|
|
26
|
+
goBack(): Promise<void>;
|
|
27
|
+
goForward(): Promise<void>;
|
|
28
|
+
waitForNavigation(): Promise<void>;
|
|
29
|
+
|
|
30
|
+
title(): Promise<string>;
|
|
31
|
+
/** Returns the last known URL (synchronous — does NOT hit the browser). */
|
|
32
|
+
url(): string;
|
|
33
|
+
content(): Promise<string>;
|
|
34
|
+
|
|
35
|
+
// ── Timing ────────────────────────────────────────────────────────────────
|
|
36
|
+
wait(ms: number): Promise<void>;
|
|
37
|
+
waitForSelector(selector: string, timeout?: number): Promise<void>;
|
|
38
|
+
waitForVisible(selector: string, timeout?: number): Promise<void>;
|
|
39
|
+
waitForResponse(pattern: string, timeout?: number): Promise<void>;
|
|
40
|
+
|
|
41
|
+
// ── Init script ───────────────────────────────────────────────────────────
|
|
42
|
+
addInitScript(js: string | (() => void)): Promise<SiteObject>;
|
|
43
|
+
|
|
44
|
+
// ── Event emitter ─────────────────────────────────────────────────────────
|
|
45
|
+
on(event: "navigate", handler: (url: string) => void): () => void;
|
|
46
|
+
on(event: string, handler: (data: unknown) => void): () => void;
|
|
47
|
+
off(event: string, handler: (data: unknown) => void): void;
|
|
48
|
+
|
|
49
|
+
// ── Interactions ──────────────────────────────────────────────────────────
|
|
50
|
+
click(selector: string, opts?: { retries?: number; timeout?: number }): Promise<boolean>;
|
|
51
|
+
doubleClick(selector: string): Promise<boolean>;
|
|
52
|
+
hover(selector: string): Promise<boolean>;
|
|
53
|
+
type(
|
|
54
|
+
selector: string,
|
|
55
|
+
text: string,
|
|
56
|
+
opts?: { delay?: number; retries?: number; fact?: boolean; wpm?: number }
|
|
57
|
+
): Promise<boolean>;
|
|
58
|
+
select(selector: string, value: string): Promise<boolean>;
|
|
59
|
+
evaluate<T = unknown>(js: string | ((...args: unknown[]) => T), ...args: unknown[]): Promise<T>;
|
|
60
|
+
|
|
61
|
+
keyboard: {
|
|
62
|
+
press(key: string): Promise<boolean>;
|
|
63
|
+
combo(combo: string): Promise<boolean>;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
mouse: {
|
|
67
|
+
move(x: number, y: number): Promise<boolean>;
|
|
68
|
+
drag(from: { x: number; y: number }, to: { x: number; y: number }): Promise<boolean>;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
scroll: {
|
|
72
|
+
to(selector: string): Promise<boolean>;
|
|
73
|
+
by(px: number): Promise<boolean>;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// ── Fetch ─────────────────────────────────────────────────────────────────
|
|
77
|
+
fetchText(selector: string): Promise<string | null>;
|
|
78
|
+
fetchLinks(selector: string): Promise<string[]>;
|
|
79
|
+
fetchImages(selector: string): Promise<string[]>;
|
|
80
|
+
|
|
81
|
+
search: {
|
|
82
|
+
css(query: string): Promise<unknown>;
|
|
83
|
+
id(query: string): Promise<unknown>;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// ── Screenshot / PDF ──────────────────────────────────────────────────────
|
|
87
|
+
screenshot(filePath?: string): Promise<string>;
|
|
88
|
+
pdf(filePath?: string): Promise<string>;
|
|
89
|
+
blockImages(): Promise<void>;
|
|
90
|
+
unblockImages(): Promise<void>;
|
|
91
|
+
|
|
92
|
+
// ── Cookies ───────────────────────────────────────────────────────────────
|
|
93
|
+
cookies: {
|
|
94
|
+
set(name: string, value: string, domain: string, path?: string): Promise<void>;
|
|
95
|
+
get(name: string): Promise<unknown>;
|
|
96
|
+
delete(name: string): Promise<void>;
|
|
97
|
+
list(): Promise<unknown[]>;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// ── Interception ──────────────────────────────────────────────────────────
|
|
101
|
+
intercept: {
|
|
102
|
+
block(pattern: string): Promise<void>;
|
|
103
|
+
redirect(pattern: string, redirectUrl: string): Promise<void>;
|
|
104
|
+
headers(pattern: string, headers: Record<string, string>): Promise<void>;
|
|
105
|
+
respond(
|
|
106
|
+
pattern: string,
|
|
107
|
+
handlerOrResponse:
|
|
108
|
+
| { status?: number; contentType?: string; body: string }
|
|
109
|
+
| ((req: { url: string; method: string }) => {
|
|
110
|
+
status?: number;
|
|
111
|
+
contentType?: string;
|
|
112
|
+
body: string;
|
|
113
|
+
})
|
|
114
|
+
): Promise<SiteObject>;
|
|
115
|
+
modifyResponse(
|
|
116
|
+
pattern: string,
|
|
117
|
+
handler: (response: {
|
|
118
|
+
body: string;
|
|
119
|
+
status: number;
|
|
120
|
+
headers: Record<string, string>;
|
|
121
|
+
}) => Promise<{ body?: string; status?: number; headers?: Record<string, string> } | void> | void
|
|
122
|
+
): Promise<SiteObject>;
|
|
123
|
+
clear(): Promise<void>;
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
// ── Network capture ───────────────────────────────────────────────────────
|
|
127
|
+
capture: {
|
|
128
|
+
start(): Promise<void>;
|
|
129
|
+
stop(): Promise<void>;
|
|
130
|
+
requests(): Promise<unknown[]>;
|
|
131
|
+
ws(): Promise<unknown[]>;
|
|
132
|
+
cookies(): Promise<unknown[]>;
|
|
133
|
+
storage(): Promise<unknown>;
|
|
134
|
+
clear(): Promise<void>;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// ── Session ───────────────────────────────────────────────────────────────
|
|
138
|
+
session: {
|
|
139
|
+
export(): Promise<unknown>;
|
|
140
|
+
import(data: unknown): Promise<void>;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// ── Expose / unexpose functions ───────────────────────────────────────────
|
|
144
|
+
exposeFunction(
|
|
145
|
+
fnName: string,
|
|
146
|
+
handler: (data: unknown) => Promise<unknown> | unknown
|
|
147
|
+
): Promise<SiteObject>;
|
|
148
|
+
unexposeFunction(fnName: string): Promise<SiteObject>;
|
|
149
|
+
clearExposedFunctions(): Promise<SiteObject>;
|
|
150
|
+
exposeAndInject(
|
|
151
|
+
fnName: string,
|
|
152
|
+
handler: (data: unknown) => Promise<unknown> | unknown,
|
|
153
|
+
injectionJs: string | ((fnName: string) => string)
|
|
154
|
+
): Promise<SiteObject>;
|
|
155
|
+
|
|
156
|
+
// ── Elysia route registration ─────────────────────────────────────────────
|
|
157
|
+
api(
|
|
158
|
+
path: string,
|
|
159
|
+
handler: RouteHandler,
|
|
160
|
+
opts?: {
|
|
161
|
+
ttl?: number;
|
|
162
|
+
before?: BeforeMiddleware[];
|
|
163
|
+
method?: "GET" | "POST" | "PUT" | "DELETE";
|
|
164
|
+
}
|
|
165
|
+
): SiteObject;
|
|
166
|
+
|
|
167
|
+
noclose(): SiteObject;
|
|
168
|
+
close(): Promise<void>;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// ── Route summary returned by piggy.routes() ─────────────────────────────────
|
|
172
|
+
|
|
173
|
+
export interface RouteSummary {
|
|
174
|
+
site: string;
|
|
175
|
+
method: RouteConfig["method"];
|
|
176
|
+
path: string;
|
|
177
|
+
ttl: number;
|
|
178
|
+
middlewareCount: number;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// ── Multi-site proxy helpers ──────────────────────────────────────────────────
|
|
182
|
+
|
|
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
|
+
export type AllProxy = {
|
|
189
|
+
[K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R>
|
|
190
|
+
? (...args: A) => Promise<R[]>
|
|
191
|
+
: SiteObject[K] extends (...args: infer A) => infer R
|
|
192
|
+
? (...args: A) => Promise<R[]>
|
|
193
|
+
: never;
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Proxy that runs the same method on every site in parallel and returns a
|
|
198
|
+
* Record keyed by site `_name`.
|
|
199
|
+
*/
|
|
200
|
+
export type DiffProxy = {
|
|
201
|
+
[K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R>
|
|
202
|
+
? (...args: A) => Promise<Record<string, R>>
|
|
203
|
+
: SiteObject[K] extends (...args: infer A) => infer R
|
|
204
|
+
? (...args: A) => Promise<Record<string, R>>
|
|
205
|
+
: never;
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
// ── Launch / register option bags ────────────────────────────────────────────
|
|
209
|
+
|
|
210
|
+
export interface LaunchOptions {
|
|
211
|
+
/** Whether to open a separate browser process per registered site or share a single one via tabs. Default: `"tab"`. */
|
|
212
|
+
mode?: TabMode;
|
|
213
|
+
/** Whether to run the browser binary in headed or headless mode. Default: `"headless"`. */
|
|
214
|
+
binary?: BinaryMode;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export interface RegisterOptions {
|
|
218
|
+
/** Override the binary mode for this site's dedicated process (only used when `mode === "process"`). */
|
|
219
|
+
binary?: BinaryMode;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export interface ServeOptions {
|
|
223
|
+
hostname?: string;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// ── The Piggy object type ─────────────────────────────────────────────────────
|
|
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;
|
|
248
|
+
|
|
249
|
+
// ── Global function exposure ───────────────────────────────────────────────
|
|
250
|
+
/** Exposes a Node.js function to the browser's global scope on the default (or specified) tab. */
|
|
251
|
+
expose(
|
|
252
|
+
name: string,
|
|
253
|
+
handler: (data: unknown) => Promise<unknown> | unknown,
|
|
254
|
+
tabId?: string
|
|
255
|
+
): Promise<Piggy>;
|
|
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. */
|
|
262
|
+
serve(port: number, opts?: ServeOptions): Promise<Elysia>;
|
|
263
|
+
|
|
264
|
+
/** Stops the running Elysia server. */
|
|
265
|
+
stopServer(): void;
|
|
266
|
+
|
|
267
|
+
// ── Introspection ─────────────────────────────────────────────────────────
|
|
268
|
+
/** Returns a summary of every mounted HTTP route. */
|
|
269
|
+
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
|
+
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
|
+
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
|
+
close(opts?: { force?: boolean }): Promise<void>;
|
|
290
|
+
|
|
291
|
+
// ── Utilities ─────────────────────────────────────────────────────────────
|
|
292
|
+
/** Detects the Nothing Browser binary path for the given mode. */
|
|
293
|
+
detect(mode?: BinaryMode): string | null;
|
|
294
|
+
|
|
295
|
+
/** The ernest-logger instance used internally. */
|
|
296
|
+
logger: Logger;
|
|
297
|
+
|
|
298
|
+
// ── Dynamic site keys ─────────────────────────────────────────────────────
|
|
299
|
+
/**
|
|
300
|
+
* After `piggy.register("mysite", url)` you can access the site as
|
|
301
|
+
* `piggy.mysite`. The index signature covers those dynamic properties.
|
|
302
|
+
*/
|
|
303
|
+
[site: string]: SiteObject | unknown;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// ── Module-private state ──────────────────────────────────────────────────────
|
|
11
307
|
|
|
12
308
|
let _client: PiggyClient | null = null;
|
|
13
309
|
let _tabMode: TabMode = "tab";
|
|
14
310
|
const _extraProcs: { socket: string; client: PiggyClient }[] = [];
|
|
15
311
|
const _sites: Record<string, SiteObject> = {};
|
|
16
312
|
|
|
17
|
-
//
|
|
18
|
-
|
|
313
|
+
// ── The piggy singleton ───────────────────────────────────────────────────────
|
|
314
|
+
|
|
315
|
+
const piggy: Piggy = {
|
|
19
316
|
// ── Lifecycle ───────────────────────────────────────────────────────────────
|
|
20
317
|
|
|
21
|
-
launch: async (opts?:
|
|
318
|
+
launch: async (opts?: LaunchOptions): Promise<Piggy> => {
|
|
22
319
|
_tabMode = opts?.mode ?? "tab";
|
|
23
320
|
const binaryMode: BinaryMode = opts?.binary ?? "headless";
|
|
24
321
|
await spawnBrowser(binaryMode);
|
|
25
|
-
await new Promise(r => setTimeout(r, 500));
|
|
322
|
+
await new Promise<void>((r) => setTimeout(r, 500));
|
|
26
323
|
_client = new PiggyClient();
|
|
27
324
|
await _client.connect();
|
|
28
325
|
setClient(_client);
|
|
@@ -30,7 +327,7 @@ const piggy: any = {
|
|
|
30
327
|
return piggy;
|
|
31
328
|
},
|
|
32
329
|
|
|
33
|
-
register: async (name: string, url: string, opts?:
|
|
330
|
+
register: async (name: string, url: string, opts?: RegisterOptions): Promise<Piggy> => {
|
|
34
331
|
if (!url?.trim()) throw new Error(`No URL for site "${name}"`);
|
|
35
332
|
const binaryMode: BinaryMode = opts?.binary ?? "headless";
|
|
36
333
|
|
|
@@ -38,21 +335,20 @@ const piggy: any = {
|
|
|
38
335
|
if (_tabMode === "tab") {
|
|
39
336
|
if (!_client) throw new Error("No client. Call piggy.launch() first.");
|
|
40
337
|
tabId = await _client.newTab();
|
|
41
|
-
|
|
42
|
-
const siteObj = createSiteObject(name, url, _client, tabId);
|
|
338
|
+
const siteObj: SiteObject = createSiteObject(name, url, _client, tabId);
|
|
43
339
|
_sites[name] = siteObj;
|
|
44
|
-
piggy[name] = siteObj;
|
|
340
|
+
(piggy as Record<string, unknown>)[name] = siteObj;
|
|
45
341
|
logger.success(`[${name}] registered as tab ${tabId}`);
|
|
46
342
|
} else {
|
|
47
343
|
const socketName = `piggy_${name}`;
|
|
48
344
|
await spawnBrowserOnSocket(socketName, binaryMode);
|
|
49
|
-
await new Promise(r => setTimeout(r, 500));
|
|
345
|
+
await new Promise<void>((r) => setTimeout(r, 500));
|
|
50
346
|
const c = new PiggyClient(socketName);
|
|
51
347
|
await c.connect();
|
|
52
348
|
_extraProcs.push({ socket: socketName, client: c });
|
|
53
|
-
const siteObj = createSiteObject(name, url, c, "default");
|
|
349
|
+
const siteObj: SiteObject = createSiteObject(name, url, c, "default");
|
|
54
350
|
_sites[name] = siteObj;
|
|
55
|
-
piggy[name] = siteObj;
|
|
351
|
+
(piggy as Record<string, unknown>)[name] = siteObj;
|
|
56
352
|
logger.success(`[${name}] registered as process on "${socketName}"`);
|
|
57
353
|
}
|
|
58
354
|
|
|
@@ -61,24 +357,31 @@ const piggy: any = {
|
|
|
61
357
|
|
|
62
358
|
// ── Global controls ─────────────────────────────────────────────────────────
|
|
63
359
|
|
|
64
|
-
actHuman: (enable: boolean) => {
|
|
360
|
+
actHuman: (enable: boolean): Piggy => {
|
|
65
361
|
setHumanMode(enable);
|
|
66
362
|
logger.info(`[piggy] actHuman: ${enable}`);
|
|
67
363
|
return piggy;
|
|
68
364
|
},
|
|
69
365
|
|
|
70
|
-
mode: (m: TabMode) => {
|
|
366
|
+
mode: (m: TabMode): Piggy => {
|
|
367
|
+
_tabMode = m;
|
|
368
|
+
return piggy;
|
|
369
|
+
},
|
|
71
370
|
|
|
72
371
|
// ── Expose Function (global) ─────────────────────────────────────────────────
|
|
73
372
|
|
|
74
|
-
expose: async (
|
|
373
|
+
expose: async (
|
|
374
|
+
name: string,
|
|
375
|
+
handler: (data: unknown) => Promise<unknown> | unknown,
|
|
376
|
+
tabId = "default"
|
|
377
|
+
): Promise<Piggy> => {
|
|
75
378
|
if (!_client) throw new Error("No client. Call piggy.launch() first.");
|
|
76
379
|
await _client.exposeFunction(name, handler, tabId);
|
|
77
380
|
logger.success(`[piggy] exposed global function: ${name}`);
|
|
78
381
|
return piggy;
|
|
79
382
|
},
|
|
80
383
|
|
|
81
|
-
unexpose: async (name: string, tabId = "default") => {
|
|
384
|
+
unexpose: async (name: string, tabId = "default"): Promise<Piggy> => {
|
|
82
385
|
if (!_client) throw new Error("No client. Call piggy.launch() first.");
|
|
83
386
|
await _client.unexposeFunction(name, tabId);
|
|
84
387
|
logger.info(`[piggy] unexposed function: ${name}`);
|
|
@@ -87,18 +390,18 @@ const piggy: any = {
|
|
|
87
390
|
|
|
88
391
|
// ── Elysia server ────────────────────────────────────────────────────────────
|
|
89
392
|
|
|
90
|
-
serve: (port: number, opts?:
|
|
393
|
+
serve: (port: number, opts?: ServeOptions): Promise<Elysia> =>
|
|
91
394
|
startServer(port, opts?.hostname),
|
|
92
395
|
|
|
93
396
|
stopServer,
|
|
94
397
|
|
|
95
398
|
// ── Route listing ────────────────────────────────────────────────────────────
|
|
96
399
|
|
|
97
|
-
routes: () =>
|
|
98
|
-
Array.from(routeRegistry.entries()).map(([key, cfg]) => {
|
|
400
|
+
routes: (): RouteSummary[] =>
|
|
401
|
+
Array.from(routeRegistry.entries()).map(([key, cfg]): RouteSummary => {
|
|
99
402
|
const [site] = key.split(":");
|
|
100
403
|
return {
|
|
101
|
-
site,
|
|
404
|
+
site: site ?? key,
|
|
102
405
|
method: cfg.method,
|
|
103
406
|
path: `/${site}${cfg.path}`,
|
|
104
407
|
ttl: cfg.ttl,
|
|
@@ -108,24 +411,33 @@ const piggy: any = {
|
|
|
108
411
|
|
|
109
412
|
// ── Multi-site ───────────────────────────────────────────────────────────────
|
|
110
413
|
|
|
111
|
-
all: (sites: SiteObject[]) =>
|
|
112
|
-
new Proxy({} as
|
|
113
|
-
get: (
|
|
114
|
-
(...args:
|
|
414
|
+
all: (sites: SiteObject[]): AllProxy =>
|
|
415
|
+
new Proxy({} as AllProxy, {
|
|
416
|
+
get: (_target, method: string) =>
|
|
417
|
+
(...args: unknown[]) =>
|
|
418
|
+
Promise.all(
|
|
419
|
+
sites.map((s) =>
|
|
420
|
+
(s as unknown as Record<string, (...a: unknown[]) => unknown>)[method]?.(...args)
|
|
421
|
+
)
|
|
422
|
+
),
|
|
115
423
|
}),
|
|
116
424
|
|
|
117
|
-
diff: (sites: SiteObject[]) =>
|
|
118
|
-
new Proxy({} as
|
|
119
|
-
get: (
|
|
120
|
-
async (...args:
|
|
121
|
-
const results = await Promise.all(
|
|
122
|
-
|
|
425
|
+
diff: (sites: SiteObject[]): DiffProxy =>
|
|
426
|
+
new Proxy({} as DiffProxy, {
|
|
427
|
+
get: (_target, method: string) =>
|
|
428
|
+
async (...args: unknown[]) => {
|
|
429
|
+
const results = await Promise.all(
|
|
430
|
+
sites.map((s) =>
|
|
431
|
+
(s as unknown as Record<string, (...a: unknown[]) => unknown>)[method]?.(...args)
|
|
432
|
+
)
|
|
433
|
+
);
|
|
434
|
+
return Object.fromEntries(sites.map((s, i) => [s._name ?? i, results[i]]));
|
|
123
435
|
},
|
|
124
436
|
}),
|
|
125
437
|
|
|
126
438
|
// ── Shutdown ─────────────────────────────────────────────────────────────────
|
|
127
439
|
|
|
128
|
-
close: async (opts?: { force?: boolean }) => {
|
|
440
|
+
close: async (opts?: { force?: boolean }): Promise<void> => {
|
|
129
441
|
stopServer();
|
|
130
442
|
if (opts?.force) {
|
|
131
443
|
for (const { client: c } of _extraProcs) c.disconnect();
|
|
@@ -153,6 +465,5 @@ const piggy: any = {
|
|
|
153
465
|
logger,
|
|
154
466
|
};
|
|
155
467
|
|
|
156
|
-
// NO PROXY WRAPPER - EXPORT THE PLAIN OBJECT DIRECTLY
|
|
157
468
|
export default piggy;
|
|
158
469
|
export { piggy };
|