slybrowser 0.1.0

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.
Files changed (62) hide show
  1. package/README.md +146 -0
  2. package/dist/automation.d.ts +15 -0
  3. package/dist/automation.d.ts.map +1 -0
  4. package/dist/automation.js +69 -0
  5. package/dist/automation.js.map +1 -0
  6. package/dist/browser.d.ts +31 -0
  7. package/dist/browser.d.ts.map +1 -0
  8. package/dist/browser.js +203 -0
  9. package/dist/browser.js.map +1 -0
  10. package/dist/canonical.d.ts +4 -0
  11. package/dist/canonical.d.ts.map +1 -0
  12. package/dist/canonical.js +42 -0
  13. package/dist/canonical.js.map +1 -0
  14. package/dist/cdp.d.ts +21 -0
  15. package/dist/cdp.d.ts.map +1 -0
  16. package/dist/cdp.js +139 -0
  17. package/dist/cdp.js.map +1 -0
  18. package/dist/cli.d.ts +19 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +241 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/errors.d.ts +21 -0
  23. package/dist/errors.d.ts.map +1 -0
  24. package/dist/errors.js +113 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/humanize.d.ts +23 -0
  27. package/dist/humanize.d.ts.map +1 -0
  28. package/dist/humanize.js +247 -0
  29. package/dist/humanize.js.map +1 -0
  30. package/dist/index.d.ts +13 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +13 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/installer.d.ts +43 -0
  35. package/dist/installer.d.ts.map +1 -0
  36. package/dist/installer.js +669 -0
  37. package/dist/installer.js.map +1 -0
  38. package/dist/launcher.d.ts +38 -0
  39. package/dist/launcher.d.ts.map +1 -0
  40. package/dist/launcher.js +325 -0
  41. package/dist/launcher.js.map +1 -0
  42. package/dist/license.d.ts +76 -0
  43. package/dist/license.d.ts.map +1 -0
  44. package/dist/license.js +329 -0
  45. package/dist/license.js.map +1 -0
  46. package/dist/licensed.d.ts +82 -0
  47. package/dist/licensed.d.ts.map +1 -0
  48. package/dist/licensed.js +513 -0
  49. package/dist/licensed.js.map +1 -0
  50. package/dist/manifest.d.ts +66 -0
  51. package/dist/manifest.d.ts.map +1 -0
  52. package/dist/manifest.js +292 -0
  53. package/dist/manifest.js.map +1 -0
  54. package/dist/service.d.ts +206 -0
  55. package/dist/service.d.ts.map +1 -0
  56. package/dist/service.js +1271 -0
  57. package/dist/service.js.map +1 -0
  58. package/dist/webdriver.d.ts +208 -0
  59. package/dist/webdriver.d.ts.map +1 -0
  60. package/dist/webdriver.js +592 -0
  61. package/dist/webdriver.js.map +1 -0
  62. package/package.json +78 -0
