@growth-labs/monitoring 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 (117) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +115 -0
  3. package/SPEC.md +19 -0
  4. package/dist/alerting/dedup.d.ts +6 -0
  5. package/dist/alerting/dedup.d.ts.map +1 -0
  6. package/dist/alerting/dedup.js +49 -0
  7. package/dist/alerting/dedup.js.map +1 -0
  8. package/dist/alerting/escalation.d.ts +4 -0
  9. package/dist/alerting/escalation.d.ts.map +1 -0
  10. package/dist/alerting/escalation.js +26 -0
  11. package/dist/alerting/escalation.js.map +1 -0
  12. package/dist/alerting/index.d.ts +31 -0
  13. package/dist/alerting/index.d.ts.map +1 -0
  14. package/dist/alerting/index.js +50 -0
  15. package/dist/alerting/index.js.map +1 -0
  16. package/dist/alerting/thresholds.d.ts +8 -0
  17. package/dist/alerting/thresholds.d.ts.map +1 -0
  18. package/dist/alerting/thresholds.js +105 -0
  19. package/dist/alerting/thresholds.js.map +1 -0
  20. package/dist/index.d.ts +10 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +5 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/prober/index.d.ts +19 -0
  25. package/dist/prober/index.d.ts.map +1 -0
  26. package/dist/prober/index.js +48 -0
  27. package/dist/prober/index.js.map +1 -0
  28. package/dist/prober/persist.d.ts +4 -0
  29. package/dist/prober/persist.d.ts.map +1 -0
  30. package/dist/prober/persist.js +21 -0
  31. package/dist/prober/persist.js.map +1 -0
  32. package/dist/prober/runners/get-runner.d.ts +4 -0
  33. package/dist/prober/runners/get-runner.d.ts.map +1 -0
  34. package/dist/prober/runners/get-runner.js +43 -0
  35. package/dist/prober/runners/get-runner.js.map +1 -0
  36. package/dist/prober/runners/happy-path-runner.d.ts +13 -0
  37. package/dist/prober/runners/happy-path-runner.d.ts.map +1 -0
  38. package/dist/prober/runners/happy-path-runner.js +183 -0
  39. package/dist/prober/runners/happy-path-runner.js.map +1 -0
  40. package/dist/prober/runners/post-runner.d.ts +4 -0
  41. package/dist/prober/runners/post-runner.d.ts.map +1 -0
  42. package/dist/prober/runners/post-runner.js +44 -0
  43. package/dist/prober/runners/post-runner.js.map +1 -0
  44. package/dist/prober/surfaces.d.ts +46 -0
  45. package/dist/prober/surfaces.d.ts.map +1 -0
  46. package/dist/prober/surfaces.js +2 -0
  47. package/dist/prober/surfaces.js.map +1 -0
  48. package/dist/schemas/drizzle/schema.d.ts +519 -0
  49. package/dist/schemas/drizzle/schema.d.ts.map +1 -0
  50. package/dist/schemas/drizzle/schema.js +45 -0
  51. package/dist/schemas/drizzle/schema.js.map +1 -0
  52. package/dist/schemas/index.d.ts +2 -0
  53. package/dist/schemas/index.d.ts.map +1 -0
  54. package/dist/schemas/index.js +2 -0
  55. package/dist/schemas/index.js.map +1 -0
  56. package/dist/schemas/migrations/0001_uptime_checks.sql +12 -0
  57. package/dist/schemas/migrations/0002_uptime_incidents.sql +12 -0
  58. package/dist/schemas/migrations/0003_errors.sql +16 -0
  59. package/dist/schemas/migrations/README.md +15 -0
  60. package/dist/status-page/app.d.ts +10 -0
  61. package/dist/status-page/app.d.ts.map +1 -0
  62. package/dist/status-page/app.js +44 -0
  63. package/dist/status-page/app.js.map +1 -0
  64. package/dist/status-page/lib/queries.d.ts +6 -0
  65. package/dist/status-page/lib/queries.d.ts.map +1 -0
  66. package/dist/status-page/lib/queries.js +81 -0
  67. package/dist/status-page/lib/queries.js.map +1 -0
  68. package/dist/status-page/pages/api/status.json.d.ts +3 -0
  69. package/dist/status-page/pages/api/status.json.d.ts.map +1 -0
  70. package/dist/status-page/pages/api/status.json.js +19 -0
  71. package/dist/status-page/pages/api/status.json.js.map +1 -0
  72. package/dist/status-page/shell.d.ts +3 -0
  73. package/dist/status-page/shell.d.ts.map +1 -0
  74. package/dist/status-page/shell.js +18 -0
  75. package/dist/status-page/shell.js.map +1 -0
  76. package/dist/tail/categorize.d.ts +44 -0
  77. package/dist/tail/categorize.d.ts.map +1 -0
  78. package/dist/tail/categorize.js +113 -0
  79. package/dist/tail/categorize.js.map +1 -0
  80. package/dist/tail/fingerprint.d.ts +4 -0
  81. package/dist/tail/fingerprint.d.ts.map +1 -0
  82. package/dist/tail/fingerprint.js +18 -0
  83. package/dist/tail/fingerprint.js.map +1 -0
  84. package/dist/tail/index.d.ts +21 -0
  85. package/dist/tail/index.d.ts.map +1 -0
  86. package/dist/tail/index.js +50 -0
  87. package/dist/tail/index.js.map +1 -0
  88. package/dist/tail/persist.d.ts +15 -0
  89. package/dist/tail/persist.d.ts.map +1 -0
  90. package/dist/tail/persist.js +63 -0
  91. package/dist/tail/persist.js.map +1 -0
  92. package/dist/tail/redact.d.ts +5 -0
  93. package/dist/tail/redact.d.ts.map +1 -0
  94. package/dist/tail/redact.js +25 -0
  95. package/dist/tail/redact.js.map +1 -0
  96. package/dist/tail/sample.d.ts +9 -0
  97. package/dist/tail/sample.d.ts.map +1 -0
  98. package/dist/tail/sample.js +25 -0
  99. package/dist/tail/sample.js.map +1 -0
  100. package/dist/types.d.ts +87 -0
  101. package/dist/types.d.ts.map +1 -0
  102. package/dist/types.js +11 -0
  103. package/dist/types.js.map +1 -0
  104. package/package.json +85 -0
  105. package/src/schemas/migrations/0001_uptime_checks.sql +12 -0
  106. package/src/schemas/migrations/0002_uptime_incidents.sql +12 -0
  107. package/src/schemas/migrations/0003_errors.sql +16 -0
  108. package/src/schemas/migrations/README.md +15 -0
  109. package/src/status-page/README.md +14 -0
  110. package/src/status-page/app.ts +58 -0
  111. package/src/status-page/components/ErrorRollup.astro +26 -0
  112. package/src/status-page/components/IncidentList.astro +25 -0
  113. package/src/status-page/components/SurfaceRow.astro +24 -0
  114. package/src/status-page/lib/queries.ts +114 -0
  115. package/src/status-page/pages/api/status.json.ts +24 -0
  116. package/src/status-page/pages/index.astro +45 -0
  117. package/src/status-page/shell.ts +17 -0
