vident-sdk 0.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.
Files changed (94) hide show
  1. package/README.md +216 -0
  2. package/dist/client.d.ts +100 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +249 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/context.d.ts +15 -0
  7. package/dist/context.d.ts.map +1 -0
  8. package/dist/context.js +41 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/errors.d.ts +18 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +35 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/http.d.ts +4 -0
  15. package/dist/http.d.ts.map +1 -0
  16. package/dist/http.js +60 -0
  17. package/dist/http.js.map +1 -0
  18. package/dist/index.d.ts +19 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +21 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/instrument/aws-sdk.d.ts +9 -0
  23. package/dist/instrument/aws-sdk.d.ts.map +1 -0
  24. package/dist/instrument/aws-sdk.js +57 -0
  25. package/dist/instrument/aws-sdk.js.map +1 -0
  26. package/dist/instrument/fetch.d.ts +15 -0
  27. package/dist/instrument/fetch.d.ts.map +1 -0
  28. package/dist/instrument/fetch.js +124 -0
  29. package/dist/instrument/fetch.js.map +1 -0
  30. package/dist/instrument/handler.d.ts +40 -0
  31. package/dist/instrument/handler.d.ts.map +1 -0
  32. package/dist/instrument/handler.js +90 -0
  33. package/dist/instrument/handler.js.map +1 -0
  34. package/dist/instrument/hono.d.ts +4 -0
  35. package/dist/instrument/hono.d.ts.map +1 -0
  36. package/dist/instrument/hono.js +130 -0
  37. package/dist/instrument/hono.js.map +1 -0
  38. package/dist/instrument/index.d.ts +7 -0
  39. package/dist/instrument/index.d.ts.map +1 -0
  40. package/dist/instrument/index.js +6 -0
  41. package/dist/instrument/index.js.map +1 -0
  42. package/dist/instrument/prisma.d.ts +25 -0
  43. package/dist/instrument/prisma.d.ts.map +1 -0
  44. package/dist/instrument/prisma.js +73 -0
  45. package/dist/instrument/prisma.js.map +1 -0
  46. package/dist/instrument/types.d.ts +7 -0
  47. package/dist/instrument/types.d.ts.map +1 -0
  48. package/dist/instrument/types.js +2 -0
  49. package/dist/instrument/types.js.map +1 -0
  50. package/dist/resources/api-keys.d.ts +10 -0
  51. package/dist/resources/api-keys.d.ts.map +1 -0
  52. package/dist/resources/api-keys.js +17 -0
  53. package/dist/resources/api-keys.js.map +1 -0
  54. package/dist/resources/channels.d.ts +16 -0
  55. package/dist/resources/channels.d.ts.map +1 -0
  56. package/dist/resources/channels.js +38 -0
  57. package/dist/resources/channels.js.map +1 -0
  58. package/dist/resources/checks.d.ts +15 -0
  59. package/dist/resources/checks.d.ts.map +1 -0
  60. package/dist/resources/checks.js +44 -0
  61. package/dist/resources/checks.js.map +1 -0
  62. package/dist/resources/events.d.ts +25 -0
  63. package/dist/resources/events.d.ts.map +1 -0
  64. package/dist/resources/events.js +122 -0
  65. package/dist/resources/events.js.map +1 -0
  66. package/dist/resources/metrics.d.ts +24 -0
  67. package/dist/resources/metrics.d.ts.map +1 -0
  68. package/dist/resources/metrics.js +121 -0
  69. package/dist/resources/metrics.js.map +1 -0
  70. package/dist/resources/organizations.d.ts +12 -0
  71. package/dist/resources/organizations.d.ts.map +1 -0
  72. package/dist/resources/organizations.js +23 -0
  73. package/dist/resources/organizations.js.map +1 -0
  74. package/dist/resources/projects.d.ts +12 -0
  75. package/dist/resources/projects.d.ts.map +1 -0
  76. package/dist/resources/projects.js +35 -0
  77. package/dist/resources/projects.js.map +1 -0
  78. package/dist/resources/tracing.d.ts +26 -0
  79. package/dist/resources/tracing.d.ts.map +1 -0
  80. package/dist/resources/tracing.js +320 -0
  81. package/dist/resources/tracing.js.map +1 -0
  82. package/dist/sampler.d.ts +61 -0
  83. package/dist/sampler.d.ts.map +1 -0
  84. package/dist/sampler.js +73 -0
  85. package/dist/sampler.js.map +1 -0
  86. package/dist/trace-context.d.ts +31 -0
  87. package/dist/trace-context.d.ts.map +1 -0
  88. package/dist/trace-context.js +60 -0
  89. package/dist/trace-context.js.map +1 -0
  90. package/dist/types.d.ts +256 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +33 -0
  93. package/dist/types.js.map +1 -0
  94. package/package.json +52 -0
