@astrasyncai/verification-gateway 5.21.2 → 5.22.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.
- package/CHANGELOG.md +9 -0
- package/README.md +19 -7
- package/dist/adapters/express.js +60 -11
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +60 -11
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/mcp.js +34 -3
- package/dist/adapters/mcp.js.map +1 -1
- package/dist/adapters/mcp.mjs +34 -3
- package/dist/adapters/mcp.mjs.map +1 -1
- package/dist/adapters/nextjs.js +60 -11
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +60 -11
- package/dist/adapters/nextjs.mjs.map +1 -1
- package/dist/adapters/sdk.js +1 -1
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +1 -1
- package/dist/adapters/sdk.mjs.map +1 -1
- package/dist/agent/index.js +1 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/index.mjs +1 -1
- package/dist/agent/index.mjs.map +1 -1
- package/dist/bin/astrasync-claude-hook.js +1 -1
- package/dist/bin/astrasync-codex-hook.js +1 -1
- package/dist/bin/astrasync-guard.js +1 -1
- package/dist/bin/astrasync.js +1 -1
- package/dist/browser/background.js +1 -1
- package/dist/browser/background.js.map +1 -1
- package/dist/browser/background.mjs +1 -1
- package/dist/browser/background.mjs.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +1 -1
- package/dist/cli/index.mjs.map +1 -1
- package/dist/codex/index.js +1 -1
- package/dist/codex/index.js.map +1 -1
- package/dist/codex/index.mjs +1 -1
- package/dist/codex/index.mjs.map +1 -1
- package/dist/cursor/extension.js +1 -1
- package/dist/cursor/extension.js.map +1 -1
- package/dist/cursor/extension.mjs +1 -1
- package/dist/cursor/extension.mjs.map +1 -1
- package/dist/edge-config.js +1 -1
- package/dist/edge-config.js.map +1 -1
- package/dist/edge-config.mjs +1 -1
- package/dist/edge-config.mjs.map +1 -1
- package/dist/edge-core/index.d.mts +4 -1
- package/dist/edge-core/index.d.ts +4 -1
- package/dist/edge-core/index.js +45 -15
- package/dist/edge-core/index.js.map +1 -1
- package/dist/edge-core/index.mjs +45 -15
- package/dist/edge-core/index.mjs.map +1 -1
- package/dist/gateway/gateway.js +1 -1
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/gateway.mjs +1 -1
- package/dist/gateway/gateway.mjs.map +1 -1
- package/dist/index.d.mts +20 -5
- package/dist/index.d.ts +20 -5
- package/dist/index.js +60 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +60 -11
- package/dist/index.mjs.map +1 -1
- package/dist/metadata-capture.d.mts +5 -3
- package/dist/metadata-capture.d.ts +5 -3
- package/dist/metadata-capture.js +33 -2
- package/dist/metadata-capture.js.map +1 -1
- package/dist/metadata-capture.mjs +33 -2
- package/dist/metadata-capture.mjs.map +1 -1
- package/dist/platform-signatures.d.mts +13 -0
- package/dist/platform-signatures.d.ts +13 -0
- package/dist/platform-signatures.js +26 -8
- package/dist/platform-signatures.js.map +1 -1
- package/dist/platform-signatures.mjs +26 -8
- package/dist/platform-signatures.mjs.map +1 -1
- package/dist/registration/index.js +1 -1
- package/dist/registration/index.js.map +1 -1
- package/dist/registration/index.mjs +1 -1
- package/dist/registration/index.mjs.map +1 -1
- package/dist/transport/index.js +1 -1
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/index.mjs +1 -1
- package/dist/transport/index.mjs.map +1 -1
- package/dist/verify.js +1 -1
- package/dist/verify.js.map +1 -1
- package/dist/verify.mjs +1 -1
- package/dist/verify.mjs.map +1 -1
- package/package.json +3 -3
package/dist/adapters/nextjs.mjs
CHANGED
|
@@ -33,7 +33,11 @@ var PLATFORM_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
|
33
33
|
"x-goog-api-client",
|
|
34
34
|
"user-agent",
|
|
35
35
|
"x-agent-card-url",
|
|
36
|
-
"x-agent-provider"
|
|
36
|
+
"x-agent-provider",
|
|
37
|
+
// Round 31 — Web Bot Auth's Signature-Agent names the signing agent's
|
|
38
|
+
// directory host (a public URL, never a secret). It attributes a signed
|
|
39
|
+
// agent even when its UA is stock Chrome.
|
|
40
|
+
"signature-agent"
|
|
37
41
|
]);
|
|
38
42
|
var PLATFORM_HEADER_PREFIXES = [
|
|
39
43
|
"x-goog-",
|
|
@@ -150,7 +154,12 @@ function sanitizeHeaders(raw) {
|
|
|
150
154
|
return result;
|
|
151
155
|
}
|
|
152
156
|
var CONNECTION_HEADER_SOURCES = [
|
|
153
|
-
|
|
157
|
+
// Round 31: `incap-client-ip` = Imperva Cloud WAF; `true-client-ip` is
|
|
158
|
+
// also Akamai's client-IP header when the property enables it.
|
|
159
|
+
[
|
|
160
|
+
"ip",
|
|
161
|
+
["cf-connecting-ip", "fastly-client-ip", "incap-client-ip", "true-client-ip", "x-real-ip"]
|
|
162
|
+
],
|
|
154
163
|
[
|
|
155
164
|
"country",
|
|
156
165
|
["cf-ipcountry", "x-vercel-ip-country", "cloudfront-viewer-country", "fastly-geo-country"]
|
|
@@ -201,6 +210,28 @@ function deriveConnectionFromHeaders(headers) {
|
|
|
201
210
|
if (portMatch) connection.sourcePort = portMatch[1];
|
|
202
211
|
if (!connection.ip && addr) connection.ip = addr.replace(/:\d+$/, "");
|
|
203
212
|
}
|
|
213
|
+
{
|
|
214
|
+
const edgescape = (lower["x-akamai-edgescape"] ?? lower["akamai-edgescape"])?.trim();
|
|
215
|
+
if (edgescape) {
|
|
216
|
+
const fields = /* @__PURE__ */ new Map();
|
|
217
|
+
for (const pair of edgescape.split(",")) {
|
|
218
|
+
const i = pair.indexOf("=");
|
|
219
|
+
if (i > 0) fields.set(pair.slice(0, i).trim().toLowerCase(), pair.slice(i + 1).trim());
|
|
220
|
+
}
|
|
221
|
+
const fill = (key, field) => {
|
|
222
|
+
const v = fields.get(field);
|
|
223
|
+
if (v && !connection[key]) connection[key] = v.slice(0, MAX_CONNECTION_VALUE_CHARS);
|
|
224
|
+
};
|
|
225
|
+
fill("country", "country_code");
|
|
226
|
+
fill("region", "region_code");
|
|
227
|
+
fill("city", "city");
|
|
228
|
+
fill("latitude", "lat");
|
|
229
|
+
fill("longitude", "long");
|
|
230
|
+
fill("timeZone", "timezone");
|
|
231
|
+
fill("asn", "asnum");
|
|
232
|
+
fill("continent", "continent");
|
|
233
|
+
}
|
|
234
|
+
}
|
|
204
235
|
if (!connection.ip) {
|
|
205
236
|
const xff = lower["x-forwarded-for"];
|
|
206
237
|
const client = xff?.split(",")[0]?.trim();
|
|
@@ -434,7 +465,7 @@ function routePolicyOf(route) {
|
|
|
434
465
|
}
|
|
435
466
|
|
|
436
467
|
// src/version.ts
|
|
437
|
-
var SDK_VERSION = "5.
|
|
468
|
+
var SDK_VERSION = "5.22.0";
|
|
438
469
|
|
|
439
470
|
// src/http.ts
|
|
440
471
|
var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
|
|
@@ -1601,7 +1632,8 @@ var PLATFORM_AGENT_SIGNATURES = [
|
|
|
1601
1632
|
uaPatterns: [/claude/i, /anthropic/i],
|
|
1602
1633
|
agentCardPatterns: [/anthropic\.com/i, /claude\.ai/i],
|
|
1603
1634
|
apiKeyFormatPatterns: [/^sk-ant/i],
|
|
1604
|
-
headerPatterns: [/^anthropic-version/i, /^anthropic-beta/i, /^x-anthropic-/i]
|
|
1635
|
+
headerPatterns: [/^anthropic-version/i, /^anthropic-beta/i, /^x-anthropic-/i],
|
|
1636
|
+
wafLabelPatterns: [/\bclaude/i, /\banthropic/i]
|
|
1605
1637
|
},
|
|
1606
1638
|
{
|
|
1607
1639
|
vendor: "chatgpt",
|
|
@@ -1612,7 +1644,14 @@ var PLATFORM_AGENT_SIGNATURES = [
|
|
|
1612
1644
|
uaPatterns: [/chatgpt/i, /openai/i, /gpt-?\d/i, /\bGPTBot\b/i, /\bOAI-SearchBot\b/i],
|
|
1613
1645
|
agentCardPatterns: [/openai\.com/i, /chatgpt\.com/i],
|
|
1614
1646
|
apiKeyFormatPatterns: [/^sk-proj/i, /^sk-svcacct/i],
|
|
1615
|
-
headerPatterns: [
|
|
1647
|
+
headerPatterns: [
|
|
1648
|
+
/^openai-organization/i,
|
|
1649
|
+
/^openai-project/i,
|
|
1650
|
+
/^openai-version/i,
|
|
1651
|
+
// ChatGPT agent signs with Web Bot Auth under this directory host.
|
|
1652
|
+
/^signature-agent: "?https:\/\/chatgpt\.com/i
|
|
1653
|
+
],
|
|
1654
|
+
wafLabelPatterns: [/\bgptbot\b/i, /\bchatgpt/i, /\boai-searchbot\b/i, /\bopenai/i]
|
|
1616
1655
|
},
|
|
1617
1656
|
{
|
|
1618
1657
|
vendor: "gemini",
|
|
@@ -1633,7 +1672,8 @@ var PLATFORM_AGENT_SIGNATURES = [
|
|
|
1633
1672
|
],
|
|
1634
1673
|
agentCardPatterns: [/gemini\.google\.com/i, /ai\.google\.dev/i],
|
|
1635
1674
|
apiKeyFormatPatterns: [/^aiza/i],
|
|
1636
|
-
headerPatterns: [/^x-goog-user-project/i, /^x-goog-api-client/i]
|
|
1675
|
+
headerPatterns: [/^x-goog-user-project/i, /^x-goog-api-client/i],
|
|
1676
|
+
wafLabelPatterns: [/\bgoogle-extended\b/i, /\bgoogleother\b/i, /\bgemini/i]
|
|
1637
1677
|
},
|
|
1638
1678
|
{
|
|
1639
1679
|
vendor: "cursor",
|
|
@@ -1652,7 +1692,8 @@ var PLATFORM_AGENT_SIGNATURES = [
|
|
|
1652
1692
|
displayName: "Perplexity",
|
|
1653
1693
|
uaPatterns: [/perplexity/i],
|
|
1654
1694
|
agentCardPatterns: [/perplexity\.ai/i],
|
|
1655
|
-
apiKeyFormatPatterns: [/^pplx-/i]
|
|
1695
|
+
apiKeyFormatPatterns: [/^pplx-/i],
|
|
1696
|
+
wafLabelPatterns: [/\bperplexity/i]
|
|
1656
1697
|
},
|
|
1657
1698
|
// Round 30.1: xAI's documented crawlers (GrokBot/1.0, xAI-Grok/1.0,
|
|
1658
1699
|
// Grok-DeepSearch/1.0). Anchored, versioned tokens — never in a stock UA.
|
|
@@ -1661,7 +1702,8 @@ var PLATFORM_AGENT_SIGNATURES = [
|
|
|
1661
1702
|
displayName: "xAI Grok",
|
|
1662
1703
|
uaPatterns: [/\bGrokBot\//i, /\bxAI-Grok\//i, /\bGrok-DeepSearch\//i],
|
|
1663
1704
|
agentCardPatterns: [/\bx\.ai\b/i, /grok\.com/i],
|
|
1664
|
-
apiKeyFormatPatterns: [/^xai-/i]
|
|
1705
|
+
apiKeyFormatPatterns: [/^xai-/i],
|
|
1706
|
+
wafLabelPatterns: [/\bgrok/i, /\bxai\b/i]
|
|
1665
1707
|
},
|
|
1666
1708
|
// Round 30.1: Meta AI's index and fetch crawlers. facebookexternalhit
|
|
1667
1709
|
// (link previews) is deliberately NOT here — it stays a generic crawler.
|
|
@@ -1669,7 +1711,12 @@ var PLATFORM_AGENT_SIGNATURES = [
|
|
|
1669
1711
|
vendor: "meta-ai",
|
|
1670
1712
|
displayName: "Meta AI",
|
|
1671
1713
|
uaPatterns: [/\bMeta-WebIndexer\b/i, /\bMeta-ExternalFetcher\b/i],
|
|
1672
|
-
agentCardPatterns: [/meta\.ai/i]
|
|
1714
|
+
agentCardPatterns: [/meta\.ai/i],
|
|
1715
|
+
wafLabelPatterns: [
|
|
1716
|
+
/\bmeta-webindexer\b/i,
|
|
1717
|
+
/\bmeta-externalfetcher\b/i,
|
|
1718
|
+
/\bmeta-externalagent\b/i
|
|
1719
|
+
]
|
|
1673
1720
|
},
|
|
1674
1721
|
// Agentic browsers — versioned-token patterns ONLY (a stock Chrome UA must
|
|
1675
1722
|
// never match). Distinct vendor keys (not 'chatgpt'/'perplexity'): the
|
|
@@ -1717,6 +1764,7 @@ function matchPlatformSignature(signatures, input) {
|
|
|
1717
1764
|
const apiKeyFormat = input.apiKeyFormat ?? "";
|
|
1718
1765
|
const ja4 = input.ja4 ?? "";
|
|
1719
1766
|
const asn = input.asn ?? "";
|
|
1767
|
+
const wafLabels = input.wafLabels ?? [];
|
|
1720
1768
|
const headerLines = [];
|
|
1721
1769
|
if (input.platformHeaders) {
|
|
1722
1770
|
for (const [name, value] of Object.entries(input.platformHeaders)) {
|
|
@@ -1730,7 +1778,8 @@ function matchPlatformSignature(signatures, input) {
|
|
|
1730
1778
|
const headerMatch = headerLines.length > 0 && sig.headerPatterns?.some((p) => headerLines.some((line) => p.test(line)));
|
|
1731
1779
|
const ja4Match = ja4.length > 0 && sig.ja4Patterns?.some((p) => p.test(ja4));
|
|
1732
1780
|
const asnMatch = asn.length > 0 && sig.asnList?.includes(asn);
|
|
1733
|
-
|
|
1781
|
+
const wafMatch = wafLabels.length > 0 && sig.wafLabelPatterns?.some((p) => wafLabels.some((label) => p.test(label)));
|
|
1782
|
+
if (uaMatch || cardMatch || keyMatch || headerMatch || ja4Match || asnMatch || wafMatch) {
|
|
1734
1783
|
const uaBase = ua.split(/[\s/]/)[0]?.toLowerCase() ?? "";
|
|
1735
1784
|
const cardHost = (() => {
|
|
1736
1785
|
try {
|
|
@@ -1739,7 +1788,7 @@ function matchPlatformSignature(signatures, input) {
|
|
|
1739
1788
|
return "";
|
|
1740
1789
|
}
|
|
1741
1790
|
})();
|
|
1742
|
-
const keyBasis = uaBase || cardHost || apiKeyFormat || ja4 || asn && `asn${asn}` || "unknown";
|
|
1791
|
+
const keyBasis = uaBase || cardHost || apiKeyFormat || ja4 || asn && `asn${asn}` || wafMatch && `waf:${wafLabels[0]?.toLowerCase()}` || "unknown";
|
|
1743
1792
|
return {
|
|
1744
1793
|
vendor: sig.vendor,
|
|
1745
1794
|
fingerprintKey: `${sig.vendor}:${keyBasis}`,
|