@@ -0,0 +1,43 @@
1
+ import { errorMessage, isTimeoutMessage } from '../../types.js';
2
+ export async function runGet(surface, runtime = {}) {
3
+ const start = Date.now();
4
+ const fetcher = runtime.fetcher ?? fetch;
5
+ try {
6
+ const response = await fetcher(surface.url, {
7
+ method: 'GET',
8
+ redirect: 'manual',
9
+ signal: AbortSignal.timeout(surface.timeoutMs),
10
+ });
11
+ const latencyMs = Date.now() - start;
12
+ if (response.status !== surface.assertions.statusCode) {
13
+ return {
14
+ status: 'fail',
15
+ statusCode: response.status,
16
+ latencyMs,
17
+ errorMessage: `expected ${surface.assertions.statusCode}, got ${response.status}`,
18
+ };
19
+ }
20
+ if (surface.assertions.contentMarker) {
21
+ const body = await response.text();
22
+ if (!body.includes(surface.assertions.contentMarker)) {
23
+ return {
24
+ status: 'fail',
25
+ statusCode: response.status,
26
+ latencyMs,
27
+ errorMessage: `content marker "${surface.assertions.contentMarker}" not found in body`,
28
+ };
29
+ }
30
+ }
31
+ return { status: 'pass', statusCode: response.status, latencyMs };
32
+ }
33
+ catch (error) {
34
+ const latencyMs = Date.now() - start;
35
+ const message = errorMessage(error);
36
+ return {
37
+ status: isTimeoutMessage(message) ? 'timeout' : 'fail',
38
+ latencyMs,
39
+ errorMessage: message,
40
+ };
41
+ }
42
+ }
43
+ //# sourceMappingURL=get-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-runner.js","sourceRoot":"","sources":["../../../src/prober/runners/get-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,gBAAgB,EAAqB,MAAM,gBAAgB,CAAA;AAGpG,MAAM,CAAC,KAAK,UAAU,MAAM,CAC3B,OAAmB,EACnB,UAAwB,EAAE;IAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAA;IACxC,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YAC3C,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;SAC9C,CAAC,CAAA;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;QAEpC,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACvD,OAAO;gBACN,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,SAAS;gBACT,YAAY,EAAE,YAAY,OAAO,CAAC,UAAU,CAAC,UAAU,SAAS,QAAQ,CAAC,MAAM,EAAE;aACjF,CAAA;QACF,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBACtD,OAAO;oBACN,MAAM,EAAE,MAAM;oBACd,UAAU,EAAE,QAAQ,CAAC,MAAM;oBAC3B,SAAS;oBACT,YAAY,EAAE,mBAAmB,OAAO,CAAC,UAAU,CAAC,aAAa,qBAAqB;iBACtF,CAAA;YACF,CAAC;QACF,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAA;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;QACpC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QACnC,OAAO;YACN,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACtD,SAAS;YACT,YAAY,EAAE,OAAO;SACrB,CAAA;IACF,CAAC;AACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type CheckResult, type RuntimeFetch } from '../../types.js';
2
+ import type { CodeSigninHappyPathConfig, HappyPathSurface } from '../surfaces.js';
3
+ export interface GmailCodeClient {
4
+ findLatestCode(config: CodeSigninHappyPathConfig['gmail'], env: Record<string, unknown>, runtime: RuntimeFetch): Promise<string | null>;
5
+ }
6
+ export interface HappyPathRuntime extends RuntimeFetch {
7
+ env?: Record<string, unknown>;
8
+ gmailClient?: GmailCodeClient;
9
+ sleep?: (ms: number) => Promise<void>;
10
+ }
11
+ export declare function runHappyPath(surface: HappyPathSurface, runtime?: HappyPathRuntime): Promise<CheckResult>;
12
+ export declare function extractCodeFromMessage(message: string): Promise<string | null>;
13
+ //# sourceMappingURL=happy-path-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"happy-path-runner.d.ts","sourceRoot":"","sources":["../../../src/prober/runners/happy-path-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAkC,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACpG,OAAO,KAAK,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjF,MAAM,WAAW,eAAe;IAC/B,cAAc,CACb,MAAM,EAAE,yBAAyB,CAAC,OAAO,CAAC,EAC1C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,OAAO,EAAE,YAAY,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;CACzB;AAED,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,WAAW,CAAC,EAAE,eAAe,CAAA;IAC7B,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,gBAAqB,GAC5B,OAAO,CAAC,WAAW,CAAC,CA6FtB;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEpF"}
@@ -0,0 +1,183 @@
1
+ import { errorMessage, isTimeoutMessage } from '../../types.js';
2
+ export async function runHappyPath(surface, runtime = {}) {
3
+ const start = Date.now();
4
+ const fetcher = runtime.fetcher ?? fetch;
5
+ const env = runtime.env ?? {};
6
+ try {
7
+ if (surface.flow !== 'code-signin') {
8
+ return { status: 'fail', latencyMs: 0, errorMessage: `unsupported flow ${surface.flow}` };
9
+ }
10
+ const requestResponse = await fetcher(surface.config.codeRequestUrl, {
11
+ method: 'POST',
12
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
13
+ body: new URLSearchParams({ email: surface.config.testEmail }).toString(),
14
+ redirect: 'manual',
15
+ signal: AbortSignal.timeout(surface.timeoutMs),
16
+ });
17
+ if (requestResponse.status < 200 || requestResponse.status >= 300) {
18
+ return fail(start, `code request expected 2xx, got ${requestResponse.status}`, requestResponse.status);
19
+ }
20
+ const code = await pollForCode(surface.config, env, runtime);
21
+ if (!code)
22
+ return timeout(start, 'verification code email did not arrive before poll limit');
23
+ const verifyResponse = await fetcher(surface.config.codeVerifyUrl, {
24
+ method: 'POST',
25
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
26
+ body: new URLSearchParams({ email: surface.config.testEmail, code }).toString(),
27
+ redirect: 'manual',
28
+ signal: AbortSignal.timeout(surface.timeoutMs),
29
+ });
30
+ if (verifyResponse.status < 200 || verifyResponse.status >= 400) {
31
+ return fail(start, `code verify expected 2xx/3xx, got ${verifyResponse.status}`, verifyResponse.status);
32
+ }
33
+ const cookies = collectSetCookies([requestResponse, verifyResponse]);
34
+ const location = verifyResponse.headers.get('Location');
35
+ if (location) {
36
+ const callbackUrl = new URL(location, surface.config.callbackUrl).toString();
37
+ const callbackResponse = await fetcher(callbackUrl, {
38
+ method: 'GET',
39
+ headers: cookieHeader(cookies),
40
+ redirect: 'manual',
41
+ signal: AbortSignal.timeout(surface.timeoutMs),
42
+ });
43
+ cookies.push(...collectSetCookies([callbackResponse]));
44
+ if (callbackResponse.status >= 400) {
45
+ return fail(start, `callback expected <400, got ${callbackResponse.status}`, callbackResponse.status);
46
+ }
47
+ }
48
+ const accountResponse = await fetcher(surface.config.accountUrl, {
49
+ method: 'GET',
50
+ headers: cookieHeader(cookies),
51
+ redirect: 'manual',
52
+ signal: AbortSignal.timeout(surface.timeoutMs),
53
+ });
54
+ if (accountResponse.status !== 200) {
55
+ return fail(start, `account expected 200, got ${accountResponse.status}`, accountResponse.status);
56
+ }
57
+ const accountBody = await accountResponse.text();
58
+ if (!accountBody.includes(surface.config.testEmail)) {
59
+ return fail(start, `account page did not contain ${surface.config.testEmail}`, accountResponse.status);
60
+ }
61
+ return { status: 'pass', statusCode: 200, latencyMs: Date.now() - start };
62
+ }
63
+ catch (error) {
64
+ const message = errorMessage(error);
65
+ return {
66
+ status: isTimeoutMessage(message) ? 'timeout' : 'fail',
67
+ latencyMs: Date.now() - start,
68
+ errorMessage: message,
69
+ };
70
+ }
71
+ }
72
+ export async function extractCodeFromMessage(message) {
73
+ return message.match(/\b\d{6}\b/)?.[0] ?? null;
74
+ }
75
+ async function pollForCode(config, env, runtime) {
76
+ const client = runtime.gmailClient ?? defaultGmailClient;
77
+ const sleep = runtime.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
78
+ for (let attempt = 0; attempt < config.gmail.maxPollAttempts; attempt += 1) {
79
+ const code = await client.findLatestCode(config.gmail, env, runtime);
80
+ if (code)
81
+ return code;
82
+ if (attempt < config.gmail.maxPollAttempts - 1)
83
+ await sleep(config.gmail.pollIntervalMs);
84
+ }
85
+ return null;
86
+ }
87
+ const defaultGmailClient = {
88
+ async findLatestCode(config, env, runtime) {
89
+ const fetcher = runtime.fetcher ?? fetch;
90
+ const credentialsJson = env[config.credentialsSecret];
91
+ if (typeof credentialsJson !== 'string') {
92
+ throw new Error(`env.${config.credentialsSecret} must contain Gmail service account JSON`);
93
+ }
94
+ const token = await authorizeGmail(JSON.parse(credentialsJson), config.subject);
95
+ const query = encodeURIComponent(config.query ?? 'newer_than:5m');
96
+ const messages = await fetcher(`https://gmail.googleapis.com/gmail/v1/users/me/messages?q=${query}`, { headers: { Authorization: `Bearer ${token}` } });
97
+ const list = (await messages.json());
98
+ for (const message of list.messages ?? []) {
99
+ const response = await fetcher(`https://gmail.googleapis.com/gmail/v1/users/me/messages/${message.id}?format=full`, { headers: { Authorization: `Bearer ${token}` } });
100
+ const body = JSON.stringify(await response.json());
101
+ const code = await extractCodeFromMessage(body);
102
+ if (code)
103
+ return code;
104
+ }
105
+ return null;
106
+ },
107
+ };
108
+ async function authorizeGmail(credentials, subject) {
109
+ const now = Math.floor(Date.now() / 1000);
110
+ const assertion = await signJwt({
111
+ alg: 'RS256',
112
+ typ: 'JWT',
113
+ }, {
114
+ iss: credentials.client_email,
115
+ scope: 'https://www.googleapis.com/auth/gmail.readonly',
116
+ aud: credentials.token_uri ?? 'https://oauth2.googleapis.com/token',
117
+ exp: now + 3600,
118
+ iat: now,
119
+ sub: subject,
120
+ }, credentials.private_key);
121
+ const response = await fetch(credentials.token_uri ?? 'https://oauth2.googleapis.com/token', {
122
+ method: 'POST',
123
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
124
+ body: new URLSearchParams({
125
+ grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
126
+ assertion,
127
+ }).toString(),
128
+ });
129
+ if (!response.ok)
130
+ throw new Error(`Gmail JWT authorization failed with ${response.status}`);
131
+ const payload = (await response.json());
132
+ if (!payload.access_token)
133
+ throw new Error('Gmail JWT authorization returned no access_token');
134
+ return payload.access_token;
135
+ }
136
+ async function signJwt(header, claims, privateKeyPem) {
137
+ const encodedHeader = base64UrlEncode(new TextEncoder().encode(JSON.stringify(header)));
138
+ const encodedClaims = base64UrlEncode(new TextEncoder().encode(JSON.stringify(claims)));
139
+ const input = `${encodedHeader}.${encodedClaims}`;
140
+ const key = await crypto.subtle.importKey('pkcs8', pemToArrayBuffer(privateKeyPem), { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' }, false, ['sign']);
141
+ const signature = await crypto.subtle.sign('RSASSA-PKCS1-v1_5', key, new TextEncoder().encode(input));
142
+ return `${input}.${base64UrlEncode(new Uint8Array(signature))}`;
143
+ }
144
+ function pemToArrayBuffer(pem) {
145
+ const keyLabel = ['PRIVATE', 'KEY'].join(' ');
146
+ const beginLabel = ['-----BEGIN', `${keyLabel}-----`].join(' ');
147
+ const endLabel = ['-----END', `${keyLabel}-----`].join(' ');
148
+ const base64 = pem.replaceAll(beginLabel, '').replaceAll(endLabel, '').replace(/\s/g, '');
149
+ const binary = atob(base64);
150
+ const bytes = new Uint8Array(binary.length);
151
+ for (let index = 0; index < binary.length; index += 1)
152
+ bytes[index] = binary.charCodeAt(index);
153
+ return bytes.buffer;
154
+ }
155
+ function base64UrlEncode(bytes) {
156
+ const binary = Array.from(bytes, (byte) => String.fromCharCode(byte)).join('');
157
+ return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
158
+ }
159
+ function fail(start, errorMessage, statusCode) {
160
+ return { status: 'fail', statusCode, latencyMs: Date.now() - start, errorMessage };
161
+ }
162
+ function timeout(start, errorMessage) {
163
+ return { status: 'timeout', latencyMs: Date.now() - start, errorMessage };
164
+ }
165
+ function collectSetCookies(responses) {
166
+ const cookies = [];
167
+ for (const response of responses) {
168
+ const getSetCookie = response.headers
169
+ .getSetCookie;
170
+ const values = getSetCookie ? getSetCookie.call(response.headers) : [];
171
+ const single = response.headers.get('set-cookie');
172
+ for (const value of single ? [single, ...values] : values) {
173
+ const cookie = value.split(';')[0]?.trim();
174
+ if (cookie)
175
+ cookies.push(cookie);
176
+ }
177
+ }
178
+ return cookies;
179
+ }
180
+ function cookieHeader(cookies) {
181
+ return cookies.length > 0 ? { Cookie: cookies.join('; ') } : {};
182
+ }
183
+ //# sourceMappingURL=happy-path-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"happy-path-runner.js","sourceRoot":"","sources":["../../../src/prober/runners/happy-path-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type CheckResult, type RuntimeFetch } from '../../types.js';
2
+ import type { PostSurface } from '../surfaces.js';
3
+ export declare function runPost(surface: PostSurface, runtime?: RuntimeFetch): Promise<CheckResult>;
4
+ //# sourceMappingURL=post-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-runner.d.ts","sourceRoot":"","sources":["../../../src/prober/runners/post-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAkC,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACpG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,wBAAsB,OAAO,CAC5B,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,WAAW,CAAC,CA2CtB"}
@@ -0,0 +1,44 @@
1
+ import { errorMessage, isTimeoutMessage } from '../../types.js';
2
+ export async function runPost(surface, runtime = {}) {
3
+ const start = Date.now();
4
+ const fetcher = runtime.fetcher ?? fetch;
5
+ try {
6
+ const body = new URLSearchParams(surface.bodyFormUrlEncoded).toString();
7
+ const response = await fetcher(surface.url, {
8
+ method: 'POST',
9
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
10
+ body,
11
+ redirect: 'manual',
12
+ signal: AbortSignal.timeout(surface.timeoutMs),
13
+ });
14
+ const latencyMs = Date.now() - start;
15
+ if (response.status !== surface.assertions.statusCode) {
16
+ return {
17
+ status: 'fail',
18
+ statusCode: response.status,
19
+ latencyMs,
20
+ errorMessage: `expected ${surface.assertions.statusCode}, got ${response.status}`,
21
+ };
22
+ }
23
+ const location = response.headers.get('Location') ?? '';
24
+ if (surface.assertions.locationPattern && !surface.assertions.locationPattern.test(location)) {
25
+ return {
26
+ status: 'fail',
27
+ statusCode: response.status,
28
+ latencyMs,
29
+ errorMessage: `Location "${location}" does not match expected pattern`,
30
+ };
31
+ }
32
+ return { status: 'pass', statusCode: response.status, latencyMs };
33
+ }
34
+ catch (error) {
35
+ const latencyMs = Date.now() - start;
36
+ const message = errorMessage(error);
37
+ return {
38
+ status: isTimeoutMessage(message) ? 'timeout' : 'fail',
39
+ latencyMs,
40
+ errorMessage: message,
41
+ };
42
+ }
43
+ }
44
+ //# sourceMappingURL=post-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-runner.js","sourceRoot":"","sources":["../../../src/prober/runners/post-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,gBAAgB,EAAqB,MAAM,gBAAgB,CAAA;AAGpG,MAAM,CAAC,KAAK,UAAU,OAAO,CAC5B,OAAoB,EACpB,UAAwB,EAAE;IAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAA;IACxC,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,CAAA;QACvE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI;YACJ,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;SAC9C,CAAC,CAAA;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;QAEpC,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACvD,OAAO;gBACN,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,SAAS;gBACT,YAAY,EAAE,YAAY,OAAO,CAAC,UAAU,CAAC,UAAU,SAAS,QAAQ,CAAC,MAAM,EAAE;aACjF,CAAA;QACF,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;QACvD,IAAI,OAAO,CAAC,UAAU,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9F,OAAO;gBACN,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,SAAS;gBACT,YAAY,EAAE,aAAa,QAAQ,mCAAmC;aACtE,CAAA;QACF,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAA;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;QACpC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QACnC,OAAO;YACN,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACtD,SAAS;YACT,YAAY,EAAE,OAAO;SACrB,CAAA;IACF,CAAC;AACF,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { CheckType } from '../types.js';
2
+ export interface BaseSurface {
3
+ name: string;
4
+ kind: CheckType;
5
+ schedule: string;
6
+ timeoutMs: number;
7
+ }
8
+ export interface GetSurface extends BaseSurface {
9
+ kind: 'get';
10
+ url: string;
11
+ assertions: {
12
+ statusCode: number;
13
+ contentMarker?: string;
14
+ };
15
+ }
16
+ export interface PostSurface extends BaseSurface {
17
+ kind: 'post';
18
+ url: string;
19
+ bodyFormUrlEncoded: Record<string, string>;
20
+ assertions: {
21
+ statusCode: number;
22
+ locationPattern?: RegExp;
23
+ };
24
+ }
25
+ export interface GmailPollingConfig {
26
+ credentialsSecret: string;
27
+ subject: string;
28
+ pollIntervalMs: number;
29
+ maxPollAttempts: number;
30
+ query?: string;
31
+ }
32
+ export interface CodeSigninHappyPathConfig {
33
+ codeRequestUrl: string;
34
+ codeVerifyUrl: string;
35
+ callbackUrl: string;
36
+ accountUrl: string;
37
+ testEmail: string;
38
+ gmail: GmailPollingConfig;
39
+ }
40
+ export interface HappyPathSurface extends BaseSurface {
41
+ kind: 'happy_path';
42
+ flow: 'code-signin';
43
+ config: CodeSigninHappyPathConfig;
44
+ }
45
+ export type SurfaceConfig = GetSurface | PostSurface | HappyPathSurface;
46
+ //# sourceMappingURL=surfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaces.d.ts","sourceRoot":"","sources":["../../src/prober/surfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,SAAS,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC9C,IAAI,EAAE,KAAK,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE;QACX,UAAU,EAAE,MAAM,CAAA;QAClB,aAAa,CAAC,EAAE,MAAM,CAAA;KACtB,CAAA;CACD;AAED,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC/C,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,UAAU,EAAE;QACX,UAAU,EAAE,MAAM,CAAA;QAClB,eAAe,CAAC,EAAE,MAAM,CAAA;KACxB,CAAA;CACD;AAED,MAAM,WAAW,kBAAkB;IAClC,iBAAiB,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,yBAAyB;IACzC,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,kBAAkB,CAAA;CACzB;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACpD,IAAI,EAAE,YAAY,CAAA;IAClB,IAAI,EAAE,aAAa,CAAA;IACnB,MAAM,EAAE,yBAAyB,CAAA;CACjC;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,gBAAgB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=surfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaces.js","sourceRoot":"","sources":["../../src/prober/surfaces.ts"],"names":[],"mappings":""}