@@ -0,0 +1,329 @@
1
+ import { createPublicKey, verify as verifySignature } from "node:crypto";
2
+ import { decodeBase64Url } from "./canonical.js";
3
+ import { LicenseError } from "./errors.js";
4
+ const MAX_ENVELOPE_BYTES = 64 * 1024;
5
+ const MAX_PAYLOAD_BYTES = 32 * 1024;
6
+ const ED25519_SPKI_PREFIX = Buffer.from("302a300506032b6570032100", "hex");
7
+ function fail(code, message) {
8
+ throw new LicenseError(message, code);
9
+ }
10
+ function requiredString(document, name) {
11
+ const value = document[name];
12
+ if (typeof value !== "string" || !value || value.length > 512) {
13
+ fail("license_invalid_claims", `Claim ${name} is invalid`);
14
+ }
15
+ return value;
16
+ }
17
+ function requiredInteger(document, name) {
18
+ const value = document[name];
19
+ if (!Number.isSafeInteger(value))
20
+ fail("license_invalid_claims", `Claim ${name} is invalid`);
21
+ return value;
22
+ }
23
+ function parseVersion(value) {
24
+ if (!/^\d+(\.\d+){0,7}$/.test(value))
25
+ fail("license_invalid_claims", "Browser version is invalid");
26
+ return value.split(".").map(Number);
27
+ }
28
+ function compareVersions(left, right) {
29
+ const length = Math.max(left.length, right.length);
30
+ for (let index = 0; index < length; index += 1) {
31
+ const difference = (left[index] ?? 0) - (right[index] ?? 0);
32
+ if (difference !== 0)
33
+ return Math.sign(difference);
34
+ }
35
+ return 0;
36
+ }
37
+ function isSha256(value) {
38
+ return /^[a-f0-9]{64}$/.test(value);
39
+ }
40
+ function optionalArtifactClaims(document, schemaVersion) {
41
+ const value = document.artifact;
42
+ if (value === undefined) {
43
+ if (schemaVersion === 2)
44
+ fail("license_invalid_claims", "Claim artifact is invalid");
45
+ return undefined;
46
+ }
47
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
48
+ fail("license_invalid_claims", "Claim artifact is invalid");
49
+ }
50
+ const artifact = value;
51
+ const platform = requiredString(artifact, "platform");
52
+ const arch = requiredString(artifact, "arch");
53
+ const archiveFormat = requiredString(artifact, "archiveFormat");
54
+ if (!["windows", "linux", "macos"].includes(platform) ||
55
+ !["x64", "arm64"].includes(arch) ||
56
+ !["7z", "zip"].includes(archiveFormat)) {
57
+ fail("license_invalid_claims", "Claim artifact is invalid");
58
+ }
59
+ const modules = artifact.privateModules;
60
+ const resources = artifact.resources;
61
+ if (!Array.isArray(modules) || !Array.isArray(resources)) {
62
+ fail("license_invalid_claims", "Claim artifact is invalid");
63
+ }
64
+ const privateModules = modules.map((module) => {
65
+ if (!module || typeof module !== "object" || Array.isArray(module))
66
+ fail("license_invalid_claims", "Claim artifact is invalid");
67
+ const item = module;
68
+ const path = requiredString(item, "path");
69
+ const sha256 = requiredString(item, "sha256");
70
+ const size = requiredInteger(item, "size");
71
+ const abi = requiredString(item, "abi");
72
+ if (!isSha256(sha256) || size < 0)
73
+ fail("license_invalid_claims", "Claim artifact is invalid");
74
+ return { path, sha256, size, abi };
75
+ });
76
+ const resourceClaims = resources.map((resource) => {
77
+ if (!resource || typeof resource !== "object" || Array.isArray(resource))
78
+ fail("license_invalid_claims", "Claim artifact is invalid");
79
+ const item = resource;
80
+ const path = requiredString(item, "path");
81
+ const sha256 = requiredString(item, "sha256");
82
+ const size = requiredInteger(item, "size");
83
+ if (!isSha256(sha256) || size < 0)
84
+ fail("license_invalid_claims", "Claim artifact is invalid");
85
+ return { path, sha256, size };
86
+ });
87
+ let codeSignature;
88
+ if (Object.hasOwn(artifact, "codeSignature")) {
89
+ const signature = artifact.codeSignature;
90
+ if (!signature || typeof signature !== "object" || Array.isArray(signature)) {
91
+ fail("license_invalid_claims", "Claim artifact is invalid");
92
+ }
93
+ const signatureDocument = signature;
94
+ const scheme = requiredString(signatureDocument, "scheme");
95
+ const certificateSha256 = requiredString(signatureDocument, "certificateSha256");
96
+ const timestampRequired = signatureDocument.timestampRequired;
97
+ if (!["authenticode", "apple-developer-id", "x509-code-signing"].includes(scheme) ||
98
+ !isSha256(certificateSha256) ||
99
+ typeof timestampRequired !== "boolean") {
100
+ fail("license_invalid_claims", "Claim artifact is invalid");
101
+ }
102
+ codeSignature = {
103
+ scheme,
104
+ subject: requiredString(signatureDocument, "subject"),
105
+ certificateSha256,
106
+ timestampRequired,
107
+ };
108
+ }
109
+ const sha256 = requiredString(artifact, "sha256");
110
+ const browserSha256 = requiredString(artifact, "browserSha256");
111
+ const driverSha256 = requiredString(artifact, "driverSha256");
112
+ if (!isSha256(sha256) || !isSha256(browserSha256) || !isSha256(driverSha256)) {
113
+ fail("license_invalid_claims", "Claim artifact is invalid");
114
+ }
115
+ return {
116
+ sha256,
117
+ platform,
118
+ arch,
119
+ archiveFormat,
120
+ browserExecutable: requiredString(artifact, "browserExecutable"),
121
+ driverExecutable: requiredString(artifact, "driverExecutable"),
122
+ browserSha256,
123
+ driverSha256,
124
+ privateModules,
125
+ resources: resourceClaims,
126
+ ...(codeSignature === undefined ? {} : { codeSignature }),
127
+ };
128
+ }
129
+ function parseEnvelope(value) {
130
+ if (typeof value === "object" && !Buffer.isBuffer(value))
131
+ return { ...value };
132
+ const raw = Buffer.isBuffer(value) ? value : Buffer.from(value, "utf8");
133
+ if (raw.length > MAX_ENVELOPE_BYTES)
134
+ fail("license_invalid_envelope", "License envelope is too large");
135
+ try {
136
+ const result = JSON.parse(raw.toString("utf8"));
137
+ if (!result || typeof result !== "object" || Array.isArray(result))
138
+ throw new TypeError();
139
+ return result;
140
+ }
141
+ catch {
142
+ fail("license_invalid_envelope", "License envelope is not valid JSON");
143
+ }
144
+ }
145
+ export class LicenseVerifier {
146
+ #trustedKeys;
147
+ #now;
148
+ #clockSkewSeconds;
149
+ #maxLifetimeSeconds;
150
+ constructor(trustedKeys, options = {}) {
151
+ const entries = trustedKeys instanceof Map ? trustedKeys.entries() : Object.entries(trustedKeys);
152
+ this.#trustedKeys = new Map([...entries].map(([key, value]) => [key, Buffer.from(value)]));
153
+ if ([...this.#trustedKeys.values()].some((key) => key.length !== 32)) {
154
+ throw new TypeError("Ed25519 public keys must contain exactly 32 bytes");
155
+ }
156
+ this.#now = options.now ?? (() => Date.now() / 1000);
157
+ this.#clockSkewSeconds = options.clockSkewSeconds ?? 30;
158
+ this.#maxLifetimeSeconds = options.maxLifetimeSeconds ?? 24 * 60 * 60;
159
+ }
160
+ verify(value, options) {
161
+ const envelope = parseEnvelope(value);
162
+ const fields = Object.keys(envelope).sort().join(",");
163
+ if (fields !== "algorithm,keyId,payload,signature") {
164
+ fail("license_invalid_envelope", "License envelope fields are invalid");
165
+ }
166
+ if (envelope.algorithm !== "Ed25519") {
167
+ fail("license_algorithm_unsupported", "License algorithm is not allowed");
168
+ }
169
+ const keyId = requiredString(envelope, "keyId");
170
+ const publicKey = this.#trustedKeys.get(keyId);
171
+ if (!publicKey)
172
+ fail("license_key_unknown", "License signing key is not trusted");
173
+ let payload;
174
+ let signature;
175
+ try {
176
+ payload = decodeBase64Url(envelope.payload, MAX_PAYLOAD_BYTES);
177
+ signature = decodeBase64Url(envelope.signature, 64);
178
+ }
179
+ catch {
180
+ fail("license_invalid_envelope", "License encoding is invalid");
181
+ }
182
+ if (signature.length !== 64)
183
+ fail("license_invalid_signature", "License signature length is invalid");
184
+ const key = createPublicKey({
185
+ key: Buffer.concat([ED25519_SPKI_PREFIX, publicKey]),
186
+ format: "der",
187
+ type: "spki",
188
+ });
189
+ if (!verifySignature(null, payload, key, signature)) {
190
+ fail("license_invalid_signature", "License signature is invalid");
191
+ }
192
+ let document;
193
+ try {
194
+ const parsed = JSON.parse(payload.toString("utf8"));
195
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
196
+ throw new TypeError();
197
+ document = parsed;
198
+ }
199
+ catch {
200
+ fail("license_invalid_claims", "License payload is not valid JSON");
201
+ }
202
+ return this.#validateClaims(document, options);
203
+ }
204
+ #validateClaims(document, options) {
205
+ const schemaVersion = requiredInteger(document, "schemaVersion");
206
+ if (schemaVersion !== 1 && schemaVersion !== 2) {
207
+ fail("license_schema_unsupported", "License schema is not supported");
208
+ }
209
+ const audience = requiredString(document, "audience");
210
+ if (audience !== (options.audience ?? "slybrowser")) {
211
+ fail("license_wrong_audience", "License audience does not match");
212
+ }
213
+ const issuedAt = requiredInteger(document, "issuedAt");
214
+ const notBefore = requiredInteger(document, "notBefore");
215
+ const expiresAt = requiredInteger(document, "expiresAt");
216
+ if (notBefore < issuedAt || expiresAt <= notBefore) {
217
+ fail("license_invalid_time", "License time range is invalid");
218
+ }
219
+ if (expiresAt - issuedAt > this.#maxLifetimeSeconds) {
220
+ fail("license_lifetime_exceeded", "License lifetime exceeds policy");
221
+ }
222
+ const now = Math.floor(this.#now());
223
+ if (issuedAt > now + this.#clockSkewSeconds || notBefore > now + this.#clockSkewSeconds) {
224
+ fail("license_not_yet_valid", "License is not yet valid");
225
+ }
226
+ if (expiresAt <= now - this.#clockSkewSeconds)
227
+ fail("license_expired", "License has expired");
228
+ const browserMin = requiredString(document, "browserMin");
229
+ const browserMax = requiredString(document, "browserMax");
230
+ const browserVersion = parseVersion(options.browserVersion);
231
+ const claimBrowserVersion = document.browserVersion === undefined ? undefined : requiredString(document, "browserVersion");
232
+ if (schemaVersion === 2 && claimBrowserVersion !== options.browserVersion) {
233
+ fail("license_browser_unsupported", "Browser version is outside the license range");
234
+ }
235
+ if (compareVersions(parseVersion(browserMin), browserVersion) > 0 ||
236
+ compareVersions(browserVersion, parseVersion(browserMax)) > 0) {
237
+ fail("license_browser_unsupported", "Browser version is outside the license range");
238
+ }
239
+ const planIdValue = document.planId;
240
+ const planId = planIdValue === undefined ? undefined : requiredString(document, "planId");
241
+ const concurrencyValue = document.concurrencyLimit;
242
+ const concurrencyLimit = concurrencyValue === undefined ? undefined : requiredInteger(document, "concurrencyLimit");
243
+ if (concurrencyLimit !== undefined && concurrencyLimit < 1) {
244
+ fail("license_invalid_claims", "Claim concurrencyLimit is invalid");
245
+ }
246
+ const paidThroughValue = document.paidThrough;
247
+ const paidThrough = paidThroughValue === undefined || paidThroughValue === null
248
+ ? paidThroughValue
249
+ : requiredInteger(document, "paidThrough");
250
+ if (paidThrough !== undefined && paidThrough !== null && paidThrough < 0) {
251
+ fail("license_invalid_claims", "Claim paidThrough is invalid");
252
+ }
253
+ const licenseStatusValue = document.licenseStatus;
254
+ const licenseStatus = licenseStatusValue === undefined
255
+ ? undefined
256
+ : requiredString(document, "licenseStatus");
257
+ if (licenseStatus !== undefined && !["active", "hold", "revoked"].includes(licenseStatus)) {
258
+ fail("license_invalid_claims", "Claim licenseStatus is invalid");
259
+ }
260
+ const artifactSha256Value = document.artifactSha256;
261
+ const artifactSha256 = artifactSha256Value === undefined ? undefined : requiredString(document, "artifactSha256");
262
+ if (artifactSha256 !== undefined && !isSha256(artifactSha256)) {
263
+ fail("license_invalid_claims", "Claim artifactSha256 is invalid");
264
+ }
265
+ const browserSha256Value = document.browserSha256;
266
+ const browserSha256 = browserSha256Value === undefined ? undefined : requiredString(document, "browserSha256");
267
+ if (browserSha256 !== undefined && !isSha256(browserSha256)) {
268
+ fail("license_invalid_claims", "Claim browserSha256 is invalid");
269
+ }
270
+ const driverSha256Value = document.driverSha256;
271
+ const driverSha256 = driverSha256Value === undefined ? undefined : requiredString(document, "driverSha256");
272
+ if (driverSha256 !== undefined && !isSha256(driverSha256)) {
273
+ fail("license_invalid_claims", "Claim driverSha256 is invalid");
274
+ }
275
+ const leaseGenerationValue = document.leaseGeneration;
276
+ const leaseGeneration = leaseGenerationValue === undefined ? undefined : requiredInteger(document, "leaseGeneration");
277
+ if (leaseGeneration !== undefined && leaseGeneration < 1) {
278
+ fail("license_invalid_claims", "Claim leaseGeneration is invalid");
279
+ }
280
+ const artifact = optionalArtifactClaims(document, schemaVersion);
281
+ if (artifact !== undefined &&
282
+ (artifact.sha256 !== artifactSha256 || artifact.browserSha256 !== browserSha256 || artifact.driverSha256 !== driverSha256)) {
283
+ fail("license_invalid_claims", "Claim artifact does not match flat hashes");
284
+ }
285
+ const features = document.features;
286
+ if (!Array.isArray(features) ||
287
+ features.some((item) => typeof item !== "string" || !item || item.length > 128) ||
288
+ new Set(features).size !== features.length) {
289
+ fail("license_invalid_claims", "License features are invalid");
290
+ }
291
+ const missing = [...(options.requiredFeatures ?? [])].filter((item) => !features.includes(item));
292
+ if (missing.length)
293
+ fail("license_feature_denied", `License does not grant: ${missing.sort().join(", ")}`);
294
+ const claimDeviceHash = document.deviceHash;
295
+ if (claimDeviceHash !== undefined && (typeof claimDeviceHash !== "string" || !claimDeviceHash)) {
296
+ fail("license_invalid_claims", "License device hash is invalid");
297
+ }
298
+ if (options.deviceHash !== undefined && claimDeviceHash !== options.deviceHash) {
299
+ fail("license_device_mismatch", "License device binding does not match");
300
+ }
301
+ const claims = {
302
+ schemaVersion,
303
+ licenseId: requiredString(document, "licenseId"),
304
+ audience,
305
+ issuedAt,
306
+ notBefore,
307
+ expiresAt,
308
+ ...(claimBrowserVersion === undefined ? {} : { browserVersion: claimBrowserVersion }),
309
+ browserMin,
310
+ browserMax,
311
+ ...(planId === undefined ? {} : { planId }),
312
+ ...(concurrencyLimit === undefined ? {} : { concurrencyLimit }),
313
+ ...(paidThrough === undefined ? {} : { paidThrough }),
314
+ ...(licenseStatus === undefined ? {} : { licenseStatus }),
315
+ ...(artifactSha256 === undefined ? {} : { artifactSha256 }),
316
+ ...(browserSha256 === undefined ? {} : { browserSha256 }),
317
+ ...(driverSha256 === undefined ? {} : { driverSha256 }),
318
+ ...(artifact === undefined ? {} : { artifact }),
319
+ ...(leaseGeneration === undefined ? {} : { leaseGeneration }),
320
+ features: features,
321
+ sessionId: requiredString(document, "sessionId"),
322
+ nonce: requiredString(document, "nonce"),
323
+ };
324
+ if (typeof claimDeviceHash === "string")
325
+ claims.deviceHash = claimDeviceHash;
326
+ return claims;
327
+ }
328
+ }
329
+ //# sourceMappingURL=license.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { type BrowserInstallation, type InstallOptions } from "./installer.js";
2
+ import { type FrameworkLaunchSettings, type PlaywrightLike, type PuppeteerLike } from "./browser.js";
3
+ import type { AutomationBackend } from "./automation.js";
4
+ import { LicenseServiceClient, type BrowserVersionPolicy, type KernelMajor, type LicenseServiceClientOptions, type RuntimeSessionGrant } from "./service.js";
5
+ import { type SlyWebDriverSession, type WebDriverLaunchSettings } from "./webdriver.js";
6
+ export interface LicensedLaunchOptions extends Omit<WebDriverLaunchSettings, "driverExecutable"> {
7
+ trust: LicenseServiceClientOptions;
8
+ install?: InstallOptions;
9
+ platform?: "windows" | "linux" | "macos";
10
+ arch?: "x64" | "arm64";
11
+ deviceHash?: string;
12
+ kernelMajor?: KernelMajor;
13
+ updateKernel?: boolean;
14
+ browserVersion?: string;
15
+ versionPolicy?: BrowserVersionPolicy;
16
+ automationBackend?: AutomationBackend;
17
+ }
18
+ export interface BrowserVersionAudit {
19
+ requested: string | null;
20
+ selected: string;
21
+ downloaded: string;
22
+ launched: string;
23
+ policy: BrowserVersionPolicy;
24
+ selectionReason: "latest" | "exact" | "rollback";
25
+ }
26
+ export interface LicensedFrameworkLaunchOptions extends FrameworkLaunchSettings {
27
+ trust: LicenseServiceClientOptions;
28
+ install?: InstallOptions;
29
+ platform?: "windows" | "linux" | "macos";
30
+ arch?: "x64" | "arm64";
31
+ deviceHash?: string;
32
+ kernelMajor?: KernelMajor;
33
+ updateKernel?: boolean;
34
+ browserVersion?: string;
35
+ versionPolicy?: BrowserVersionPolicy;
36
+ }
37
+ export interface LicensedRuntimeMetadata {
38
+ sessionId: string;
39
+ plan: string;
40
+ concurrencyLimit: number;
41
+ browserVersion: string;
42
+ versionPolicy?: BrowserVersionPolicy;
43
+ selectionReason?: "latest" | "exact" | "rollback";
44
+ versionAudit?: BrowserVersionAudit;
45
+ }
46
+ export type LicensedFrameworkRuntime<T> = T & {
47
+ licenseRuntime?: LicensedRuntimeMetadata;
48
+ };
49
+ export declare function verifyBrowserVersionAudit(audit: BrowserVersionAudit): BrowserVersionAudit;
50
+ export declare function heartbeatDelayMilliseconds(heartbeatAfterSeconds: number, _random?: () => number): number;
51
+ export declare function installLatestAuthorizedBrowser(authorizationFile: string, options: {
52
+ trust: LicenseServiceClientOptions;
53
+ install?: InstallOptions;
54
+ platform?: "windows" | "linux" | "macos";
55
+ arch?: "x64" | "arm64";
56
+ deviceHash?: string;
57
+ kernelMajor?: KernelMajor;
58
+ updateKernel?: boolean;
59
+ browserVersion?: string;
60
+ versionPolicy?: BrowserVersionPolicy;
61
+ automationBackend?: AutomationBackend;
62
+ }): Promise<{
63
+ client: LicenseServiceClient;
64
+ grant: RuntimeSessionGrant;
65
+ installation: BrowserInstallation;
66
+ release(): Promise<void>;
67
+ }>;
68
+ export declare function installLatest(authorizationFile: string, options: Parameters<typeof installLatestAuthorizedBrowser>[1]): Promise<BrowserInstallation>;
69
+ export declare function prepareAuthorizedBrowser(authorizationFile: string, options: Parameters<typeof installLatestAuthorizedBrowser>[1]): Promise<Awaited<ReturnType<typeof installLatestAuthorizedBrowser>>>;
70
+ export declare const installAuthorizedBrowser: typeof prepareAuthorizedBrowser;
71
+ export declare function installAuthorized(authorizationFile: string, options: Parameters<typeof installLatestAuthorizedBrowser>[1]): Promise<BrowserInstallation>;
72
+ export declare function launchLatest(authorizationFile: string, options: LicensedLaunchOptions): Promise<SlyWebDriverSession>;
73
+ export declare function launchLatestPlaywright<TBrowser>(playwright: PlaywrightLike<TBrowser>, authorizationFile: string, options: LicensedFrameworkLaunchOptions): Promise<LicensedFrameworkRuntime<TBrowser>>;
74
+ export declare function launchLatestPlaywrightPersistent<TContext>(playwright: PlaywrightLike<unknown, TContext>, userDataDir: string, authorizationFile: string, options: LicensedFrameworkLaunchOptions): Promise<LicensedFrameworkRuntime<TContext>>;
75
+ export declare function launchLatestPuppeteer<TBrowser>(puppeteer: PuppeteerLike<TBrowser>, authorizationFile: string, options: LicensedFrameworkLaunchOptions): Promise<LicensedFrameworkRuntime<TBrowser>>;
76
+ export declare function launchLatestPuppeteerPersistent<TBrowser>(puppeteer: PuppeteerLike<TBrowser>, userDataDir: string, authorizationFile: string, options: LicensedFrameworkLaunchOptions): Promise<LicensedFrameworkRuntime<TBrowser>>;
77
+ export declare function launchAuthorized(authorizationFile: string, options: LicensedLaunchOptions): Promise<SlyWebDriverSession>;
78
+ export declare function launchAuthorizedPlaywright<TBrowser>(playwright: PlaywrightLike<TBrowser>, authorizationFile: string, options: LicensedFrameworkLaunchOptions): Promise<LicensedFrameworkRuntime<TBrowser>>;
79
+ export declare function launchAuthorizedPlaywrightPersistent<TContext>(playwright: PlaywrightLike<unknown, TContext>, userDataDir: string, authorizationFile: string, options: LicensedFrameworkLaunchOptions): Promise<LicensedFrameworkRuntime<TContext>>;
80
+ export declare function launchAuthorizedPuppeteer<TBrowser>(puppeteer: PuppeteerLike<TBrowser>, authorizationFile: string, options: LicensedFrameworkLaunchOptions): Promise<LicensedFrameworkRuntime<TBrowser>>;
81
+ export declare function launchAuthorizedPuppeteerPersistent<TBrowser>(puppeteer: PuppeteerLike<TBrowser>, userDataDir: string, authorizationFile: string, options: LicensedFrameworkLaunchOptions): Promise<LicensedFrameworkRuntime<TBrowser>>;
82
+ //# sourceMappingURL=licensed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"licensed.d.ts","sourceRoot":"","sources":["../src/licensed.ts"],"names":[],"mappings":"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"}