@pagepocket/cdp-adapter 0.6.0 → 0.6.1

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/index.js CHANGED
@@ -1,204 +1,5 @@
1
- const decodeBase64 = (input) => {
2
- const bufferCtor = globalThis.Buffer;
3
- if (bufferCtor) {
4
- return new Uint8Array(bufferCtor.from(input, "base64"));
5
- }
6
- const binary = atob(input);
7
- const bytes = new Uint8Array(binary.length);
8
- for (let i = 0; i < binary.length; i += 1) {
9
- bytes[i] = binary.charCodeAt(i);
10
- }
11
- return bytes;
12
- };
13
- const encodeUtf8 = (input) => new TextEncoder().encode(input);
14
- const normalizeHeaders = (headers) => {
15
- const output = {};
16
- if (!headers)
17
- return output;
18
- for (const key of Object.keys(headers)) {
19
- const value = headers[key];
20
- if (value === undefined || value === null)
21
- continue;
22
- output[key] = Array.isArray(value) ? value.join(", ") : String(value);
23
- }
24
- return output;
25
- };
26
- const mapResourceType = (input) => {
27
- if (!input)
28
- return undefined;
29
- const normalized = input.toLowerCase();
30
- switch (normalized) {
31
- case "document":
32
- return "document";
33
- case "stylesheet":
34
- return "stylesheet";
35
- case "script":
36
- return "script";
37
- case "image":
38
- return "image";
39
- case "font":
40
- return "font";
41
- case "media":
42
- return "media";
43
- case "xhr":
44
- return "xhr";
45
- case "fetch":
46
- return "fetch";
47
- case "other":
48
- return "other";
49
- default:
50
- return normalized;
51
- }
52
- };
53
- const inferResourceTypeFromMime = (mimeType) => {
54
- if (!mimeType)
55
- return undefined;
56
- const normalized = mimeType.toLowerCase();
57
- if (normalized.includes("text/html") || normalized.includes("application/xhtml+xml")) {
58
- return "document";
59
- }
60
- if (normalized.includes("text/css")) {
61
- return "stylesheet";
62
- }
63
- if (normalized.includes("javascript") || normalized.includes("ecmascript")) {
64
- return "script";
65
- }
66
- if (normalized.startsWith("image/")) {
67
- return "image";
68
- }
69
- if (normalized.startsWith("font/") ||
70
- normalized.includes("woff") ||
71
- normalized.includes("ttf") ||
72
- normalized.includes("otf")) {
73
- return "font";
74
- }
75
- if (normalized.startsWith("audio/") || normalized.startsWith("video/")) {
76
- return "media";
77
- }
78
- return undefined;
79
- };
80
- const callCdp = async (client, method, params) => {
81
- if (typeof client.send === "function") {
82
- return (await client.send(method, params));
83
- }
84
- const [domain, command] = method.split(".");
85
- const domainApi = client[domain];
86
- const fn = domainApi?.[command];
87
- if (typeof fn === "function") {
88
- return (await fn(params));
89
- }
90
- throw new Error(`CDP session missing method ${method}.`);
91
- };
92
- const subscribe = (client, eventName, handler) => {
93
- if (typeof client.on === "function") {
94
- client.on(eventName, handler);
95
- return () => client.off?.(eventName, handler);
96
- }
97
- const [domain, event] = eventName.split(".");
98
- const domainApi = client[domain];
99
- const fn = domainApi?.[event];
100
- if (typeof fn === "function") {
101
- fn(handler);
102
- return () => undefined;
103
- }
104
- throw new Error(`CDP session missing event ${eventName}.`);
105
- };
106
- const isNoBodyError = (error) => {
107
- const message = error instanceof Error ? error.message : String(error);
108
- return message.includes("No data found for resource with given identifier");
109
- };
110
- const logInfo = (label, data) => {
111
- console.info(`[pagepocket][cdp-adapter] ${label} ${JSON.stringify(data)}`);
112
- };
113
- const getChromeGlobal = () => globalThis.chrome;
114
- const createChromeDebuggerClient = (target, protocolVersion) => {
115
- const chromeGlobal = getChromeGlobal();
116
- const chromeDebugger = chromeGlobal?.debugger;
117
- if (!chromeDebugger) {
118
- throw new Error("chrome.debugger API is not available in this environment.");
119
- }
120
- const chromeRuntime = chromeGlobal?.runtime;
121
- let attached = false;
122
- let closed = false;
123
- const listeners = new Map();
124
- const assertNoLastError = (action) => {
125
- const lastError = chromeRuntime?.lastError;
126
- if (lastError?.message) {
127
- throw new Error(`${action} failed: ${lastError.message}`);
128
- }
129
- };
130
- const attach = () => new Promise((resolve, reject) => {
131
- chromeDebugger.attach(target, protocolVersion, () => {
132
- try {
133
- assertNoLastError("chrome.debugger.attach");
134
- attached = true;
135
- resolve();
136
- }
137
- catch (error) {
138
- reject(error);
139
- }
140
- });
141
- });
142
- const detach = () => new Promise((resolve, reject) => {
143
- chromeDebugger.detach(target, () => {
144
- try {
145
- assertNoLastError("chrome.debugger.detach");
146
- attached = false;
147
- resolve();
148
- }
149
- catch (error) {
150
- reject(error);
151
- }
152
- });
153
- });
154
- const ensureAttached = async () => {
155
- if (attached)
156
- return;
157
- await attach();
158
- };
159
- return {
160
- send: async (method, params) => {
161
- await ensureAttached();
162
- return new Promise((resolve, reject) => {
163
- chromeDebugger.sendCommand(target, method, params ?? {}, (result) => {
164
- try {
165
- assertNoLastError(`chrome.debugger.sendCommand(${method})`);
166
- resolve(result);
167
- }
168
- catch (error) {
169
- reject(error);
170
- }
171
- });
172
- });
173
- },
174
- on: (event, listener) => {
175
- const handler = (source, method, params) => {
176
- if (source.tabId !== target.tabId)
177
- return;
178
- if (method !== event)
179
- return;
180
- listener(params);
181
- };
182
- listeners.set(listener, handler);
183
- chromeDebugger.onEvent.addListener(handler);
184
- },
185
- off: (_event, listener) => {
186
- const handler = listeners.get(listener);
187
- if (!handler)
188
- return;
189
- listeners.delete(listener);
190
- chromeDebugger.onEvent.removeListener(handler);
191
- },
192
- close: async () => {
193
- if (closed)
194
- return;
195
- closed = true;
196
- if (!attached)
197
- return;
198
- await detach();
199
- }
200
- };
201
- };
1
+ import { createChromeDebuggerClient } from "./chrome-debugger-client";
2
+ import { createCdpSession } from "./session";
202
3
  export class CdpAdapter {
203
4
  constructor(options = {}) {
204
5
  this.name = "cdp";
@@ -219,284 +20,12 @@ export class CdpAdapter {
219
20
  const client = (await clientFactory?.({ tabId: target.tabId, protocolVersion })) ??
220
21
  createChromeDebuggerClient({ tabId: target.tabId }, protocolVersion);
221
22
  const ownsClient = true;
222
- await callCdp(client, "Network.enable");
223
- const activeRequestId = new Map();
224
- const requestSequence = new Map();
225
- const requestUrls = new Map();
226
- const requestInfo = new Map();
227
- const requestEvents = new Map();
228
- const responses = new Map();
229
- const requestTimeOffsets = new Map();
230
- let globalTimeOffset = null;
231
- const getLogicalRequestId = (cdpRequestId) => activeRequestId.get(cdpRequestId) ?? `${cdpRequestId}:0`;
232
- const resolveTimestampMs = (payload, requestId) => {
233
- if (typeof payload.wallTime === "number") {
234
- if (typeof payload.timestamp === "number") {
235
- const offset = payload.wallTime - payload.timestamp;
236
- if (requestId) {
237
- requestTimeOffsets.set(requestId, offset);
238
- }
239
- globalTimeOffset = offset;
240
- }
241
- return payload.wallTime * 1000;
242
- }
243
- if (typeof payload.timestamp === "number") {
244
- const offset = (requestId ? requestTimeOffsets.get(requestId) : undefined) ?? globalTimeOffset;
245
- if (typeof offset === "number") {
246
- return (payload.timestamp + offset) * 1000;
247
- }
248
- }
249
- return Date.now();
250
- };
251
- const handleRequestWillBeSent = (payload) => {
252
- const cdpRequestId = payload.requestId;
253
- const eventTimestamp = resolveTimestampMs(payload, cdpRequestId);
254
- if (payload.redirectResponse) {
255
- const previousRequestId = getLogicalRequestId(cdpRequestId);
256
- const redirectResponse = payload.redirectResponse;
257
- const redirectEvent = {
258
- type: "response",
259
- requestId: previousRequestId,
260
- url: redirectResponse.url,
261
- status: redirectResponse.status,
262
- statusText: redirectResponse.statusText,
263
- headers: normalizeHeaders(redirectResponse.headers),
264
- mimeType: redirectResponse.mimeType,
265
- fromDiskCache: redirectResponse.fromDiskCache,
266
- fromServiceWorker: redirectResponse.fromServiceWorker,
267
- timestamp: eventTimestamp
268
- };
269
- handlers.onEvent(redirectEvent);
270
- }
271
- const sequence = (requestSequence.get(cdpRequestId) ?? -1) + 1;
272
- requestSequence.set(cdpRequestId, sequence);
273
- const logicalRequestId = `${cdpRequestId}:${sequence}`;
274
- activeRequestId.set(cdpRequestId, logicalRequestId);
275
- const url = payload.request.url;
276
- requestUrls.set(logicalRequestId, url);
277
- requestInfo.set(cdpRequestId, {
278
- url,
279
- frameId: payload.frameId,
280
- resourceType: mapResourceType(payload.type),
281
- initiator: payload.initiator
282
- });
283
- const requestEvent = {
284
- type: "request",
285
- requestId: logicalRequestId,
286
- url,
287
- method: payload.request.method || "GET",
288
- headers: normalizeHeaders(payload.request.headers),
289
- frameId: payload.frameId,
290
- resourceType: mapResourceType(payload.type),
291
- initiator: payload.initiator,
292
- timestamp: eventTimestamp
293
- };
294
- requestEvents.set(cdpRequestId, requestEvent);
295
- handlers.onEvent(requestEvent);
296
- };
297
- const handleResponseReceived = (payload) => {
298
- const cdpRequestId = payload.requestId;
299
- const logicalRequestId = getLogicalRequestId(cdpRequestId);
300
- const eventTimestamp = resolveTimestampMs(payload, cdpRequestId);
301
- const response = payload.response;
302
- if (!requestUrls.has(logicalRequestId)) {
303
- requestUrls.set(logicalRequestId, response.url);
304
- }
305
- const storedRequest = requestEvents.get(cdpRequestId);
306
- const existingInfo = requestInfo.get(cdpRequestId);
307
- const inferred = inferResourceTypeFromMime(response.mimeType);
308
- if ((!existingInfo || !existingInfo.resourceType) && inferred) {
309
- requestInfo.set(cdpRequestId, {
310
- url: response.url,
311
- frameId: existingInfo?.frameId ?? payload.frameId,
312
- resourceType: inferred,
313
- initiator: existingInfo?.initiator
314
- });
315
- }
316
- if (!storedRequest && inferred) {
317
- const synthesizedRequest = {
318
- type: "request",
319
- requestId: logicalRequestId,
320
- url: response.url,
321
- method: "GET",
322
- headers: {},
323
- frameId: payload.frameId,
324
- resourceType: inferred,
325
- initiator: undefined,
326
- timestamp: eventTimestamp
327
- };
328
- requestEvents.set(cdpRequestId, synthesizedRequest);
329
- handlers.onEvent(synthesizedRequest);
330
- }
331
- else if (storedRequest && inferred && !storedRequest.resourceType) {
332
- const updatedRequest = {
333
- ...storedRequest,
334
- resourceType: inferred,
335
- timestamp: eventTimestamp
336
- };
337
- requestEvents.set(cdpRequestId, updatedRequest);
338
- handlers.onEvent(updatedRequest);
339
- }
340
- logInfo("response received", {
341
- requestId: cdpRequestId,
342
- url: response.url,
343
- status: response.status,
344
- mimeType: response.mimeType,
345
- fromDiskCache: response.fromDiskCache,
346
- fromServiceWorker: response.fromServiceWorker
347
- });
348
- responses.set(cdpRequestId, {
349
- requestId: logicalRequestId,
350
- response
351
- });
352
- };
353
- const tryGetResponseBody = async (cdpRequestId) => {
354
- try {
355
- const result = await callCdp(client, "Network.getResponseBody", { requestId: cdpRequestId });
356
- if (result.base64Encoded) {
357
- return decodeBase64(result.body);
358
- }
359
- return encodeUtf8(result.body);
360
- }
361
- catch (error) {
362
- if (isNoBodyError(error)) {
363
- return null;
364
- }
365
- throw error;
366
- }
367
- };
368
- const tryGetPageResourceContent = async (info) => {
369
- if (!info.frameId || !info.url) {
370
- return null;
371
- }
372
- try {
373
- const result = await callCdp(client, "Page.getResourceContent", {
374
- frameId: info.frameId,
375
- url: info.url
376
- });
377
- if (result.base64Encoded) {
378
- return decodeBase64(result.content);
379
- }
380
- return encodeUtf8(result.content);
381
- }
382
- catch {
383
- return null;
384
- }
385
- };
386
- const handleLoadingFinished = async (payload) => {
387
- const cdpRequestId = payload.requestId;
388
- const eventTimestamp = resolveTimestampMs(payload, cdpRequestId);
389
- const storedResponse = responses.get(cdpRequestId);
390
- if (!storedResponse) {
391
- logInfo("loadingFinished without response", {
392
- requestId: cdpRequestId
393
- });
394
- return;
395
- }
396
- const inferred = inferResourceTypeFromMime(storedResponse.response.mimeType);
397
- const info = requestInfo.get(cdpRequestId);
398
- if ((!info || !info.resourceType) && inferred) {
399
- requestInfo.set(cdpRequestId, {
400
- url: storedResponse.response.url,
401
- frameId: info?.frameId,
402
- resourceType: inferred,
403
- initiator: info?.initiator
404
- });
405
- const storedRequest = requestEvents.get(cdpRequestId);
406
- if (storedRequest && !storedRequest.resourceType) {
407
- const updatedRequest = {
408
- ...storedRequest,
409
- resourceType: inferred
410
- };
411
- requestEvents.set(cdpRequestId, updatedRequest);
412
- handlers.onEvent(updatedRequest);
413
- }
414
- }
415
- let bodyBytes = null;
416
- try {
417
- bodyBytes = await tryGetResponseBody(cdpRequestId);
418
- }
419
- catch (error) {
420
- handlers.onError?.(error instanceof Error ? error : new Error(String(error)));
421
- }
422
- if (bodyBytes && bodyBytes.byteLength === 0) {
423
- bodyBytes = null;
424
- }
425
- if (!bodyBytes) {
426
- const fallbackInfo = requestInfo.get(cdpRequestId);
427
- if (fallbackInfo?.frameId) {
428
- bodyBytes = await tryGetPageResourceContent(fallbackInfo);
429
- }
430
- }
431
- logInfo("response body status", {
432
- requestId: cdpRequestId,
433
- url: storedResponse.response.url,
434
- resourceType: requestInfo.get(cdpRequestId)?.resourceType,
435
- bodyBytes: bodyBytes ? bodyBytes.byteLength : 0
436
- });
437
- const responseEvent = {
438
- type: "response",
439
- requestId: storedResponse.requestId,
440
- url: storedResponse.response.url,
441
- status: storedResponse.response.status,
442
- statusText: storedResponse.response.statusText,
443
- headers: normalizeHeaders(storedResponse.response.headers),
444
- mimeType: storedResponse.response.mimeType,
445
- fromDiskCache: storedResponse.response.fromDiskCache,
446
- fromServiceWorker: storedResponse.response.fromServiceWorker,
447
- timestamp: eventTimestamp,
448
- body: bodyBytes ? { kind: "buffer", data: bodyBytes } : undefined
449
- };
450
- handlers.onEvent(responseEvent);
451
- };
452
- const handleLoadingFailed = (payload) => {
453
- const cdpRequestId = payload.requestId;
454
- const logicalRequestId = getLogicalRequestId(cdpRequestId);
455
- const url = requestUrls.get(logicalRequestId) ?? "";
456
- const failedEvent = {
457
- type: "failed",
458
- requestId: logicalRequestId,
459
- url,
460
- errorText: payload.errorText,
461
- timestamp: resolveTimestampMs(payload, cdpRequestId)
462
- };
463
- handlers.onEvent(failedEvent);
464
- };
465
- const cleanupHandlers = [];
466
- try {
467
- cleanupHandlers.push(subscribe(client, "Network.requestWillBeSent", (payload) => handleRequestWillBeSent(payload)));
468
- cleanupHandlers.push(subscribe(client, "Network.responseReceived", (payload) => handleResponseReceived(payload)));
469
- cleanupHandlers.push(subscribe(client, "Network.loadingFailed", (payload) => handleLoadingFailed(payload)));
470
- cleanupHandlers.push(subscribe(client, "Network.loadingFinished", (payload) => {
471
- void handleLoadingFinished(payload);
472
- }));
473
- }
474
- catch (error) {
475
- if (error instanceof Error) {
476
- handlers.onError?.(error);
477
- }
478
- throw error;
479
- }
480
- const ensurePageEnabled = async () => {
481
- try {
482
- await callCdp(client, "Page.enable");
483
- }
484
- catch {
485
- // Ignore if Page domain is not available.
486
- }
487
- };
488
- return {
489
- navigate: async (url) => {
490
- await ensurePageEnabled();
491
- await callCdp(client, "Page.navigate", { url });
492
- },
493
- stop: async () => {
494
- cleanupHandlers.forEach((cleanup) => cleanup());
495
- if (ownsClient) {
496
- await client.close?.();
497
- }
498
- }
499
- };
23
+ return createCdpSession({
24
+ client,
25
+ handlers,
26
+ ownsClient,
27
+ triggerActions: this.options.triggerActions
28
+ });
500
29
  }
501
30
  }
502
31
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAY7C,MAAM,OAAO,UAAU;IAWrB,YAAY,UAA6B,EAAE;QAVlC,SAAI,GAAG,KAAK,CAAC;QACb,iBAAY,GAAG;YACtB,kBAAkB,EAAE,IAAI;YACxB,qBAAqB,EAAE,KAAK;YAC5B,iBAAiB,EAAE,KAAK;YACxB,oBAAoB,EAAE,IAAI;SAC3B,CAAC;QAKA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK,CACT,MAAuB,EACvB,QAA8B,EAC9B,QAAkC;QAElC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,KAAK,CAAC;QAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QACjD,MAAM,MAAM,GACV,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;YACjE,0BAA0B,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,eAAe,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC;QAExB,OAAO,gBAAgB,CAAC;YACtB,MAAM;YACN,QAAQ;YACR,UAAU;YACV,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;SAC5C,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import { type NetworkEventHandlers, type TriggerAction } from "@pagepocket/interceptor";
2
+ import type { CdpClient } from "./types";
3
+ export declare const createPageActions: (client: CdpClient, handlers: NetworkEventHandlers) => {
4
+ ensurePageEnabled: () => Promise<void>;
5
+ runTriggerActions: (actions?: TriggerAction[]) => Promise<void>;
6
+ };
7
+ //# sourceMappingURL=page-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-actions.d.ts","sourceRoot":"","sources":["../src/page-actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,eAAO,MAAM,iBAAiB,GAAI,QAAQ,SAAS,EAAE,UAAU,oBAAoB;;kCASvC,aAAa,EAAE;CA6C1D,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { TriggerActionValues } from "@pagepocket/interceptor";
2
+ import { callCdp } from "./cdp-utils";
3
+ export const createPageActions = (client, handlers) => {
4
+ const ensurePageEnabled = async () => {
5
+ try {
6
+ await callCdp(client, "Page.enable");
7
+ }
8
+ catch {
9
+ // Page domain may be unavailable; ignore.
10
+ }
11
+ };
12
+ const runTriggerActions = async (actions = []) => {
13
+ if (actions.length === 0) {
14
+ return;
15
+ }
16
+ await ensurePageEnabled();
17
+ for (const action of actions) {
18
+ if (action === TriggerActionValues.HOVER) {
19
+ try {
20
+ await callCdp(client, "Runtime.evaluate", {
21
+ expression: `(() => {
22
+ const elements = Array.from(document.querySelectorAll('*'));
23
+ for (const el of elements) {
24
+ const rect = el.getBoundingClientRect();
25
+ const x = rect.left + rect.width / 2;
26
+ const y = rect.top + rect.height / 2;
27
+ const ev = new MouseEvent('mouseover', { bubbles: true, cancelable: true, clientX: x, clientY: y });
28
+ el.dispatchEvent(ev);
29
+ }
30
+ })();`
31
+ });
32
+ }
33
+ catch (error) {
34
+ handlers.onError?.(error);
35
+ }
36
+ }
37
+ if (action === TriggerActionValues.SCROLL_TO_END) {
38
+ try {
39
+ await callCdp(client, "Runtime.evaluate", {
40
+ expression: `(() => {
41
+ const scrollHeight = document.documentElement?.scrollHeight ?? document.body?.scrollHeight;
42
+ if (typeof scrollHeight === 'number') {
43
+ window.scrollTo({ top: scrollHeight, behavior: 'instant' });
44
+ }
45
+ })();`
46
+ });
47
+ }
48
+ catch (error) {
49
+ handlers.onError?.(error);
50
+ }
51
+ }
52
+ }
53
+ };
54
+ return { ensurePageEnabled, runTriggerActions };
55
+ };
56
+ //# sourceMappingURL=page-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-actions.js","sourceRoot":"","sources":["../src/page-actions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAGpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAiB,EAAE,QAA8B,EAAE,EAAE;IACrF,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,OAAO,CAAO,MAAM,EAAE,aAAa,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,KAAK,EAAE,UAA2B,EAAE,EAAE,EAAE;QAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,MAAM,iBAAiB,EAAE,CAAC;QAE1B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,KAAK,mBAAmB,CAAC,KAAK,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,MAAM,EAAE,kBAAkB,EAAE;wBACxC,UAAU,EAAE;;;;;;;;;kBASN;qBACP,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAc,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YAED,IAAI,MAAM,KAAK,mBAAmB,CAAC,aAAa,EAAE,CAAC;gBACjD,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,MAAM,EAAE,kBAAkB,EAAE;wBACxC,UAAU,EAAE;;;;;kBAKN;qBACP,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAc,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;AAClD,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { InterceptSession, NetworkEventHandlers, TriggerAction } from "@pagepocket/interceptor";
2
+ import type { CdpClient } from "./types";
3
+ type CreateSessionOptions = {
4
+ client: CdpClient;
5
+ handlers: NetworkEventHandlers;
6
+ ownsClient: boolean;
7
+ triggerActions?: TriggerAction[];
8
+ };
9
+ export declare const createCdpSession: ({ client, handlers, ownsClient, triggerActions }: CreateSessionOptions) => Promise<InterceptSession>;
10
+ export {};
11
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EAIpB,aAAa,EACd,MAAM,yBAAyB,CAAC;AAcjC,OAAO,KAAK,EACV,SAAS,EAOV,MAAM,SAAS,CAAC;AAEjB,KAAK,oBAAoB,GAAG;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,kDAKpC,oBAAoB,KAAG,OAAO,CAAC,gBAAgB,CA0TjD,CAAC"}