nothing-browser 0.0.14 → 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/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 +176 -1
- package/dist/piggy.d.ts.map +1 -0
- package/dist/piggy.js +13 -11
- package/package.json +25 -15
- package/piggy.ts +311 -50
|
@@ -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,178 @@
|
|
|
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
|
+
/** Full API surface of a registered site. */
|
|
7
|
+
export interface SiteObject {
|
|
8
|
+
readonly _name: string;
|
|
9
|
+
readonly _tabId: string;
|
|
10
|
+
navigate(url?: string, opts?: {
|
|
11
|
+
retries?: number;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
reload(): Promise<void>;
|
|
14
|
+
goBack(): Promise<void>;
|
|
15
|
+
goForward(): Promise<void>;
|
|
16
|
+
waitForNavigation(): Promise<void>;
|
|
17
|
+
title(): Promise<string>;
|
|
18
|
+
/** Returns the last known URL (synchronous — does NOT hit the browser). */
|
|
19
|
+
url(): string;
|
|
20
|
+
content(): Promise<string>;
|
|
21
|
+
wait(ms: number): Promise<void>;
|
|
22
|
+
waitForSelector(selector: string, timeout?: number): Promise<void>;
|
|
23
|
+
waitForVisible(selector: string, timeout?: number): Promise<void>;
|
|
24
|
+
waitForResponse(pattern: string, timeout?: number): Promise<void>;
|
|
25
|
+
addInitScript(js: string | (() => void)): Promise<SiteObject>;
|
|
26
|
+
on(event: "navigate", handler: (url: string) => void): () => void;
|
|
27
|
+
on(event: string, handler: (data: unknown) => void): () => void;
|
|
28
|
+
off(event: string, handler: (data: unknown) => void): void;
|
|
29
|
+
click(selector: string, opts?: {
|
|
30
|
+
retries?: number;
|
|
31
|
+
timeout?: number;
|
|
32
|
+
}): Promise<boolean>;
|
|
33
|
+
doubleClick(selector: string): Promise<boolean>;
|
|
34
|
+
hover(selector: string): Promise<boolean>;
|
|
35
|
+
type(selector: string, text: string, opts?: {
|
|
36
|
+
delay?: number;
|
|
37
|
+
retries?: number;
|
|
38
|
+
fact?: boolean;
|
|
39
|
+
wpm?: number;
|
|
40
|
+
}): Promise<boolean>;
|
|
41
|
+
select(selector: string, value: string): Promise<boolean>;
|
|
42
|
+
evaluate<T = unknown>(js: string | ((...args: unknown[]) => T), ...args: unknown[]): Promise<T>;
|
|
43
|
+
keyboard: {
|
|
44
|
+
press(key: string): Promise<boolean>;
|
|
45
|
+
combo(combo: string): Promise<boolean>;
|
|
46
|
+
};
|
|
47
|
+
mouse: {
|
|
48
|
+
move(x: number, y: number): Promise<boolean>;
|
|
49
|
+
drag(from: {
|
|
50
|
+
x: number;
|
|
51
|
+
y: number;
|
|
52
|
+
}, to: {
|
|
53
|
+
x: number;
|
|
54
|
+
y: number;
|
|
55
|
+
}): Promise<boolean>;
|
|
56
|
+
};
|
|
57
|
+
scroll: {
|
|
58
|
+
to(selector: string): Promise<boolean>;
|
|
59
|
+
by(px: number): Promise<boolean>;
|
|
60
|
+
};
|
|
61
|
+
fetchText(selector: string): Promise<string | null>;
|
|
62
|
+
fetchLinks(selector: string): Promise<string[]>;
|
|
63
|
+
fetchImages(selector: string): Promise<string[]>;
|
|
64
|
+
search: {
|
|
65
|
+
css(query: string): Promise<unknown>;
|
|
66
|
+
id(query: string): Promise<unknown>;
|
|
67
|
+
};
|
|
68
|
+
screenshot(filePath?: string): Promise<string>;
|
|
69
|
+
pdf(filePath?: string): Promise<string>;
|
|
70
|
+
blockImages(): Promise<void>;
|
|
71
|
+
unblockImages(): Promise<void>;
|
|
72
|
+
cookies: {
|
|
73
|
+
set(name: string, value: string, domain: string, path?: string): Promise<void>;
|
|
74
|
+
get(name: string): Promise<unknown>;
|
|
75
|
+
delete(name: string): Promise<void>;
|
|
76
|
+
list(): Promise<unknown[]>;
|
|
77
|
+
};
|
|
78
|
+
intercept: {
|
|
79
|
+
block(pattern: string): Promise<void>;
|
|
80
|
+
redirect(pattern: string, redirectUrl: string): Promise<void>;
|
|
81
|
+
headers(pattern: string, headers: Record<string, string>): Promise<void>;
|
|
82
|
+
respond(pattern: string, handlerOrResponse: {
|
|
83
|
+
status?: number;
|
|
84
|
+
contentType?: string;
|
|
85
|
+
body: string;
|
|
86
|
+
} | ((req: {
|
|
87
|
+
url: string;
|
|
88
|
+
method: string;
|
|
89
|
+
}) => {
|
|
90
|
+
status?: number;
|
|
91
|
+
contentType?: string;
|
|
92
|
+
body: string;
|
|
93
|
+
})): Promise<SiteObject>;
|
|
94
|
+
modifyResponse(pattern: string, handler: (response: {
|
|
95
|
+
body: string;
|
|
96
|
+
status: number;
|
|
97
|
+
headers: Record<string, string>;
|
|
98
|
+
}) => Promise<{
|
|
99
|
+
body?: string;
|
|
100
|
+
status?: number;
|
|
101
|
+
headers?: Record<string, string>;
|
|
102
|
+
} | void> | void): Promise<SiteObject>;
|
|
103
|
+
clear(): Promise<void>;
|
|
104
|
+
};
|
|
105
|
+
capture: {
|
|
106
|
+
start(): Promise<void>;
|
|
107
|
+
stop(): Promise<void>;
|
|
108
|
+
requests(): Promise<unknown[]>;
|
|
109
|
+
ws(): Promise<unknown[]>;
|
|
110
|
+
cookies(): Promise<unknown[]>;
|
|
111
|
+
storage(): Promise<unknown>;
|
|
112
|
+
clear(): Promise<void>;
|
|
113
|
+
};
|
|
114
|
+
session: {
|
|
115
|
+
export(): Promise<unknown>;
|
|
116
|
+
import(data: unknown): Promise<void>;
|
|
117
|
+
};
|
|
118
|
+
exposeFunction(fnName: string, handler: (data: unknown) => Promise<unknown> | unknown): Promise<SiteObject>;
|
|
119
|
+
unexposeFunction(fnName: string): Promise<SiteObject>;
|
|
120
|
+
clearExposedFunctions(): Promise<SiteObject>;
|
|
121
|
+
exposeAndInject(fnName: string, handler: (data: unknown) => Promise<unknown> | unknown, injectionJs: string | ((fnName: string) => string)): Promise<SiteObject>;
|
|
122
|
+
api(path: string, handler: RouteHandler, opts?: {
|
|
123
|
+
ttl?: number;
|
|
124
|
+
before?: BeforeMiddleware[];
|
|
125
|
+
method?: "GET" | "POST" | "PUT" | "DELETE";
|
|
126
|
+
}): SiteObject;
|
|
127
|
+
noclose(): SiteObject;
|
|
128
|
+
close(): Promise<void>;
|
|
129
|
+
}
|
|
130
|
+
export interface RouteSummary {
|
|
131
|
+
site: string;
|
|
132
|
+
method: RouteConfig["method"];
|
|
133
|
+
path: string;
|
|
134
|
+
ttl: number;
|
|
135
|
+
middlewareCount: number;
|
|
136
|
+
}
|
|
137
|
+
export type AllProxy = {
|
|
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;
|
|
139
|
+
};
|
|
140
|
+
export type DiffProxy = {
|
|
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;
|
|
142
|
+
};
|
|
143
|
+
export interface LaunchOptions {
|
|
144
|
+
mode?: TabMode;
|
|
145
|
+
binary?: BinaryMode;
|
|
146
|
+
}
|
|
147
|
+
export interface RegisterOptions {
|
|
148
|
+
binary?: BinaryMode;
|
|
149
|
+
}
|
|
150
|
+
export interface ServeOptions {
|
|
151
|
+
hostname?: string;
|
|
152
|
+
}
|
|
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>;
|
|
160
|
+
serve(port: number, opts?: ServeOptions): Promise<Elysia>;
|
|
161
|
+
stopServer(): void;
|
|
162
|
+
routes(): RouteSummary[];
|
|
163
|
+
all(sites: SiteObject[]): AllProxy;
|
|
164
|
+
diff(sites: SiteObject[]): DiffProxy;
|
|
165
|
+
close(opts?: {
|
|
166
|
+
force?: boolean;
|
|
167
|
+
}): Promise<void>;
|
|
168
|
+
detect(mode?: BinaryMode): string | null;
|
|
169
|
+
logger: Logger;
|
|
170
|
+
}
|
|
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;
|
|
2
176
|
export default piggy;
|
|
3
177
|
export { piggy };
|
|
178
|
+
//# sourceMappingURL=piggy.d.ts.map
|
|
@@ -0,0 +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,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAGxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,2EAA2E;IAC3E,GAAG,IAAI,MAAM,CAAC;IACd,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAG3B,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGlE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAG9D,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAClE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAChE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IAG3D,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzF,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,CACF,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACxE,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEhG,QAAQ,EAAE;QACR,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACxC,CAAC;IACF,KAAK,EAAE;QACL,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,EAAE,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACtF,CAAC;IACF,MAAM,EAAE;QACN,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACvC,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KAClC,CAAC;IAGF,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,MAAM,EAAE;QACN,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACrC,CAAC;IAGF,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAG/B,OAAO,EAAE;QACP,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/E,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;KAC5B,CAAC;IAGF,SAAS,EAAE;QACT,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9D,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzE,OAAO,CACL,OAAO,EAAE,MAAM,EACf,iBAAiB,EACb;YAAE,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,GACvD,CAAC,CAAC,GAAG,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,KAAK;YACzC,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,IAAI,EAAE,MAAM,CAAC;SACd,CAAC,GACL,OAAO,CAAC,UAAU,CAAC,CAAC;QACvB,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,QAAQ,EAAE;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACjC,KAAK,OAAO,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE,GAAG,IAAI,CAAC,GAAG,IAAI,GAChG,OAAO,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;KACxB,CAAC;IAGF,OAAO,EAAE;QACP,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACtB,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/B,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACzB,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;KACxB,CAAC;IAGF,OAAO,EAAE;QACP,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACtC,CAAC;IAGF,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GACrD,OAAO,CAAC,UAAU,CAAC,CAAC;IACvB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,qBAAqB,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,eAAe,CACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,EACtD,WAAW,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,GACjD,OAAO,CAAC,UAAU,CAAC,CAAC;IAGvB,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,EACrB,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;QAC5B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;KAC5C,GACA,UAAU,CAAC;IAEd,OAAO,IAAI,UAAU,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAID,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;CACzB;AAID,MAAM,MAAM,QAAQ,GAAG;KACpB,CAAC,IAAI,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GACjF,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,GAC5B,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,GACjD,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,GAC5B,KAAK;CACZ,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;KACrB,CAAC,IAAI,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GACjF,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAC1C,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,GACjD,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAC1C,KAAK;CACZ,CAAC;AAIF,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChF,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,MAAM,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,EACtD,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,CAAC,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,UAAU,IAAI,IAAI,CAAC;IACnB,MAAM,IAAI,YAAY,EAAE,CAAC;IACzB,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,IAAI,SAAS,GAAG;KACxD,CAAC,IAAI,CAAC,GAAG,UAAU;CACrB,CAAC;AAgCF,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,CAE9D;AAWD,QAAA,MAAM,KAAK,EAAE,SAwIZ,CAAC;AAEF,eAAe,KAAK,CAAC;AACrB,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
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) => {
|
|
@@ -21830,7 +21831,7 @@ var piggy = {
|
|
|
21830
21831
|
routes: () => Array.from(routeRegistry.entries()).map(([key, cfg]) => {
|
|
21831
21832
|
const [site] = key.split(":");
|
|
21832
21833
|
return {
|
|
21833
|
-
site,
|
|
21834
|
+
site: site ?? key,
|
|
21834
21835
|
method: cfg.method,
|
|
21835
21836
|
path: `/${site}${cfg.path}`,
|
|
21836
21837
|
ttl: cfg.ttl,
|
|
@@ -21838,10 +21839,10 @@ var piggy = {
|
|
|
21838
21839
|
};
|
|
21839
21840
|
}),
|
|
21840
21841
|
all: (sites) => new Proxy({}, {
|
|
21841
|
-
get: (
|
|
21842
|
+
get: (_target, method) => (...args) => Promise.all(sites.map((s) => s[method]?.(...args)))
|
|
21842
21843
|
}),
|
|
21843
21844
|
diff: (sites) => new Proxy({}, {
|
|
21844
|
-
get: (
|
|
21845
|
+
get: (_target, method) => async (...args) => {
|
|
21845
21846
|
const results = await Promise.all(sites.map((s) => s[method]?.(...args)));
|
|
21846
21847
|
return Object.fromEntries(sites.map((s, i) => [s._name ?? i, results[i]]));
|
|
21847
21848
|
}
|
|
@@ -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
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nothing-browser",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.16",
|
|
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,284 @@ 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
|
+
/** Full API surface of a registered site. */
|
|
17
|
+
export interface SiteObject {
|
|
18
|
+
readonly _name: string;
|
|
19
|
+
readonly _tabId: string;
|
|
20
|
+
|
|
21
|
+
// ── Navigation ─────────────────────────────────────────────────────────────
|
|
22
|
+
navigate(url?: string, opts?: { retries?: number }): Promise<void>;
|
|
23
|
+
reload(): Promise<void>;
|
|
24
|
+
goBack(): Promise<void>;
|
|
25
|
+
goForward(): Promise<void>;
|
|
26
|
+
waitForNavigation(): Promise<void>;
|
|
27
|
+
title(): Promise<string>;
|
|
28
|
+
/** Returns the last known URL (synchronous — does NOT hit the browser). */
|
|
29
|
+
url(): string;
|
|
30
|
+
content(): Promise<string>;
|
|
31
|
+
|
|
32
|
+
// ── Timing ────────────────────────────────────────────────────────────────
|
|
33
|
+
wait(ms: number): Promise<void>;
|
|
34
|
+
waitForSelector(selector: string, timeout?: number): Promise<void>;
|
|
35
|
+
waitForVisible(selector: string, timeout?: number): Promise<void>;
|
|
36
|
+
waitForResponse(pattern: string, timeout?: number): Promise<void>;
|
|
37
|
+
|
|
38
|
+
// ── Init script ───────────────────────────────────────────────────────────
|
|
39
|
+
addInitScript(js: string | (() => void)): Promise<SiteObject>;
|
|
40
|
+
|
|
41
|
+
// ── Event emitter ─────────────────────────────────────────────────────────
|
|
42
|
+
on(event: "navigate", handler: (url: string) => void): () => void;
|
|
43
|
+
on(event: string, handler: (data: unknown) => void): () => void;
|
|
44
|
+
off(event: string, handler: (data: unknown) => void): void;
|
|
45
|
+
|
|
46
|
+
// ── Interactions ──────────────────────────────────────────────────────────
|
|
47
|
+
click(selector: string, opts?: { retries?: number; timeout?: number }): Promise<boolean>;
|
|
48
|
+
doubleClick(selector: string): Promise<boolean>;
|
|
49
|
+
hover(selector: string): Promise<boolean>;
|
|
50
|
+
type(
|
|
51
|
+
selector: string,
|
|
52
|
+
text: string,
|
|
53
|
+
opts?: { delay?: number; retries?: number; fact?: boolean; wpm?: number }
|
|
54
|
+
): Promise<boolean>;
|
|
55
|
+
select(selector: string, value: string): Promise<boolean>;
|
|
56
|
+
evaluate<T = unknown>(js: string | ((...args: unknown[]) => T), ...args: unknown[]): Promise<T>;
|
|
57
|
+
|
|
58
|
+
keyboard: {
|
|
59
|
+
press(key: string): Promise<boolean>;
|
|
60
|
+
combo(combo: string): Promise<boolean>;
|
|
61
|
+
};
|
|
62
|
+
mouse: {
|
|
63
|
+
move(x: number, y: number): Promise<boolean>;
|
|
64
|
+
drag(from: { x: number; y: number }, to: { x: number; y: number }): Promise<boolean>;
|
|
65
|
+
};
|
|
66
|
+
scroll: {
|
|
67
|
+
to(selector: string): Promise<boolean>;
|
|
68
|
+
by(px: number): Promise<boolean>;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
// ── Fetch ─────────────────────────────────────────────────────────────────
|
|
72
|
+
fetchText(selector: string): Promise<string | null>;
|
|
73
|
+
fetchLinks(selector: string): Promise<string[]>;
|
|
74
|
+
fetchImages(selector: string): Promise<string[]>;
|
|
75
|
+
search: {
|
|
76
|
+
css(query: string): Promise<unknown>;
|
|
77
|
+
id(query: string): Promise<unknown>;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// ── Screenshot / PDF ──────────────────────────────────────────────────────
|
|
81
|
+
screenshot(filePath?: string): Promise<string>;
|
|
82
|
+
pdf(filePath?: string): Promise<string>;
|
|
83
|
+
blockImages(): Promise<void>;
|
|
84
|
+
unblockImages(): Promise<void>;
|
|
85
|
+
|
|
86
|
+
// ── Cookies ───────────────────────────────────────────────────────────────
|
|
87
|
+
cookies: {
|
|
88
|
+
set(name: string, value: string, domain: string, path?: string): Promise<void>;
|
|
89
|
+
get(name: string): Promise<unknown>;
|
|
90
|
+
delete(name: string): Promise<void>;
|
|
91
|
+
list(): Promise<unknown[]>;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
// ── Interception ──────────────────────────────────────────────────────────
|
|
95
|
+
intercept: {
|
|
96
|
+
block(pattern: string): Promise<void>;
|
|
97
|
+
redirect(pattern: string, redirectUrl: string): Promise<void>;
|
|
98
|
+
headers(pattern: string, headers: Record<string, string>): Promise<void>;
|
|
99
|
+
respond(
|
|
100
|
+
pattern: string,
|
|
101
|
+
handlerOrResponse:
|
|
102
|
+
| { status?: number; contentType?: string; body: string }
|
|
103
|
+
| ((req: { url: string; method: string }) => {
|
|
104
|
+
status?: number;
|
|
105
|
+
contentType?: string;
|
|
106
|
+
body: string;
|
|
107
|
+
})
|
|
108
|
+
): Promise<SiteObject>;
|
|
109
|
+
modifyResponse(
|
|
110
|
+
pattern: string,
|
|
111
|
+
handler: (response: {
|
|
112
|
+
body: string;
|
|
113
|
+
status: number;
|
|
114
|
+
headers: Record<string, string>;
|
|
115
|
+
}) => Promise<{ body?: string; status?: number; headers?: Record<string, string> } | void> | void
|
|
116
|
+
): Promise<SiteObject>;
|
|
117
|
+
clear(): Promise<void>;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// ── Network capture ───────────────────────────────────────────────────────
|
|
121
|
+
capture: {
|
|
122
|
+
start(): Promise<void>;
|
|
123
|
+
stop(): Promise<void>;
|
|
124
|
+
requests(): Promise<unknown[]>;
|
|
125
|
+
ws(): Promise<unknown[]>;
|
|
126
|
+
cookies(): Promise<unknown[]>;
|
|
127
|
+
storage(): Promise<unknown>;
|
|
128
|
+
clear(): Promise<void>;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
// ── Session ───────────────────────────────────────────────────────────────
|
|
132
|
+
session: {
|
|
133
|
+
export(): Promise<unknown>;
|
|
134
|
+
import(data: unknown): Promise<void>;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// ── Expose / unexpose ─────────────────────────────────────────────────────
|
|
138
|
+
exposeFunction(
|
|
139
|
+
fnName: string,
|
|
140
|
+
handler: (data: unknown) => Promise<unknown> | unknown
|
|
141
|
+
): Promise<SiteObject>;
|
|
142
|
+
unexposeFunction(fnName: string): Promise<SiteObject>;
|
|
143
|
+
clearExposedFunctions(): Promise<SiteObject>;
|
|
144
|
+
exposeAndInject(
|
|
145
|
+
fnName: string,
|
|
146
|
+
handler: (data: unknown) => Promise<unknown> | unknown,
|
|
147
|
+
injectionJs: string | ((fnName: string) => string)
|
|
148
|
+
): Promise<SiteObject>;
|
|
149
|
+
|
|
150
|
+
// ── Elysia route registration ─────────────────────────────────────────────
|
|
151
|
+
api(
|
|
152
|
+
path: string,
|
|
153
|
+
handler: RouteHandler,
|
|
154
|
+
opts?: {
|
|
155
|
+
ttl?: number;
|
|
156
|
+
before?: BeforeMiddleware[];
|
|
157
|
+
method?: "GET" | "POST" | "PUT" | "DELETE";
|
|
158
|
+
}
|
|
159
|
+
): SiteObject;
|
|
160
|
+
|
|
161
|
+
noclose(): SiteObject;
|
|
162
|
+
close(): Promise<void>;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// ── Route summary ─────────────────────────────────────────────────────────────
|
|
166
|
+
|
|
167
|
+
export interface RouteSummary {
|
|
168
|
+
site: string;
|
|
169
|
+
method: RouteConfig["method"];
|
|
170
|
+
path: string;
|
|
171
|
+
ttl: number;
|
|
172
|
+
middlewareCount: number;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// ── Multi-site proxy helpers ──────────────────────────────────────────────────
|
|
176
|
+
|
|
177
|
+
export type AllProxy = {
|
|
178
|
+
[K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R>
|
|
179
|
+
? (...args: A) => Promise<R[]>
|
|
180
|
+
: SiteObject[K] extends (...args: infer A) => infer R
|
|
181
|
+
? (...args: A) => Promise<R[]>
|
|
182
|
+
: never;
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
export type DiffProxy = {
|
|
186
|
+
[K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R>
|
|
187
|
+
? (...args: A) => Promise<Record<string, R>>
|
|
188
|
+
: SiteObject[K] extends (...args: infer A) => infer R
|
|
189
|
+
? (...args: A) => Promise<Record<string, R>>
|
|
190
|
+
: never;
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
// ── Option bags ───────────────────────────────────────────────────────────────
|
|
194
|
+
|
|
195
|
+
export interface LaunchOptions {
|
|
196
|
+
mode?: TabMode;
|
|
197
|
+
binary?: BinaryMode;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export interface RegisterOptions {
|
|
201
|
+
binary?: BinaryMode;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export interface ServeOptions {
|
|
205
|
+
hostname?: string;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// ── PiggyBase — named methods, no index signature ─────────────────────────────
|
|
209
|
+
|
|
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;
|
|
215
|
+
expose(
|
|
216
|
+
name: string,
|
|
217
|
+
handler: (data: unknown) => Promise<unknown> | unknown,
|
|
218
|
+
tabId?: string
|
|
219
|
+
): Promise<PiggyBase>;
|
|
220
|
+
unexpose(name: string, tabId?: string): Promise<PiggyBase>;
|
|
221
|
+
serve(port: number, opts?: ServeOptions): Promise<Elysia>;
|
|
222
|
+
stopServer(): void;
|
|
223
|
+
routes(): RouteSummary[];
|
|
224
|
+
all(sites: SiteObject[]): AllProxy;
|
|
225
|
+
diff(sites: SiteObject[]): DiffProxy;
|
|
226
|
+
close(opts?: { force?: boolean }): Promise<void>;
|
|
227
|
+
detect(mode?: BinaryMode): string | null;
|
|
228
|
+
logger: Logger;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// ── PiggyWithSites<S> — PiggyBase + typed site keys ──────────────────────────
|
|
232
|
+
|
|
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>;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// ── Module-private state ──────────────────────────────────────────────────────
|
|
11
272
|
|
|
12
273
|
let _client: PiggyClient | null = null;
|
|
13
274
|
let _tabMode: TabMode = "tab";
|
|
14
275
|
const _extraProcs: { socket: string; client: PiggyClient }[] = [];
|
|
15
276
|
const _sites: Record<string, SiteObject> = {};
|
|
16
277
|
|
|
17
|
-
//
|
|
18
|
-
const piggy: any = {
|
|
19
|
-
// ── Lifecycle ───────────────────────────────────────────────────────────────
|
|
278
|
+
// ── The piggy singleton ───────────────────────────────────────────────────────
|
|
20
279
|
|
|
21
|
-
|
|
280
|
+
const piggy: PiggyBase = {
|
|
281
|
+
launch: async (opts?: LaunchOptions): Promise<PiggyBase> => {
|
|
22
282
|
_tabMode = opts?.mode ?? "tab";
|
|
23
283
|
const binaryMode: BinaryMode = opts?.binary ?? "headless";
|
|
24
284
|
await spawnBrowser(binaryMode);
|
|
25
|
-
await new Promise(r => setTimeout(r, 500));
|
|
285
|
+
await new Promise<void>((r) => setTimeout(r, 500));
|
|
26
286
|
_client = new PiggyClient();
|
|
27
287
|
await _client.connect();
|
|
28
288
|
setClient(_client);
|
|
@@ -30,75 +290,72 @@ const piggy: any = {
|
|
|
30
290
|
return piggy;
|
|
31
291
|
},
|
|
32
292
|
|
|
33
|
-
register: async (name: string, url: string, opts?:
|
|
293
|
+
register: async (name: string, url: string, opts?: RegisterOptions): Promise<PiggyBase> => {
|
|
34
294
|
if (!url?.trim()) throw new Error(`No URL for site "${name}"`);
|
|
35
295
|
const binaryMode: BinaryMode = opts?.binary ?? "headless";
|
|
36
296
|
|
|
37
|
-
let
|
|
297
|
+
let siteObj: SiteObject;
|
|
298
|
+
|
|
38
299
|
if (_tabMode === "tab") {
|
|
39
300
|
if (!_client) throw new Error("No client. Call piggy.launch() first.");
|
|
40
|
-
tabId = await _client.newTab();
|
|
41
|
-
|
|
42
|
-
const siteObj = createSiteObject(name, url, _client, tabId);
|
|
43
|
-
_sites[name] = siteObj;
|
|
44
|
-
piggy[name] = siteObj; // DIRECT ASSIGNMENT - NO PROXY
|
|
301
|
+
const tabId = await _client.newTab();
|
|
302
|
+
siteObj = createSiteObject(name, url, _client, tabId) as SiteObject;
|
|
45
303
|
logger.success(`[${name}] registered as tab ${tabId}`);
|
|
46
304
|
} else {
|
|
47
305
|
const socketName = `piggy_${name}`;
|
|
48
306
|
await spawnBrowserOnSocket(socketName, binaryMode);
|
|
49
|
-
await new Promise(r => setTimeout(r, 500));
|
|
307
|
+
await new Promise<void>((r) => setTimeout(r, 500));
|
|
50
308
|
const c = new PiggyClient(socketName);
|
|
51
309
|
await c.connect();
|
|
52
310
|
_extraProcs.push({ socket: socketName, client: c });
|
|
53
|
-
|
|
54
|
-
_sites[name] = siteObj;
|
|
55
|
-
piggy[name] = siteObj; // DIRECT ASSIGNMENT - NO PROXY
|
|
311
|
+
siteObj = createSiteObject(name, url, c, "default") as SiteObject;
|
|
56
312
|
logger.success(`[${name}] registered as process on "${socketName}"`);
|
|
57
313
|
}
|
|
58
314
|
|
|
315
|
+
_sites[name] = siteObj;
|
|
316
|
+
(piggy as unknown as Record<string, unknown>)[name] = siteObj;
|
|
59
317
|
return piggy;
|
|
60
318
|
},
|
|
61
319
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
actHuman: (enable: boolean) => {
|
|
320
|
+
actHuman: (enable: boolean): PiggyBase => {
|
|
65
321
|
setHumanMode(enable);
|
|
66
322
|
logger.info(`[piggy] actHuman: ${enable}`);
|
|
67
323
|
return piggy;
|
|
68
324
|
},
|
|
69
325
|
|
|
70
|
-
mode: (m: TabMode) => {
|
|
71
|
-
|
|
72
|
-
|
|
326
|
+
mode: (m: TabMode): PiggyBase => {
|
|
327
|
+
_tabMode = m;
|
|
328
|
+
return piggy;
|
|
329
|
+
},
|
|
73
330
|
|
|
74
|
-
expose: async (
|
|
331
|
+
expose: async (
|
|
332
|
+
name: string,
|
|
333
|
+
handler: (data: unknown) => Promise<unknown> | unknown,
|
|
334
|
+
tabId = "default"
|
|
335
|
+
): Promise<PiggyBase> => {
|
|
75
336
|
if (!_client) throw new Error("No client. Call piggy.launch() first.");
|
|
76
337
|
await _client.exposeFunction(name, handler, tabId);
|
|
77
338
|
logger.success(`[piggy] exposed global function: ${name}`);
|
|
78
339
|
return piggy;
|
|
79
340
|
},
|
|
80
341
|
|
|
81
|
-
unexpose: async (name: string, tabId = "default") => {
|
|
342
|
+
unexpose: async (name: string, tabId = "default"): Promise<PiggyBase> => {
|
|
82
343
|
if (!_client) throw new Error("No client. Call piggy.launch() first.");
|
|
83
344
|
await _client.unexposeFunction(name, tabId);
|
|
84
345
|
logger.info(`[piggy] unexposed function: ${name}`);
|
|
85
346
|
return piggy;
|
|
86
347
|
},
|
|
87
348
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
serve: (port: number, opts?: { hostname?: string }) =>
|
|
349
|
+
serve: (port: number, opts?: ServeOptions): Promise<Elysia> =>
|
|
91
350
|
startServer(port, opts?.hostname),
|
|
92
351
|
|
|
93
352
|
stopServer,
|
|
94
353
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
routes: () =>
|
|
98
|
-
Array.from(routeRegistry.entries()).map(([key, cfg]) => {
|
|
354
|
+
routes: (): RouteSummary[] =>
|
|
355
|
+
Array.from(routeRegistry.entries()).map(([key, cfg]): RouteSummary => {
|
|
99
356
|
const [site] = key.split(":");
|
|
100
357
|
return {
|
|
101
|
-
site,
|
|
358
|
+
site: site ?? key,
|
|
102
359
|
method: cfg.method,
|
|
103
360
|
path: `/${site}${cfg.path}`,
|
|
104
361
|
ttl: cfg.ttl,
|
|
@@ -106,26 +363,31 @@ const piggy: any = {
|
|
|
106
363
|
};
|
|
107
364
|
}),
|
|
108
365
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
366
|
+
all: (sites: SiteObject[]): AllProxy =>
|
|
367
|
+
new Proxy({} as AllProxy, {
|
|
368
|
+
get: (_target, method: string) =>
|
|
369
|
+
(...args: unknown[]) =>
|
|
370
|
+
Promise.all(
|
|
371
|
+
sites.map((s) =>
|
|
372
|
+
(s as unknown as Record<string, (...a: unknown[]) => unknown>)[method]?.(...args)
|
|
373
|
+
)
|
|
374
|
+
),
|
|
115
375
|
}),
|
|
116
376
|
|
|
117
|
-
diff: (sites: SiteObject[]) =>
|
|
118
|
-
new Proxy({} as
|
|
119
|
-
get: (
|
|
120
|
-
async (...args:
|
|
121
|
-
const results = await Promise.all(
|
|
122
|
-
|
|
377
|
+
diff: (sites: SiteObject[]): DiffProxy =>
|
|
378
|
+
new Proxy({} as DiffProxy, {
|
|
379
|
+
get: (_target, method: string) =>
|
|
380
|
+
async (...args: unknown[]) => {
|
|
381
|
+
const results = await Promise.all(
|
|
382
|
+
sites.map((s) =>
|
|
383
|
+
(s as unknown as Record<string, (...a: unknown[]) => unknown>)[method]?.(...args)
|
|
384
|
+
)
|
|
385
|
+
);
|
|
386
|
+
return Object.fromEntries(sites.map((s, i) => [s._name ?? i, results[i]]));
|
|
123
387
|
},
|
|
124
388
|
}),
|
|
125
389
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
close: async (opts?: { force?: boolean }) => {
|
|
390
|
+
close: async (opts?: { force?: boolean }): Promise<void> => {
|
|
129
391
|
stopServer();
|
|
130
392
|
if (opts?.force) {
|
|
131
393
|
for (const { client: c } of _extraProcs) c.disconnect();
|
|
@@ -153,6 +415,5 @@ const piggy: any = {
|
|
|
153
415
|
logger,
|
|
154
416
|
};
|
|
155
417
|
|
|
156
|
-
// NO PROXY WRAPPER - EXPORT THE PLAIN OBJECT DIRECTLY
|
|
157
418
|
export default piggy;
|
|
158
419
|
export { piggy };
|