package/dist/errors.js ADDED
@@ -0,0 +1,35 @@
1
+ export class VidentError extends Error {
2
+ code;
3
+ status;
4
+ constructor(message, code, status) {
5
+ super(message);
6
+ this.code = code;
7
+ this.status = status;
8
+ this.name = "VidentError";
9
+ }
10
+ }
11
+ export class NotFoundError extends VidentError {
12
+ constructor(message = "Resource not found") {
13
+ super(message, "NOT_FOUND", 404);
14
+ this.name = "NotFoundError";
15
+ }
16
+ }
17
+ export class UnauthorizedError extends VidentError {
18
+ constructor(message = "Unauthorized") {
19
+ super(message, "UNAUTHORIZED", 401);
20
+ this.name = "UnauthorizedError";
21
+ }
22
+ }
23
+ export class ForbiddenError extends VidentError {
24
+ constructor(message = "Forbidden") {
25
+ super(message, "FORBIDDEN", 403);
26
+ this.name = "ForbiddenError";
27
+ }
28
+ }
29
+ export class BadRequestError extends VidentError {
30
+ constructor(message = "Bad request") {
31
+ super(message, "BAD_REQUEST", 400);
32
+ this.name = "BadRequestError";
33
+ }
34
+ }
35
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAY,SAAQ,KAAK;IAG7B;IACA;IAHR,YACC,OAAe,EACR,IAAY,EACZ,MAAc;QAErB,KAAK,CAAC,OAAO,CAAC,CAAA;QAHP,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAQ;QAGrB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAA;IAC1B,CAAC;CACD;AAED,MAAM,OAAO,aAAc,SAAQ,WAAW;IAC7C,YAAY,OAAO,GAAG,oBAAoB;QACzC,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAA;IAC5B,CAAC;CACD;AAED,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IACjD,YAAY,OAAO,GAAG,cAAc;QACnC,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,CAAC,CAAA;QACnC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;IAChC,CAAC;CACD;AAED,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC9C,YAAY,OAAO,GAAG,WAAW;QAChC,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC7B,CAAC;CACD;AAED,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAC/C,YAAY,OAAO,GAAG,aAAa;QAClC,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,CAAC,CAAA;QAClC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC9B,CAAC;CACD"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare function fetchWithRetry(url: string, options: RequestInit, timeout: number, retries: number): Promise<Response>;
2
+ export declare function handleResponse<T>(response: Response): Promise<T>;
3
+ export type RequestFn = <T>(method: string, path: string, body?: unknown) => Promise<T>;
4
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAgBA,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAmCnB;AAED,wBAAsB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAiCtE;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,EACzB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,KACV,OAAO,CAAC,CAAC,CAAC,CAAA"}
package/dist/http.js ADDED
@@ -0,0 +1,60 @@
1
+ import { BadRequestError, ForbiddenError, NotFoundError, UnauthorizedError, VidentError, } from "./errors.js";
2
+ async function sleep(ms) {
3
+ return new Promise((resolve) => setTimeout(resolve, ms));
4
+ }
5
+ export async function fetchWithRetry(url, options, timeout, retries) {
6
+ let lastError = null;
7
+ for (let attempt = 0; attempt <= retries; attempt++) {
8
+ try {
9
+ const controller = new AbortController();
10
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
11
+ const response = await fetch(url, {
12
+ ...options,
13
+ signal: controller.signal,
14
+ });
15
+ clearTimeout(timeoutId);
16
+ return response;
17
+ }
18
+ catch (error) {
19
+ lastError = error;
20
+ if (error.name === "AbortError" || attempt === retries) {
21
+ break;
22
+ }
23
+ await sleep(100 * 2 ** attempt);
24
+ }
25
+ }
26
+ if (lastError?.name === "AbortError") {
27
+ throw new VidentError("Request timeout", "TIMEOUT", 408);
28
+ }
29
+ throw new VidentError(lastError?.message ?? "Network error", "NETWORK_ERROR", 0);
30
+ }
31
+ export async function handleResponse(response) {
32
+ if (!response.ok) {
33
+ let errorData = null;
34
+ try {
35
+ errorData = await response.json();
36
+ }
37
+ catch (e) {
38
+ console.warn(`[vident] Failed to parse error response: ${e instanceof Error ? e.message : "Unknown error"}`);
39
+ }
40
+ const message = errorData?.error?.message ?? response.statusText;
41
+ const code = errorData?.error?.code ?? "UNKNOWN";
42
+ switch (response.status) {
43
+ case 400:
44
+ throw new BadRequestError(message);
45
+ case 401:
46
+ throw new UnauthorizedError(message);
47
+ case 403:
48
+ throw new ForbiddenError(message);
49
+ case 404:
50
+ throw new NotFoundError(message);
51
+ default:
52
+ throw new VidentError(message, code, response.status);
53
+ }
54
+ }
55
+ if (response.status === 204) {
56
+ return undefined;
57
+ }
58
+ return response.json();
59
+ }
60
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export { Vident } from "./client.js";
2
+ export { getActiveSpan, runWithSpan, isTracingSuppressed, suppressTracing, enableContextDebug, } from "./context.js";
3
+ export { parseTraceparent, createTraceparent, generateTraceId, generateSpanId, } from "./trace-context.js";
4
+ export type { TraceparentData } from "./trace-context.js";
5
+ export { alwaysOnSampler, alwaysOffSampler, traceIdRatioSampler, parentBasedSampler, } from "./sampler.js";
6
+ export type { Sampler, SamplingDecision, SamplingContext, ParentContext, ParentBasedSamplerOptions, } from "./sampler.js";
7
+ export type { VidentConfig, Instrumentation, Project, CreateProjectInput, UpdateProjectInput, Check, CheckStatus, ScheduleType, CreateCheckInput, UpdateCheckInput, CheckStats, UptimeDay, Channel, ChannelType, ChannelConfig, EmailChannelConfig, SlackWebhookChannelConfig, SlackAppChannelConfig, DiscordChannelConfig, PagerDutyChannelConfig, OpsgenieChannelConfig, WebhookChannelConfig, CreateChannelInput, UpdateChannelInput, Organization, CreateOrganizationInput, UpdateOrganizationInput, ApiKey, ApiKeyCreated, CreateApiKeyInput, PingOptions, WrapOptions, SpanKind, SpanOptions, TraceOptions, SpanContext, SpanInterface, PaginationParams, PaginatedResponse, } from "./types.js";
8
+ export { paginate, fetchAll } from "./types.js";
9
+ export { VidentError, BadRequestError, UnauthorizedError, ForbiddenError, NotFoundError, } from "./errors.js";
10
+ export { ProjectsClient } from "./resources/projects.js";
11
+ export { ChecksClient } from "./resources/checks.js";
12
+ export { ChannelsClient } from "./resources/channels.js";
13
+ export { OrganizationsClient } from "./resources/organizations.js";
14
+ export { ApiKeysClient } from "./resources/api-keys.js";
15
+ export { MetricsClient } from "./resources/metrics.js";
16
+ export type { MetricType } from "./resources/metrics.js";
17
+ export { EventsClient } from "./resources/events.js";
18
+ export type { EventLevel } from "./resources/events.js";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,OAAO,EACN,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,kBAAkB,GAClB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACN,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,cAAc,GACd,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGzD,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,cAAc,CAAA;AACrB,YAAY,EACX,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,yBAAyB,GACzB,MAAM,cAAc,CAAA;AAGrB,YAAY,EAEX,YAAY,EACZ,eAAe,EAEf,OAAO,EACP,kBAAkB,EAClB,kBAAkB,EAElB,KAAK,EACL,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,SAAS,EAET,OAAO,EACP,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAElB,YAAY,EACZ,uBAAuB,EACvB,uBAAuB,EAEvB,MAAM,EACN,aAAa,EACb,iBAAiB,EAEjB,WAAW,EACX,WAAW,EAEX,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EAEb,gBAAgB,EAChB,iBAAiB,GACjB,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAG/C,OAAO,EACN,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,aAAa,GACb,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ // Main client
2
+ export { Vident } from "./client.js";
3
+ // Context helpers
4
+ export { getActiveSpan, runWithSpan, isTracingSuppressed, suppressTracing, enableContextDebug, } from "./context.js";
5
+ // Trace context (W3C Trace Context)
6
+ export { parseTraceparent, createTraceparent, generateTraceId, generateSpanId, } from "./trace-context.js";
7
+ // Samplers (OpenTelemetry-style)
8
+ export { alwaysOnSampler, alwaysOffSampler, traceIdRatioSampler, parentBasedSampler, } from "./sampler.js";
9
+ // Pagination helpers
10
+ export { paginate, fetchAll } from "./types.js";
11
+ // Errors
12
+ export { VidentError, BadRequestError, UnauthorizedError, ForbiddenError, NotFoundError, } from "./errors.js";
13
+ // Resource clients (for typing)
14
+ export { ProjectsClient } from "./resources/projects.js";
15
+ export { ChecksClient } from "./resources/checks.js";
16
+ export { ChannelsClient } from "./resources/channels.js";
17
+ export { OrganizationsClient } from "./resources/organizations.js";
18
+ export { ApiKeysClient } from "./resources/api-keys.js";
19
+ export { MetricsClient } from "./resources/metrics.js";
20
+ export { EventsClient } from "./resources/events.js";
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,kBAAkB;AAClB,OAAO,EACN,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,kBAAkB,GAClB,MAAM,cAAc,CAAA;AAErB,oCAAoC;AACpC,OAAO,EACN,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,cAAc,GACd,MAAM,oBAAoB,CAAA;AAG3B,iCAAiC;AACjC,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,cAAc,CAAA;AA6DrB,qBAAqB;AACrB,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE/C,SAAS;AACT,OAAO,EACN,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,aAAa,GACb,MAAM,aAAa,CAAA;AAEpB,gCAAgC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,9 @@
1
+ import type { Vident } from "../client.js";
2
+ import type { Instrumentation } from "./types.js";
3
+ export declare class AwsSdkInstrumentation implements Instrumentation {
4
+ name: string;
5
+ private originalSend;
6
+ init(client: Vident): void;
7
+ destroy(): void;
8
+ }
9
+ //# sourceMappingURL=aws-sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-sdk.d.ts","sourceRoot":"","sources":["../../src/instrument/aws-sdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAUjD,qBAAa,qBAAsB,YAAW,eAAe;IAC5D,IAAI,SAAY;IAChB,OAAO,CAAC,YAAY,CAMN;IAEd,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IA+C1B,OAAO,IAAI,IAAI;CAWf"}
@@ -0,0 +1,57 @@
1
+ import { getActiveSpan, isTracingSuppressed } from "../context.js";
2
+ export class AwsSdkInstrumentation {
3
+ name = "aws-sdk";
4
+ originalSend = null;
5
+ init(client) {
6
+ try {
7
+ const { Client } = require("@aws-sdk/smithy-client");
8
+ const originalSend = Client.prototype.send;
9
+ this.originalSend = originalSend;
10
+ if (!originalSend)
11
+ return;
12
+ const vident = client;
13
+ Client.prototype.send = async function (command, ...args) {
14
+ // Skip instrumentation if tracing is suppressed
15
+ if (isTracingSuppressed()) {
16
+ return originalSend.call(this, command, ...args);
17
+ }
18
+ const commandName = command?.constructor?.name ?? "UnknownCommand";
19
+ const serviceName = this.constructor?.name?.replace("Client", "") ?? "aws";
20
+ const parent = getActiveSpan()?.context();
21
+ const span = vident.startSpan(`${serviceName}:${commandName}`, {
22
+ kind: "client",
23
+ parent,
24
+ attributes: {
25
+ "aws.service": serviceName,
26
+ "aws.operation": commandName,
27
+ },
28
+ });
29
+ try {
30
+ const result = await originalSend.call(this, command, ...args);
31
+ span.end();
32
+ return result;
33
+ }
34
+ catch (error) {
35
+ span.end({ error: error });
36
+ throw error;
37
+ }
38
+ };
39
+ }
40
+ catch {
41
+ // @aws-sdk not installed, skip
42
+ }
43
+ }
44
+ destroy() {
45
+ if (this.originalSend) {
46
+ try {
47
+ const { Client } = require("@aws-sdk/smithy-client");
48
+ Client.prototype.send = this.originalSend;
49
+ this.originalSend = null;
50
+ }
51
+ catch {
52
+ // ignore
53
+ }
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=aws-sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-sdk.js","sourceRoot":"","sources":["../../src/instrument/aws-sdk.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAWlE,MAAM,OAAO,qBAAqB;IACjC,IAAI,GAAG,SAAS,CAAA;IACR,YAAY,GAMV,IAAI,CAAA;IAEd,IAAI,CAAC,MAAc;QAClB,IAAI,CAAC;YACJ,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAA;YACpD,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,IAAgC,CAAA;YACtE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;YAChC,IAAI,CAAC,YAAY;gBAAE,OAAM;YAEzB,MAAM,MAAM,GAAG,MAAM,CAAA;YAErB,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK,WAE5B,OAAmB,EACnB,GAAG,IAAe;gBAElB,gDAAgD;gBAChD,IAAI,mBAAmB,EAAE,EAAE,CAAC;oBAC3B,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;gBACjD,CAAC;gBAED,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,IAAI,gBAAgB,CAAA;gBAClE,MAAM,WAAW,GAChB,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,KAAK,CAAA;gBAEvD,MAAM,MAAM,GAAG,aAAa,EAAE,EAAE,OAAO,EAAE,CAAA;gBACzC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,WAAW,IAAI,WAAW,EAAE,EAAE;oBAC9D,IAAI,EAAE,QAAQ;oBACd,MAAM;oBACN,UAAU,EAAE;wBACX,aAAa,EAAE,WAAW;wBAC1B,eAAe,EAAE,WAAW;qBAC5B;iBACD,CAAC,CAAA;gBAEF,IAAI,CAAC;oBACJ,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;oBAC9D,IAAI,CAAC,GAAG,EAAE,CAAA;oBACV,OAAO,MAAM,CAAA;gBACd,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC,CAAA;oBACnC,MAAM,KAAK,CAAA;gBACZ,CAAC;YACF,CAAC,CAAA;QACF,CAAC;QAAC,MAAM,CAAC;YACR,+BAA+B;QAChC,CAAC;IACF,CAAC;IAED,OAAO;QACN,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC;gBACJ,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAA;gBACpD,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAA;gBACzC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;YACzB,CAAC;YAAC,MAAM,CAAC;gBACR,SAAS;YACV,CAAC;QACF,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,15 @@
1
+ import type { Vident } from "../client.js";
2
+ import type { Instrumentation } from "./types.js";
3
+ export type FetchInstrumentationOptions = {
4
+ /** Additional host -> service name mappings (merged with defaults) */
5
+ serviceMappings?: Record<string, string>;
6
+ };
7
+ export declare class FetchInstrumentation implements Instrumentation {
8
+ name: string;
9
+ private originalFetch;
10
+ private serviceMappings;
11
+ constructor(options?: FetchInstrumentationOptions);
12
+ init(client: Vident): void;
13
+ destroy(): void;
14
+ }
15
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/instrument/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAG1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAiBjD,MAAM,MAAM,2BAA2B,GAAG;IACzC,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACxC,CAAA;AAqCD,qBAAa,oBAAqB,YAAW,eAAe;IAC3D,IAAI,SAAU;IACd,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,eAAe,CAAwB;gBAEnC,OAAO,GAAE,2BAAgC;IAOrD,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IA8E1B,OAAO,IAAI,IAAI;CAMf"}
@@ -0,0 +1,124 @@
1
+ import { getActiveSpan, isTracingSuppressed } from "../context.js";
2
+ import { createTraceparent } from "../trace-context.js";
3
+ // Default service mappings for common APIs
4
+ const DEFAULT_SERVICE_MAPPINGS = {
5
+ "api.sendgrid.com": "sendgrid",
6
+ "api.stripe.com": "stripe",
7
+ "api.twilio.com": "twilio",
8
+ "hooks.slack.com": "slack",
9
+ "api.slack.com": "slack",
10
+ "api.pagerduty.com": "pagerduty",
11
+ "api.opsgenie.com": "opsgenie",
12
+ "discord.com": "discord",
13
+ "api.github.com": "github",
14
+ "api.openai.com": "openai",
15
+ "api.anthropic.com": "anthropic",
16
+ };
17
+ function inferPeerService(url, serviceMappings) {
18
+ // Check known services first
19
+ for (const [host, service] of Object.entries(serviceMappings)) {
20
+ if (url.host === host || url.host.endsWith(`.${host}`)) {
21
+ return service;
22
+ }
23
+ }
24
+ // Handle AWS services
25
+ if (url.host.endsWith(".amazonaws.com")) {
26
+ const parts = url.host.split(".");
27
+ const servicePart = parts[0];
28
+ if (servicePart) {
29
+ return `aws-${servicePart}`;
30
+ }
31
+ }
32
+ // Extract meaningful service name from host
33
+ const parts = url.host.split(".");
34
+ if (parts.length >= 2) {
35
+ // api.example.com -> example
36
+ // sub.example.com -> example
37
+ // example.com -> example
38
+ const serviceName = parts.length > 2 ? parts[parts.length - 2] : parts[0];
39
+ if (serviceName) {
40
+ return serviceName;
41
+ }
42
+ }
43
+ return url.host;
44
+ }
45
+ export class FetchInstrumentation {
46
+ name = "fetch";
47
+ originalFetch = null;
48
+ serviceMappings;
49
+ constructor(options = {}) {
50
+ this.serviceMappings = {
51
+ ...DEFAULT_SERVICE_MAPPINGS,
52
+ ...options.serviceMappings,
53
+ };
54
+ }
55
+ init(client) {
56
+ this.originalFetch = globalThis.fetch;
57
+ const vident = client;
58
+ const originalFetch = this.originalFetch;
59
+ const serviceMappings = this.serviceMappings;
60
+ globalThis.fetch = async function instrumentedFetch(input, init) {
61
+ // Skip instrumentation if tracing is suppressed (e.g., during span export)
62
+ // or if there's no active span context (avoids interfering with test runners)
63
+ const parent = getActiveSpan()?.context();
64
+ if (isTracingSuppressed() || !parent) {
65
+ return originalFetch(input, init);
66
+ }
67
+ const url = typeof input === "string"
68
+ ? input
69
+ : input instanceof URL
70
+ ? input.toString()
71
+ : input.url;
72
+ const method = init?.method ?? "GET";
73
+ let parsedUrl;
74
+ try {
75
+ parsedUrl = new URL(url);
76
+ }
77
+ catch {
78
+ parsedUrl = new URL("http://unknown");
79
+ }
80
+ const peerService = inferPeerService(parsedUrl, serviceMappings);
81
+ // Use method + path for span name (more descriptive than just host)
82
+ const spanName = `${method} ${parsedUrl.pathname}`;
83
+ const span = vident.startSpan(spanName, {
84
+ kind: "client",
85
+ parent, // Already fetched above
86
+ attributes: {
87
+ "http.method": method,
88
+ "http.url": parsedUrl.origin + parsedUrl.pathname,
89
+ "http.target": parsedUrl.pathname + parsedUrl.search,
90
+ "http.host": parsedUrl.host,
91
+ "http.scheme": parsedUrl.protocol.replace(":", ""),
92
+ "peer.service": peerService,
93
+ },
94
+ });
95
+ // Inject traceparent header for downstream trace propagation
96
+ const headers = new Headers(init?.headers);
97
+ const traceparent = createTraceparent(span.traceId, span.spanId, true);
98
+ headers.set("traceparent", traceparent);
99
+ try {
100
+ const response = await originalFetch(input, { ...init, headers });
101
+ const contentLength = response.headers.get("content-length");
102
+ span.setAttributes({
103
+ "http.status_code": response.status,
104
+ ...(contentLength && {
105
+ "http.response_content_length": Number(contentLength),
106
+ }),
107
+ });
108
+ span.end();
109
+ return response;
110
+ }
111
+ catch (error) {
112
+ span.end({ error: error });
113
+ throw error;
114
+ }
115
+ };
116
+ }
117
+ destroy() {
118
+ if (this.originalFetch) {
119
+ globalThis.fetch = this.originalFetch;
120
+ this.originalFetch = null;
121
+ }
122
+ }
123
+ }
124
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/instrument/fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Vident } from "../client.js";
2
+ /**
3
+ * Generic handler type using Web standard Request/Response.
4
+ * Works with Next.js App Router, Bun, Deno, Cloudflare Workers, etc.
5
+ */
6
+ export type Handler<T = Response> = (request: Request) => T | Promise<T>;
7
+ export type WrapHandlerOptions = {
8
+ /** Override the span name (default: "METHOD /path") */
9
+ name?: string;
10
+ /** Route pattern for http.route attribute (e.g., "/api/users/:id") */
11
+ route?: string;
12
+ };
13
+ /**
14
+ * Creates a handler wrapper for tracing HTTP handlers.
15
+ *
16
+ * Works with any framework using Web standard Request/Response:
17
+ * - Next.js App Router
18
+ * - Bun.serve
19
+ * - Deno.serve
20
+ * - Cloudflare Workers
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const wrapHandler = createHandlerWrapper(vident)
25
+ *
26
+ * // Next.js App Router
27
+ * export const GET = wrapHandler(async (request) => {
28
+ * return Response.json({ ok: true })
29
+ * }, { route: '/api/users/[id]' })
30
+ *
31
+ * // Bun
32
+ * Bun.serve({
33
+ * fetch: wrapHandler(async (request) => {
34
+ * return new Response('Hello')
35
+ * })
36
+ * })
37
+ * ```
38
+ */
39
+ export declare function createHandlerWrapper(vident: Vident): <T = Response>(handler: Handler<T>, options?: WrapHandlerOptions) => Handler<T>;
40
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/instrument/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAG1C;;;GAGG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,GAAG,QAAQ,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AAExE,MAAM,MAAM,kBAAkB,GAAG;IAChC,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAkBD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,IACtB,CAAC,GAAG,QAAQ,EACvC,SAAS,OAAO,CAAC,CAAC,CAAC,EACnB,UAAS,kBAAuB,KAC9B,OAAO,CAAC,CAAC,CAAC,CAkDb"}
@@ -0,0 +1,90 @@
1
+ import { runWithSpan } from "../context.js";
2
+ function generateRequestId() {
3
+ const bytes = new Uint8Array(16);
4
+ crypto.getRandomValues(bytes);
5
+ return Array.from(bytes)
6
+ .map((b) => b.toString(16).padStart(2, "0"))
7
+ .join("");
8
+ }
9
+ function getClientIp(request) {
10
+ const forwarded = request.headers.get("x-forwarded-for");
11
+ if (forwarded) {
12
+ return forwarded.split(",")[0]?.trim();
13
+ }
14
+ return request.headers.get("x-real-ip") ?? undefined;
15
+ }
16
+ /**
17
+ * Creates a handler wrapper for tracing HTTP handlers.
18
+ *
19
+ * Works with any framework using Web standard Request/Response:
20
+ * - Next.js App Router
21
+ * - Bun.serve
22
+ * - Deno.serve
23
+ * - Cloudflare Workers
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * const wrapHandler = createHandlerWrapper(vident)
28
+ *
29
+ * // Next.js App Router
30
+ * export const GET = wrapHandler(async (request) => {
31
+ * return Response.json({ ok: true })
32
+ * }, { route: '/api/users/[id]' })
33
+ *
34
+ * // Bun
35
+ * Bun.serve({
36
+ * fetch: wrapHandler(async (request) => {
37
+ * return new Response('Hello')
38
+ * })
39
+ * })
40
+ * ```
41
+ */
42
+ export function createHandlerWrapper(vident) {
43
+ return function wrapHandler(handler, options = {}) {
44
+ return async function tracedHandler(request) {
45
+ const url = new URL(request.url);
46
+ const method = request.method;
47
+ const route = options.route ?? url.pathname;
48
+ const spanName = options.name ?? `${method} ${route}`;
49
+ const requestId = request.headers.get("x-request-id") ??
50
+ request.headers.get("x-correlation-id") ??
51
+ generateRequestId();
52
+ const clientIp = getClientIp(request);
53
+ const span = vident.startSpan(spanName, {
54
+ kind: "server",
55
+ root: true,
56
+ attributes: {
57
+ "http.method": method,
58
+ "http.route": route,
59
+ "http.url": url.pathname,
60
+ "http.target": url.pathname + url.search,
61
+ "http.host": url.host,
62
+ "http.scheme": url.protocol.replace(":", ""),
63
+ "http.user_agent": request.headers.get("user-agent") ?? "",
64
+ "http.request_id": requestId,
65
+ ...(clientIp && { "http.client_ip": clientIp }),
66
+ },
67
+ });
68
+ try {
69
+ const result = await runWithSpan(span, () => handler(request));
70
+ // Try to extract status from Response
71
+ if (result instanceof Response) {
72
+ const contentLength = result.headers.get("content-length");
73
+ span.setAttributes({
74
+ "http.status_code": result.status,
75
+ ...(contentLength && {
76
+ "http.response_content_length": Number(contentLength),
77
+ }),
78
+ });
79
+ }
80
+ span.end();
81
+ return result;
82
+ }
83
+ catch (error) {
84
+ span.end({ error: error });
85
+ throw error;
86
+ }
87
+ };
88
+ };
89
+ }
90
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/instrument/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Context, Next } from "hono";
2
+ import type { Vident } from "../client.js";
3
+ export declare function createHonoMiddleware(vident: Vident): (c: Context, next: Next) => Promise<void>;
4
+ //# sourceMappingURL=hono.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../src/instrument/hono.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAuD1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,IACN,GAAG,OAAO,EAAE,MAAM,IAAI,mBA8FlE"}