@browsercore/profiles 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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/dist/diff.d.ts +37 -0
  4. package/dist/diff.d.ts.map +1 -0
  5. package/dist/diff.js +140 -0
  6. package/dist/diff.js.map +1 -0
  7. package/dist/errors.d.ts +20 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +27 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/index.d.ts +17 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.internal.d.ts +9 -0
  14. package/dist/index.internal.d.ts.map +1 -0
  15. package/dist/index.internal.js +9 -0
  16. package/dist/index.internal.js.map +1 -0
  17. package/dist/index.js +14 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/profiles/chrome.d.ts +18 -0
  20. package/dist/profiles/chrome.d.ts.map +1 -0
  21. package/dist/profiles/chrome.js +214 -0
  22. package/dist/profiles/chrome.js.map +1 -0
  23. package/dist/profiles/edge.d.ts +17 -0
  24. package/dist/profiles/edge.d.ts.map +1 -0
  25. package/dist/profiles/edge.js +161 -0
  26. package/dist/profiles/edge.js.map +1 -0
  27. package/dist/profiles/firefox.d.ts +17 -0
  28. package/dist/profiles/firefox.d.ts.map +1 -0
  29. package/dist/profiles/firefox.js +204 -0
  30. package/dist/profiles/firefox.js.map +1 -0
  31. package/dist/profiles/safari.d.ts +16 -0
  32. package/dist/profiles/safari.d.ts.map +1 -0
  33. package/dist/profiles/safari.js +134 -0
  34. package/dist/profiles/safari.js.map +1 -0
  35. package/dist/registry.d.ts +17 -0
  36. package/dist/registry.d.ts.map +1 -0
  37. package/dist/registry.js +48 -0
  38. package/dist/registry.js.map +1 -0
  39. package/dist/types.d.ts +83 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +9 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/utils.d.ts +18 -0
  44. package/dist/utils.d.ts.map +1 -0
  45. package/dist/utils.js +23 -0
  46. package/dist/utils.js.map +1 -0
  47. package/dist/validate.d.ts +80 -0
  48. package/dist/validate.d.ts.map +1 -0
  49. package/dist/validate.js +185 -0
  50. package/dist/validate.js.map +1 -0
  51. package/package.json +43 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jens Verneuer
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE
package/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # @browsercore/profiles
2
+
3
+ Browser fingerprint definitions (TLS / HTTP/2 / HTTP/1.1). Pure data — no protocol implementation.
4
+
5
+ ## Responsibility
6
+
7
+ Define WHAT a browser fingerprint looks like so that higher layers (tls, http1, http2) can translate it into bytes, header order, and SETTINGS frames. Adding a new Chrome version means adding a new entry here — protocol implementations never change.
8
+
9
+ ## What it does NOT know about
10
+
11
+ - TLS handshakes or cryptography
12
+ - HTTP parsing or serialization
13
+ - Sockets or I/O
14
+ - Cookies
15
+
16
+ ## Public API
17
+
18
+ ```ts
19
+ import { getProfile, listProfiles, registerProfile } from "@browsercore/profiles";
20
+
21
+ const chrome = getProfile("chrome-140" as ProfileId);
22
+ console.log(chrome.tls.cipherSuites); // ordered cipher list
23
+ console.log(chrome.http2.settings); // HTTP/2 SETTINGS frame values
24
+
25
+ const all = listProfiles(); // ["chrome-120", "chrome-128", ...]
26
+
27
+ registerProfile(myCustomProfile); // extensibility hook
28
+ ```
29
+
30
+ ## Types
31
+
32
+ | Export | Kind | Purpose |
33
+ | --- | --- | --- |
34
+ | `BrowserProfile` | interface | Complete fingerprint across TLS + HTTP/2 + HTTP/1.1 |
35
+ | `TlsProfile` | interface | Cipher order, extensions, GREASE, signature algorithms |
36
+ | `Http2Profile` | interface | SETTINGS, window sizes, priority |
37
+ | `Http1Profile` | interface | Default headers, header order, accept-encoding |
38
+ | `ProfileId` | branded string | Opaque profile identifier |
39
+ | `ProfileName` | literal union | `"chrome" \| "firefox" \| "safari" \| "edge"` |
40
+ | `getProfile()` | function | Look up a profile by id |
41
+ | `listProfiles()` | function | List all registered ids |
42
+ | `registerProfile()` | function | Add a custom profile at runtime |
43
+ | `UnknownProfileError` | class | Thrown when a profile id is not found |
44
+
45
+ ## Dependency graph
46
+
47
+ ```
48
+ @browsercore/profiles
49
+ ```
50
+
51
+ No other `@browsercore/*` packages and no Node built-ins are imported. This is a pure data package.
package/dist/diff.d.ts ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Profile diff utility.
3
+ *
4
+ * Walks two {@link BrowserProfile} objects field-by-field and reports every
5
+ * differing path. This is how we detect fingerprint drift between two profile
6
+ * versions, or between a profile and a real capture.
7
+ *
8
+ * Array comparison is order-sensitive by default — cipher suite order is itself
9
+ * a fingerprint signal, so reordering must surface as a diff.
10
+ */
11
+ import type { BrowserProfile } from "./types.js";
12
+ /** Options controlling how profiles are compared. */
13
+ export interface DiffOptions {
14
+ /**
15
+ * When true (the default), arrays are compared element-by-element in order.
16
+ * When false, arrays are compared as multisets (order is ignored).
17
+ */
18
+ readonly compareArrayOrder?: boolean;
19
+ }
20
+ /** A single difference between two profiles, located by its dotted path. */
21
+ export interface ProfileDiff {
22
+ /** Dotted path to the differing field, e.g. "tls.cipherSuites[3]". */
23
+ readonly path: string;
24
+ /** Value in the left-hand profile. */
25
+ readonly a: unknown;
26
+ /** Value in the right-hand profile. */
27
+ readonly b: unknown;
28
+ }
29
+ /**
30
+ * Deep, field-by-field diff of two browser profiles.
31
+ *
32
+ * Returns a {@link ProfileDiff} for every differing path. The result is empty
33
+ * when the profiles are structurally equal. Array comparison is order-sensitive
34
+ * by default; pass `{ compareArrayOrder: false }` to ignore element order.
35
+ */
36
+ export declare function diffProfiles(a: BrowserProfile, b: BrowserProfile, options?: DiffOptions): ProfileDiff[];
37
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qDAAqD;AACrD,MAAM,WAAW,WAAW;IACxB;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,4EAA4E;AAC5E,MAAM,WAAW,WAAW;IACxB,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;CACvB;AAyJD;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,CAAC,EAAE,cAAc,EACjB,CAAC,EAAE,cAAc,EACjB,OAAO,GAAE,WAAgB,GAC1B,WAAW,EAAE,CAIf"}
package/dist/diff.js ADDED
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Profile diff utility.
3
+ *
4
+ * Walks two {@link BrowserProfile} objects field-by-field and reports every
5
+ * differing path. This is how we detect fingerprint drift between two profile
6
+ * versions, or between a profile and a real capture.
7
+ *
8
+ * Array comparison is order-sensitive by default — cipher suite order is itself
9
+ * a fingerprint signal, so reordering must surface as a diff.
10
+ */
11
+ /** Narrow `unknown` to a structural object without relying on `Array.isArray`'s `any` narrowing. */
12
+ function isObject(x) {
13
+ return typeof x === "object" && x !== null;
14
+ }
15
+ /** Narrow `unknown` to an array with a typed predicate (avoids `Array.isArray` → `any[]`). */
16
+ function isArray(x) {
17
+ return Array.isArray(x);
18
+ }
19
+ /** Append a single diff. */
20
+ function emit(out, path, a, b) {
21
+ out.push({ path, a, b });
22
+ }
23
+ /** Sorted union of own-property keys from both objects, for deterministic output. */
24
+ function unionKeys(a, b) {
25
+ const keys = new Set();
26
+ for (const k of Object.keys(a))
27
+ keys.add(k);
28
+ for (const k of Object.keys(b))
29
+ keys.add(k);
30
+ return Array.from(keys).sort();
31
+ }
32
+ /**
33
+ * Recursively diff two structural values, appending results to `out`.
34
+ * Reference equality (`===`) short-circuits identical subtrees.
35
+ */
36
+ function walk(path, a, b, options, out) {
37
+ if (a === b)
38
+ return;
39
+ const aArr = isArray(a);
40
+ const bArr = isArray(b);
41
+ if (aArr && bArr) {
42
+ walkArray(path, a, b, options, out);
43
+ return;
44
+ }
45
+ // One is an array and the other is not — incomparable at this path.
46
+ if (aArr || bArr) {
47
+ emit(out, path, a, b);
48
+ return;
49
+ }
50
+ if (isObject(a) && isObject(b)) {
51
+ for (const key of unionKeys(a, b)) {
52
+ const childPath = path === "" ? key : `${path}.${key}`;
53
+ const aHas = Object.prototype.hasOwnProperty.call(a, key);
54
+ const bHas = Object.prototype.hasOwnProperty.call(b, key);
55
+ if (aHas && bHas) {
56
+ walk(childPath, a[key], b[key], options, out);
57
+ }
58
+ else if (aHas) {
59
+ emit(out, childPath, a[key], undefined);
60
+ }
61
+ else {
62
+ emit(out, childPath, undefined, b[key]);
63
+ }
64
+ }
65
+ return;
66
+ }
67
+ // Primitives (or type mismatches) that are not `===`.
68
+ emit(out, path, a, b);
69
+ }
70
+ /**
71
+ * Diff two arrays. In ordered mode (default) compares element-by-element so
72
+ * reordering is reported. In unordered mode compares as multisets.
73
+ */
74
+ function walkArray(path, a, b, options, out) {
75
+ if (options.compareArrayOrder ?? true) {
76
+ const max = Math.max(a.length, b.length);
77
+ for (let i = 0; i < max; i++) {
78
+ const childPath = `${path}[${i}]`;
79
+ const aHas = i < a.length;
80
+ const bHas = i < b.length;
81
+ if (aHas && bHas) {
82
+ walk(childPath, a[i], b[i], options, out);
83
+ }
84
+ else if (aHas) {
85
+ emit(out, childPath, a[i], undefined);
86
+ }
87
+ else {
88
+ emit(out, childPath, undefined, b[i]);
89
+ }
90
+ }
91
+ return;
92
+ }
93
+ // Unordered: compare as multisets of serialized keys. A single whole-array
94
+ // diff is reported when membership differs.
95
+ const sortKey = (v) => isObject(v) || isArray(v) ? stableStringify(v) : String(v);
96
+ const sortedA = a.map(sortKey).sort();
97
+ const sortedB = b.map(sortKey).sort();
98
+ let equal = sortedA.length === sortedB.length;
99
+ if (equal) {
100
+ for (let i = 0; i < sortedA.length; i++) {
101
+ if (sortedA[i] !== sortedB[i]) {
102
+ equal = false;
103
+ break;
104
+ }
105
+ }
106
+ }
107
+ if (!equal) {
108
+ emit(out, path, a, b);
109
+ }
110
+ }
111
+ /** Stable JSON.stringify using sorted object keys, for deterministic multiset comparison. */
112
+ function stableStringify(value) {
113
+ return JSON.stringify(sortValue(value));
114
+ }
115
+ function sortValue(value) {
116
+ if (isArray(value)) {
117
+ return value.map(sortValue);
118
+ }
119
+ if (isObject(value)) {
120
+ const sorted = {};
121
+ for (const key of Object.keys(value).sort()) {
122
+ sorted[key] = sortValue(value[key]);
123
+ }
124
+ return sorted;
125
+ }
126
+ return value;
127
+ }
128
+ /**
129
+ * Deep, field-by-field diff of two browser profiles.
130
+ *
131
+ * Returns a {@link ProfileDiff} for every differing path. The result is empty
132
+ * when the profiles are structurally equal. Array comparison is order-sensitive
133
+ * by default; pass `{ compareArrayOrder: false }` to ignore element order.
134
+ */
135
+ export function diffProfiles(a, b, options = {}) {
136
+ const out = [];
137
+ walk("", a, b, options, out);
138
+ return out;
139
+ }
140
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Typed errors for @browsercore/profiles.
3
+ *
4
+ * Errors are part of the API — callers match on `kind` instead of parsing messages.
5
+ */
6
+ /** Base class for all profile lookup / registration failures. */
7
+ export declare class ProfileError extends Error {
8
+ readonly kind: string;
9
+ readonly cause: Error | undefined;
10
+ constructor(kind: string, message: string, options?: {
11
+ cause?: Error;
12
+ });
13
+ }
14
+ /** No profile exists for the requested {@link ProfileId}. */
15
+ export declare class UnknownProfileError extends ProfileError {
16
+ readonly kind: "UnknownProfileError";
17
+ readonly profileId: string;
18
+ constructor(profileId: string);
19
+ }
20
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iEAAiE;AACjE,qBAAa,YAAa,SAAQ,KAAK;IACnC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAyB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;gBAG9C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAOlC;AAED,6DAA6D;AAC7D,qBAAa,mBAAoB,SAAQ,YAAY;IACjD,SAAyB,IAAI,EAAG,qBAAqB,CAAU;IAC/D,SAAgB,SAAS,EAAE,MAAM,CAAC;gBAEtB,SAAS,EAAE,MAAM;CAKhC"}
package/dist/errors.js ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Typed errors for @browsercore/profiles.
3
+ *
4
+ * Errors are part of the API — callers match on `kind` instead of parsing messages.
5
+ */
6
+ /** Base class for all profile lookup / registration failures. */
7
+ export class ProfileError extends Error {
8
+ kind;
9
+ cause;
10
+ constructor(kind, message, options) {
11
+ super(message, options);
12
+ this.name = new.target.name;
13
+ this.kind = kind;
14
+ this.cause = options?.cause;
15
+ }
16
+ }
17
+ /** No profile exists for the requested {@link ProfileId}. */
18
+ export class UnknownProfileError extends ProfileError {
19
+ kind = "UnknownProfileError";
20
+ profileId;
21
+ constructor(profileId) {
22
+ super("UnknownProfileError", `Unknown browser profile: ${profileId}`);
23
+ this.name = "UnknownProfileError";
24
+ this.profileId = profileId;
25
+ }
26
+ }
27
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iEAAiE;AACjE,MAAM,OAAO,YAAa,SAAQ,KAAK;IACnB,IAAI,CAAS;IACJ,KAAK,CAAoB;IAElD,YACI,IAAY,EACZ,OAAe,EACf,OAA2B;QAE3B,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;IAChC,CAAC;CACJ;AAED,6DAA6D;AAC7D,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACxB,IAAI,GAAG,qBAA8B,CAAC;IAC/C,SAAS,CAAS;IAElC,YAAY,SAAiB;QACzB,KAAK,CAAC,qBAAqB,EAAE,4BAA4B,SAAS,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;CACJ"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @browsercore/profiles — public API surface.
3
+ *
4
+ * Pure data package: browser fingerprint definitions across TLS, HTTP/2, and
5
+ * HTTP/1.1. No protocol implementation lives here — higher layers read these
6
+ * definitions and translate them into bytes / header order / settings frames.
7
+ */
8
+ export { getProfile, listProfiles, registerProfile, } from "./registry.js";
9
+ export { diffProfiles, } from "./diff.js";
10
+ export type { DiffOptions, ProfileDiff, } from "./diff.js";
11
+ export { buildExpectedClientHello, validateProfileAgainstCapture, ValidationError, } from "./validate.js";
12
+ export type { TlsCapture, ClientHelloExpected, } from "./validate.js";
13
+ export { ChromeProfiles, FirefoxProfiles, SafariProfiles, EdgeProfiles, } from "./index.internal.js";
14
+ export { ProfileError, UnknownProfileError, } from "./errors.js";
15
+ export type { BrowserProfile, Http1Profile, Http2Profile, Http2Settings, Http2Priority, ProfileId, ProfileName, TlsProfile, } from "./types.js";
16
+ export { assertNever } from "./utils.js";
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACH,UAAU,EACV,YAAY,EACZ,eAAe,GAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACH,YAAY,GACf,MAAM,WAAW,CAAC;AAEnB,YAAY,EACR,WAAW,EACX,WAAW,GACd,MAAM,WAAW,CAAC;AAEnB,OAAO,EACH,wBAAwB,EACxB,6BAA6B,EAC7B,eAAe,GAClB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACR,UAAU,EACV,mBAAmB,GACtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACH,cAAc,EACd,eAAe,EACf,cAAc,EACd,YAAY,GACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,YAAY,EACZ,mBAAmB,GACtB,MAAM,aAAa,CAAC;AAErB,YAAY,EACR,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,SAAS,EACT,WAAW,EACX,UAAU,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Barrel re-exporting the per-browser profile maps. Kept separate from the main
3
+ * barrel so internal code can import the maps without pulling in the registry.
4
+ */
5
+ export { ChromeProfiles } from "./profiles/chrome.js";
6
+ export { FirefoxProfiles } from "./profiles/firefox.js";
7
+ export { SafariProfiles } from "./profiles/safari.js";
8
+ export { EdgeProfiles } from "./profiles/edge.js";
9
+ //# sourceMappingURL=index.internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.internal.d.ts","sourceRoot":"","sources":["../src/index.internal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Barrel re-exporting the per-browser profile maps. Kept separate from the main
3
+ * barrel so internal code can import the maps without pulling in the registry.
4
+ */
5
+ export { ChromeProfiles } from "./profiles/chrome.js";
6
+ export { FirefoxProfiles } from "./profiles/firefox.js";
7
+ export { SafariProfiles } from "./profiles/safari.js";
8
+ export { EdgeProfiles } from "./profiles/edge.js";
9
+ //# sourceMappingURL=index.internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.internal.js","sourceRoot":"","sources":["../src/index.internal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @browsercore/profiles — public API surface.
3
+ *
4
+ * Pure data package: browser fingerprint definitions across TLS, HTTP/2, and
5
+ * HTTP/1.1. No protocol implementation lives here — higher layers read these
6
+ * definitions and translate them into bytes / header order / settings frames.
7
+ */
8
+ export { getProfile, listProfiles, registerProfile, } from "./registry.js";
9
+ export { diffProfiles, } from "./diff.js";
10
+ export { buildExpectedClientHello, validateProfileAgainstCapture, ValidationError, } from "./validate.js";
11
+ export { ChromeProfiles, FirefoxProfiles, SafariProfiles, EdgeProfiles, } from "./index.internal.js";
12
+ export { ProfileError, UnknownProfileError, } from "./errors.js";
13
+ export { assertNever } from "./utils.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACH,UAAU,EACV,YAAY,EACZ,eAAe,GAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACH,YAAY,GACf,MAAM,WAAW,CAAC;AAOnB,OAAO,EACH,wBAAwB,EACxB,6BAA6B,EAC7B,eAAe,GAClB,MAAM,eAAe,CAAC;AAOvB,OAAO,EACH,cAAc,EACd,eAAe,EACf,cAAc,EACd,YAAY,GACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,YAAY,EACZ,mBAAmB,GACtB,MAAM,aAAa,CAAC;AAarB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Chrome fingerprint definitions.
3
+ *
4
+ * TLS values mirror real Chrome ClientHello captures (JA3 / JA4 style). Chrome
5
+ * enables GREASE (RFC 8701), advertises TLS 1.3, and sends a stable cipher order
6
+ * per release. HTTP/2 settings track Chrome's real SETTINGS frame. Values are
7
+ * accurate for the listed versions unless noted otherwise.
8
+ */
9
+ import type { BrowserProfile } from "../types.js";
10
+ export declare const chrome120: BrowserProfile;
11
+ export declare const chrome128: BrowserProfile;
12
+ export declare const chrome140: BrowserProfile;
13
+ export declare const ChromeProfiles: {
14
+ readonly chrome120: BrowserProfile;
15
+ readonly chrome128: BrowserProfile;
16
+ readonly chrome140: BrowserProfile;
17
+ };
18
+ //# sourceMappingURL=chrome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../src/profiles/chrome.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,aAAa,CAAC;AAkD7D,eAAO,MAAM,SAAS,EAAE,cAoDvB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,cAoDvB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,cAoDvB,CAAC;AAEF,eAAO,MAAM,cAAc;;;;CAIjB,CAAC"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Chrome fingerprint definitions.
3
+ *
4
+ * TLS values mirror real Chrome ClientHello captures (JA3 / JA4 style). Chrome
5
+ * enables GREASE (RFC 8701), advertises TLS 1.3, and sends a stable cipher order
6
+ * per release. HTTP/2 settings track Chrome's real SETTINGS frame. Values are
7
+ * accurate for the listed versions unless noted otherwise.
8
+ */
9
+ /** TLS 1.3 GREASE placeholder cipher (0x?a?a) Chrome inserts at the top of the list. */
10
+ const GREASE = "TLS_GREASE_RESERVED_0";
11
+ const chromeTlsBase = {
12
+ extensionOrder: [
13
+ 0, 10, 11, 13, 16, 17513, 18, 23, 27, 35, 41, 43, 45, 5, 51, 65281,
14
+ ],
15
+ supportedVersions: ["TLS 1.3", "TLS 1.2"],
16
+ keyShareGroups: ["x25519", "secp256r1"],
17
+ signatureAlgorithms: [
18
+ "ecdsa_secp256r1_sha256",
19
+ "rsa_pss_rsae_sha256",
20
+ "rsa_pkcs1_sha256",
21
+ "ecdsa_secp384r1_sha384",
22
+ "rsa_pss_rsae_sha384",
23
+ "rsa_pkcs1_sha384",
24
+ ],
25
+ grease: true,
26
+ };
27
+ const chromeHttp2Base = {
28
+ initialWindowSize: 6291456,
29
+ maxFrameSize: 16384,
30
+ headerTableSize: 65536,
31
+ weight: 256,
32
+ };
33
+ const chromeHttp1Base = {
34
+ connection: "keep-alive",
35
+ acceptEncoding: "gzip, deflate, br",
36
+ headerOrder: [
37
+ "host",
38
+ "connection",
39
+ "sec-ch-ua",
40
+ "sec-ch-ua-mobile",
41
+ "sec-ch-ua-platform",
42
+ "upgrade-insecure-requests",
43
+ "user-agent",
44
+ "accept",
45
+ "sec-fetch-site",
46
+ "sec-fetch-mode",
47
+ "sec-fetch-user",
48
+ "sec-fetch-dest",
49
+ "accept-encoding",
50
+ "accept-language",
51
+ ],
52
+ };
53
+ export const chrome120 = {
54
+ id: "chrome-120",
55
+ name: "chrome",
56
+ version: "120.0.6099.71",
57
+ tls: {
58
+ ...chromeTlsBase,
59
+ cipherSuites: [
60
+ GREASE,
61
+ "TLS_AES_128_GCM_SHA256",
62
+ "TLS_AES_256_GCM_SHA384",
63
+ "TLS_CHACHA20_POLY1305_SHA256",
64
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
65
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
66
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
67
+ "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
68
+ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
69
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
70
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
71
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
72
+ "TLS_RSA_WITH_AES_128_GCM_SHA256",
73
+ "TLS_RSA_WITH_AES_256_GCM_SHA384",
74
+ "TLS_RSA_WITH_AES_128_CBC_SHA",
75
+ "TLS_RSA_WITH_AES_256_CBC_SHA",
76
+ ],
77
+ },
78
+ http2: {
79
+ ...chromeHttp2Base,
80
+ settings: {
81
+ headerTableSize: 65536,
82
+ enablePush: false,
83
+ maxConcurrentStreams: 100,
84
+ initialWindowSize: 6291456,
85
+ maxFrameSize: 16384,
86
+ },
87
+ },
88
+ http1: {
89
+ ...chromeHttp1Base,
90
+ defaultHeaders: {
91
+ "sec-ch-ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
92
+ "sec-ch-ua-mobile": "?0",
93
+ "sec-ch-ua-platform": '"macOS"',
94
+ "upgrade-insecure-requests": "1",
95
+ "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
96
+ accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
97
+ "sec-fetch-site": "none",
98
+ "sec-fetch-mode": "navigate",
99
+ "sec-fetch-user": "?1",
100
+ "sec-fetch-dest": "document",
101
+ "accept-language": "en-US,en;q=0.9",
102
+ },
103
+ },
104
+ };
105
+ export const chrome128 = {
106
+ id: "chrome-128",
107
+ name: "chrome",
108
+ version: "128.0.6613.137",
109
+ tls: {
110
+ ...chromeTlsBase,
111
+ cipherSuites: [
112
+ GREASE,
113
+ "TLS_AES_128_GCM_SHA256",
114
+ "TLS_AES_256_GCM_SHA384",
115
+ "TLS_CHACHA20_POLY1305_SHA256",
116
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
117
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
118
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
119
+ "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
120
+ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
121
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
122
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
123
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
124
+ "TLS_RSA_WITH_AES_128_GCM_SHA256",
125
+ "TLS_RSA_WITH_AES_256_GCM_SHA384",
126
+ "TLS_RSA_WITH_AES_128_CBC_SHA",
127
+ "TLS_RSA_WITH_AES_256_CBC_SHA",
128
+ ],
129
+ },
130
+ http2: {
131
+ ...chromeHttp2Base,
132
+ settings: {
133
+ headerTableSize: 65536,
134
+ enablePush: false,
135
+ maxConcurrentStreams: 100,
136
+ initialWindowSize: 6291456,
137
+ maxFrameSize: 16384,
138
+ },
139
+ },
140
+ http1: {
141
+ ...chromeHttp1Base,
142
+ defaultHeaders: {
143
+ "sec-ch-ua": '"Chromium";v="128", "Not;A=Brand";v="24", "Google Chrome";v="128"',
144
+ "sec-ch-ua-mobile": "?0",
145
+ "sec-ch-ua-platform": '"macOS"',
146
+ "upgrade-insecure-requests": "1",
147
+ "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
148
+ accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
149
+ "sec-fetch-site": "none",
150
+ "sec-fetch-mode": "navigate",
151
+ "sec-fetch-user": "?1",
152
+ "sec-fetch-dest": "document",
153
+ "accept-language": "en-US,en;q=0.9",
154
+ },
155
+ },
156
+ };
157
+ export const chrome140 = {
158
+ id: "chrome-140",
159
+ name: "chrome",
160
+ version: "140.0.7339.18",
161
+ tls: {
162
+ ...chromeTlsBase,
163
+ cipherSuites: [
164
+ GREASE,
165
+ "TLS_AES_128_GCM_SHA256",
166
+ "TLS_AES_256_GCM_SHA384",
167
+ "TLS_CHACHA20_POLY1305_SHA256",
168
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
169
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
170
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
171
+ "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
172
+ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
173
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
174
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
175
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
176
+ "TLS_RSA_WITH_AES_128_GCM_SHA256",
177
+ "TLS_RSA_WITH_AES_256_GCM_SHA384",
178
+ "TLS_RSA_WITH_AES_128_CBC_SHA",
179
+ "TLS_RSA_WITH_AES_256_CBC_SHA",
180
+ ],
181
+ },
182
+ http2: {
183
+ ...chromeHttp2Base,
184
+ settings: {
185
+ headerTableSize: 65536,
186
+ enablePush: false,
187
+ maxConcurrentStreams: 100,
188
+ initialWindowSize: 6291456,
189
+ maxFrameSize: 16384,
190
+ },
191
+ },
192
+ http1: {
193
+ ...chromeHttp1Base,
194
+ defaultHeaders: {
195
+ "sec-ch-ua": '"Chromium";v="140", "Not=A?Brand";v="24", "Google Chrome";v="140"',
196
+ "sec-ch-ua-mobile": "?0",
197
+ "sec-ch-ua-platform": '"macOS"',
198
+ "upgrade-insecure-requests": "1",
199
+ "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
200
+ accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
201
+ "sec-fetch-site": "none",
202
+ "sec-fetch-mode": "navigate",
203
+ "sec-fetch-user": "?1",
204
+ "sec-fetch-dest": "document",
205
+ "accept-language": "en-US,en;q=0.9",
206
+ },
207
+ },
208
+ };
209
+ export const ChromeProfiles = {
210
+ chrome120,
211
+ chrome128,
212
+ chrome140,
213
+ };
214
+ //# sourceMappingURL=chrome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../src/profiles/chrome.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Microsoft Edge fingerprint definitions.
3
+ *
4
+ * Edge is Chromium-based, so its TLS fingerprint is close to Chrome's — same
5
+ * GREASE behavior, same cipher families — but differs in the advertised user
6
+ * agent string, the `sec-ch-ua` brand list (includes "Microsoft Edge"), and a
7
+ * slightly different extension order. HTTP/2 settings track Chrome closely.
8
+ * Values mirror real Edge captures per version.
9
+ */
10
+ import type { BrowserProfile } from "../types.js";
11
+ export declare const edge120: BrowserProfile;
12
+ export declare const edge128: BrowserProfile;
13
+ export declare const EdgeProfiles: {
14
+ readonly edge120: BrowserProfile;
15
+ readonly edge128: BrowserProfile;
16
+ };
17
+ //# sourceMappingURL=edge.d.ts.map