@knownagents/sdk 1.10.0 → 1.11.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/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +85 -3
- package/package.json +1 -1
- package/src/index.ts +93 -3
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ export interface Request {
|
|
|
18
18
|
export interface Response {
|
|
19
19
|
/** The HTTP response status code (e.g. 200, 404) */
|
|
20
20
|
statusCode: number;
|
|
21
|
+
/** The HTTP response headers */
|
|
22
|
+
headers?: Record<string, string | string[] | undefined>;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* A visit tracking request for the Known Agents API.
|
|
@@ -149,6 +151,7 @@ export declare class KnownAgents {
|
|
|
149
151
|
* @throws {Error} If the API call fails or returns a non-200 status.
|
|
150
152
|
*/
|
|
151
153
|
identifyAgents(requests: IdentificationRequest[]): Promise<IdentificationResult[]>;
|
|
154
|
+
private isPathExcluded;
|
|
152
155
|
private filterHeaders;
|
|
153
156
|
}
|
|
154
157
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAEtD;;;GAGG;AACH,MAAM,WAAW,OAAO;IACpB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;IACZ,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;CACzD;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACrB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAEtD;;;GAGG;AACH,MAAM,WAAW,OAAO;IACpB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;IACZ,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;CACzD;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACrB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAA;IAClB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;CAC1D;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IACzB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,CAAA;IACpB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAA;IACtB,+BAA+B;IAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;IAC9D,oDAAoD;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,gCAAgC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;IAChE,4CAA4C;IAC5C,iCAAiC,CAAC,EAAE,MAAM,CAAA;IAC1C,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IAClC,4FAA4F;IAC5F,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,+BAA+B;IAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;CACjE;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,oDAAoD;IACpD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX;;;;;;OAMG;IACH,MAAM,EAAE,UAAU,GAAG,qBAAqB,GAAG,eAAe,GAAG,gBAAgB,CAAA;IAC/E,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,oBAAY,SAAS;IACjB,OAAO,aAAa;IACpB,WAAW,iBAAiB;IAC5B,aAAa,oBAAoB;IACjC,cAAc,qBAAqB;IACnC,aAAa,oBAAoB;IACjC,eAAe,sBAAsB;IACrC,QAAQ,aAAa;IACrB,eAAe,qBAAqB;IACpC,OAAO,YAAY;IACnB,aAAa,mBAAmB;IAChC,oBAAoB,0BAA0B;IAC9C,OAAO,YAAY;IACnB,UAAU,gBAAgB;IAC1B,mBAAmB,0BAA0B;IAC7C,eAAe,qBAAqB;IACpC,mBAAmB,0BAA0B;CAChD;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IAEpC;;;;OAIG;gBACS,WAAW,EAAE,MAAM;IAI/B;;;;;;;OAOG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,cAAc,EAAE,8BAA8B,CAAC,EAAE,MAAM,GAAG,IAAI;IA4BnI;;;;;;OAMG;IACH,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI;IA6BzC;;;;;;;;;OASG;IACG,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,QAAQ,GAAE,MAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBzF;;;;;;;OAOG;IACG,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmBtF;;;;;;;OAOG;IACG,cAAc,CAAC,QAAQ,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAwBxF,OAAO,CAAC,cAAc;IA2DtB,OAAO,CAAC,aAAa;CAcxB"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.KnownAgents = exports.AgentType = void 0;
|
|
4
|
+
const http_1 = require("http");
|
|
4
5
|
/**
|
|
5
6
|
* Agent types that can be controlled with robots.txt rules.
|
|
6
7
|
*/
|
|
@@ -41,6 +42,11 @@ class KnownAgents {
|
|
|
41
42
|
* @param responseDurationInMilliseconds - The time taken to process the request in milliseconds (optional).
|
|
42
43
|
*/
|
|
43
44
|
trackVisit(request, response, responseDurationInMilliseconds) {
|
|
45
|
+
const path = "path" in request ? request.path : request.url;
|
|
46
|
+
const responseHeaders = response instanceof http_1.ServerResponse ? response.getHeaders() : response?.headers;
|
|
47
|
+
if (!path || this.isPathExcluded(path)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
44
50
|
fetch("https://api.knownagents.com/visits", {
|
|
45
51
|
method: "POST",
|
|
46
52
|
headers: {
|
|
@@ -48,10 +54,11 @@ class KnownAgents {
|
|
|
48
54
|
"Content-Type": "application/json"
|
|
49
55
|
},
|
|
50
56
|
body: JSON.stringify({
|
|
51
|
-
request_path:
|
|
57
|
+
request_path: path,
|
|
52
58
|
request_method: request.method,
|
|
53
59
|
request_headers: this.filterHeaders(request.headers),
|
|
54
60
|
response_status_code: response?.statusCode,
|
|
61
|
+
response_headers: responseHeaders ? this.filterHeaders(responseHeaders) : undefined,
|
|
55
62
|
response_duration_in_milliseconds: responseDurationInMilliseconds,
|
|
56
63
|
created: new Date().toISOString()
|
|
57
64
|
})
|
|
@@ -67,13 +74,27 @@ class KnownAgents {
|
|
|
67
74
|
* @param visits - An array of visit tracking requests.
|
|
68
75
|
*/
|
|
69
76
|
trackVisits(visits) {
|
|
77
|
+
const filteredVisits = visits
|
|
78
|
+
.filter((visit) => {
|
|
79
|
+
return !this.isPathExcluded(visit.request_path);
|
|
80
|
+
})
|
|
81
|
+
.map((visit) => {
|
|
82
|
+
return {
|
|
83
|
+
...visit,
|
|
84
|
+
request_headers: this.filterHeaders(visit.request_headers),
|
|
85
|
+
response_headers: visit.response_headers ? this.filterHeaders(visit.response_headers) : undefined,
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
if (filteredVisits.length === 0) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
70
91
|
fetch("https://api.knownagents.com/visits", {
|
|
71
92
|
method: "POST",
|
|
72
93
|
headers: {
|
|
73
94
|
"Authorization": `Bearer ${this.accessToken}`,
|
|
74
95
|
"Content-Type": "application/json"
|
|
75
96
|
},
|
|
76
|
-
body: JSON.stringify(
|
|
97
|
+
body: JSON.stringify(filteredVisits)
|
|
77
98
|
}).catch(error => {
|
|
78
99
|
console.error(`Known Agents failed to track visits: ${error.message}`);
|
|
79
100
|
});
|
|
@@ -148,7 +169,12 @@ class KnownAgents {
|
|
|
148
169
|
"Authorization": `Bearer ${this.accessToken}`,
|
|
149
170
|
"Content-Type": "application/json"
|
|
150
171
|
},
|
|
151
|
-
body: JSON.stringify(requests
|
|
172
|
+
body: JSON.stringify(requests.map(request => {
|
|
173
|
+
return {
|
|
174
|
+
...request,
|
|
175
|
+
request_headers: this.filterHeaders(request.request_headers),
|
|
176
|
+
};
|
|
177
|
+
}))
|
|
152
178
|
});
|
|
153
179
|
if (response.ok) {
|
|
154
180
|
return await response.json();
|
|
@@ -158,6 +184,62 @@ class KnownAgents {
|
|
|
158
184
|
}
|
|
159
185
|
}
|
|
160
186
|
// Helpers
|
|
187
|
+
isPathExcluded(path) {
|
|
188
|
+
const excludedPrefixes = [
|
|
189
|
+
"/_next/",
|
|
190
|
+
"/_nuxt/",
|
|
191
|
+
"/_astro/",
|
|
192
|
+
"/_app/",
|
|
193
|
+
"/@vite/",
|
|
194
|
+
"/@fs/",
|
|
195
|
+
"/@id/",
|
|
196
|
+
"/node_modules/",
|
|
197
|
+
"/_vercel/",
|
|
198
|
+
];
|
|
199
|
+
const excludedSuffixes = [
|
|
200
|
+
".ico",
|
|
201
|
+
".png",
|
|
202
|
+
".jpg",
|
|
203
|
+
".jpeg",
|
|
204
|
+
".gif",
|
|
205
|
+
".webp",
|
|
206
|
+
".svg",
|
|
207
|
+
".bmp",
|
|
208
|
+
".tiff",
|
|
209
|
+
".avif",
|
|
210
|
+
".css",
|
|
211
|
+
".js",
|
|
212
|
+
".mjs",
|
|
213
|
+
".ts",
|
|
214
|
+
".jsx",
|
|
215
|
+
".tsx",
|
|
216
|
+
".map",
|
|
217
|
+
".woff",
|
|
218
|
+
".woff2",
|
|
219
|
+
".ttf",
|
|
220
|
+
".otf",
|
|
221
|
+
".eot",
|
|
222
|
+
".mp3",
|
|
223
|
+
".mp4",
|
|
224
|
+
".webm",
|
|
225
|
+
".wav",
|
|
226
|
+
".ogg",
|
|
227
|
+
".mov",
|
|
228
|
+
".avi",
|
|
229
|
+
".flv",
|
|
230
|
+
".m4v",
|
|
231
|
+
".rss",
|
|
232
|
+
".json",
|
|
233
|
+
".xml",
|
|
234
|
+
".pdf",
|
|
235
|
+
".zip",
|
|
236
|
+
];
|
|
237
|
+
return excludedPrefixes.some((excludedPrefix) => {
|
|
238
|
+
return path.toLowerCase().startsWith(excludedPrefix.toLowerCase());
|
|
239
|
+
}) || excludedSuffixes.some((excludedSuffix) => {
|
|
240
|
+
return path.toLowerCase().endsWith(excludedSuffix.toLowerCase());
|
|
241
|
+
});
|
|
242
|
+
}
|
|
161
243
|
filterHeaders(headers) {
|
|
162
244
|
const excludedHeaders = new Set([
|
|
163
245
|
"authorization",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knownagents/sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": "The official Node.js SDK for Known Agents: AI agent analytics (bot traffic), LLM referral tracking, automatic robots.txt, agent verification",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
package/src/index.ts
CHANGED
|
@@ -20,6 +20,8 @@ export interface Request {
|
|
|
20
20
|
export interface Response {
|
|
21
21
|
/** The HTTP response status code (e.g. 200, 404) */
|
|
22
22
|
statusCode: number
|
|
23
|
+
/** The HTTP response headers */
|
|
24
|
+
headers?: Record<string, string | string[] | undefined>
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
/**
|
|
@@ -123,6 +125,13 @@ export class KnownAgents {
|
|
|
123
125
|
* @param responseDurationInMilliseconds - The time taken to process the request in milliseconds (optional).
|
|
124
126
|
*/
|
|
125
127
|
trackVisit(request: Request | IncomingMessage, response?: Response | ServerResponse, responseDurationInMilliseconds?: number): void {
|
|
128
|
+
const path = "path" in request ? request.path : request.url
|
|
129
|
+
const responseHeaders = response instanceof ServerResponse ? response.getHeaders() as Record<string, string | string[] | undefined> : response?.headers
|
|
130
|
+
|
|
131
|
+
if (!path || this.isPathExcluded(path)) {
|
|
132
|
+
return
|
|
133
|
+
}
|
|
134
|
+
|
|
126
135
|
fetch("https://api.knownagents.com/visits", {
|
|
127
136
|
method: "POST",
|
|
128
137
|
headers: {
|
|
@@ -130,10 +139,11 @@ export class KnownAgents {
|
|
|
130
139
|
"Content-Type": "application/json"
|
|
131
140
|
},
|
|
132
141
|
body: JSON.stringify({
|
|
133
|
-
request_path:
|
|
142
|
+
request_path: path,
|
|
134
143
|
request_method: request.method,
|
|
135
144
|
request_headers: this.filterHeaders(request.headers),
|
|
136
145
|
response_status_code: response?.statusCode,
|
|
146
|
+
response_headers: responseHeaders ? this.filterHeaders(responseHeaders) : undefined,
|
|
137
147
|
response_duration_in_milliseconds: responseDurationInMilliseconds,
|
|
138
148
|
created: new Date().toISOString()
|
|
139
149
|
})
|
|
@@ -150,13 +160,29 @@ export class KnownAgents {
|
|
|
150
160
|
* @param visits - An array of visit tracking requests.
|
|
151
161
|
*/
|
|
152
162
|
trackVisits(visits: VisitRequest[]): void {
|
|
163
|
+
const filteredVisits = visits
|
|
164
|
+
.filter((visit) => {
|
|
165
|
+
return !this.isPathExcluded(visit.request_path)
|
|
166
|
+
})
|
|
167
|
+
.map((visit) => {
|
|
168
|
+
return {
|
|
169
|
+
...visit,
|
|
170
|
+
request_headers: this.filterHeaders(visit.request_headers),
|
|
171
|
+
response_headers: visit.response_headers ? this.filterHeaders(visit.response_headers) : undefined,
|
|
172
|
+
}
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
if (filteredVisits.length === 0) {
|
|
176
|
+
return
|
|
177
|
+
}
|
|
178
|
+
|
|
153
179
|
fetch("https://api.knownagents.com/visits", {
|
|
154
180
|
method: "POST",
|
|
155
181
|
headers: {
|
|
156
182
|
"Authorization": `Bearer ${this.accessToken}`,
|
|
157
183
|
"Content-Type": "application/json"
|
|
158
184
|
},
|
|
159
|
-
body: JSON.stringify(
|
|
185
|
+
body: JSON.stringify(filteredVisits)
|
|
160
186
|
}).catch(error => {
|
|
161
187
|
console.error(`Known Agents failed to track visits: ${error.message}`)
|
|
162
188
|
})
|
|
@@ -234,7 +260,12 @@ export class KnownAgents {
|
|
|
234
260
|
"Authorization": `Bearer ${this.accessToken}`,
|
|
235
261
|
"Content-Type": "application/json"
|
|
236
262
|
},
|
|
237
|
-
body: JSON.stringify(requests
|
|
263
|
+
body: JSON.stringify(requests.map(request => {
|
|
264
|
+
return {
|
|
265
|
+
...request,
|
|
266
|
+
request_headers: this.filterHeaders(request.request_headers),
|
|
267
|
+
}
|
|
268
|
+
}))
|
|
238
269
|
})
|
|
239
270
|
|
|
240
271
|
if (response.ok) {
|
|
@@ -246,6 +277,65 @@ export class KnownAgents {
|
|
|
246
277
|
|
|
247
278
|
// Helpers
|
|
248
279
|
|
|
280
|
+
private isPathExcluded(path: string): boolean {
|
|
281
|
+
const excludedPrefixes = [
|
|
282
|
+
"/_next/",
|
|
283
|
+
"/_nuxt/",
|
|
284
|
+
"/_astro/",
|
|
285
|
+
"/_app/",
|
|
286
|
+
"/@vite/",
|
|
287
|
+
"/@fs/",
|
|
288
|
+
"/@id/",
|
|
289
|
+
"/node_modules/",
|
|
290
|
+
"/_vercel/",
|
|
291
|
+
]
|
|
292
|
+
|
|
293
|
+
const excludedSuffixes = [
|
|
294
|
+
".ico",
|
|
295
|
+
".png",
|
|
296
|
+
".jpg",
|
|
297
|
+
".jpeg",
|
|
298
|
+
".gif",
|
|
299
|
+
".webp",
|
|
300
|
+
".svg",
|
|
301
|
+
".bmp",
|
|
302
|
+
".tiff",
|
|
303
|
+
".avif",
|
|
304
|
+
".css",
|
|
305
|
+
".js",
|
|
306
|
+
".mjs",
|
|
307
|
+
".ts",
|
|
308
|
+
".jsx",
|
|
309
|
+
".tsx",
|
|
310
|
+
".map",
|
|
311
|
+
".woff",
|
|
312
|
+
".woff2",
|
|
313
|
+
".ttf",
|
|
314
|
+
".otf",
|
|
315
|
+
".eot",
|
|
316
|
+
".mp3",
|
|
317
|
+
".mp4",
|
|
318
|
+
".webm",
|
|
319
|
+
".wav",
|
|
320
|
+
".ogg",
|
|
321
|
+
".mov",
|
|
322
|
+
".avi",
|
|
323
|
+
".flv",
|
|
324
|
+
".m4v",
|
|
325
|
+
".rss",
|
|
326
|
+
".json",
|
|
327
|
+
".xml",
|
|
328
|
+
".pdf",
|
|
329
|
+
".zip",
|
|
330
|
+
]
|
|
331
|
+
|
|
332
|
+
return excludedPrefixes.some((excludedPrefix) => {
|
|
333
|
+
return path.toLowerCase().startsWith(excludedPrefix.toLowerCase())
|
|
334
|
+
}) || excludedSuffixes.some((excludedSuffix) => {
|
|
335
|
+
return path.toLowerCase().endsWith(excludedSuffix.toLowerCase())
|
|
336
|
+
})
|
|
337
|
+
}
|
|
338
|
+
|
|
249
339
|
private filterHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string | string[] | undefined> {
|
|
250
340
|
const excludedHeaders = new Set([
|
|
251
341
|
"authorization",
|