gateproof 0.1.0 → 0.1.1
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/README.md +105 -4
- package/dist/act.d.ts +2 -0
- package/dist/act.d.ts.map +1 -1
- package/dist/act.js +1 -1
- package/dist/act.js.map +1 -1
- package/dist/action-executors.d.ts +10 -0
- package/dist/action-executors.d.ts.map +1 -1
- package/dist/action-executors.js +14 -3
- package/dist/action-executors.js.map +1 -1
- package/dist/assert.d.ts +2 -2
- package/dist/assert.d.ts.map +1 -1
- package/dist/assert.js +1 -1
- package/dist/assert.js.map +1 -1
- package/dist/cloudflare/cli-stream.d.ts.map +1 -1
- package/dist/cloudflare/cli-stream.js +7 -3
- package/dist/cloudflare/cli-stream.js.map +1 -1
- package/dist/constants.d.ts +11 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +11 -0
- package/dist/constants.js.map +1 -0
- package/dist/http-backend.d.ts +23 -0
- package/dist/http-backend.d.ts.map +1 -0
- package/dist/http-backend.js +124 -0
- package/dist/http-backend.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +88 -44
- package/dist/index.js.map +1 -1
- package/dist/observe.d.ts.map +1 -1
- package/dist/observe.js +4 -3
- package/dist/observe.js.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +3 -2
- package/dist/utils.js.map +1 -1
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +7 -3
- package/dist/validation.js.map +1 -1
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -2,10 +2,108 @@
|
|
|
2
2
|
|
|
3
3
|
E2E testing harness. Observe logs, run actions, assert results.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## What gateproof does
|
|
6
|
+
|
|
7
|
+
gateproof **executes gates**. It does not define intent, plans, or workflows.
|
|
8
|
+
|
|
9
|
+
A gate is a test specification: observe logs, run actions, assert results. gateproof runs it and returns evidence.
|
|
10
|
+
|
|
11
|
+
You define stories (gates) in your PRD. gateproof executes gate files.
|
|
12
|
+
|
|
13
|
+
**Authority chain:**
|
|
14
|
+
- **PRD (`prd.ts` / `prd.json`)** — authority on intent, order, and state
|
|
15
|
+
- **Gate implementations** — authority on how reality is observed
|
|
16
|
+
- **gateproof runtime** — authority on enforcement only
|
|
17
|
+
|
|
18
|
+
gateproof never decides *what* to build. It only decides *when you are allowed to proceed*.
|
|
19
|
+
|
|
20
|
+
## Stories as gates
|
|
21
|
+
|
|
22
|
+
A PRD (Product Requirements Document) defines stories. Stories are gates. Each story references a gate file. The gate file verifies the story against reality.
|
|
23
|
+
|
|
24
|
+
Reality decides when you can proceed.
|
|
25
|
+
|
|
26
|
+
### prd.ts example
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// prd.ts
|
|
30
|
+
export const stories = [
|
|
31
|
+
{
|
|
32
|
+
id: "user-signup",
|
|
33
|
+
title: "User can sign up",
|
|
34
|
+
gateFile: "./gates/user-signup.gate.ts",
|
|
35
|
+
status: "pending"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "email-verification",
|
|
39
|
+
title: "User receives verification email",
|
|
40
|
+
gateFile: "./gates/email-verification.gate.ts",
|
|
41
|
+
dependsOn: ["user-signup"],
|
|
42
|
+
status: "pending"
|
|
43
|
+
}
|
|
44
|
+
];
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Each story references a gate file. The gate file uses gateproof's API:
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
// gates/user-signup.gate.ts
|
|
51
|
+
import { Gate, Act, Assert } from "gateproof";
|
|
52
|
+
import { CloudflareProvider } from "gateproof/cloudflare";
|
|
53
|
+
|
|
54
|
+
const provider = CloudflareProvider({
|
|
55
|
+
accountId: process.env.CLOUDFLARE_ACCOUNT_ID!,
|
|
56
|
+
apiToken: process.env.CLOUDFLARE_API_TOKEN!
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const result = await Gate.run({
|
|
60
|
+
name: "user-signup",
|
|
61
|
+
observe: provider.observe({ backend: "analytics", dataset: "worker_logs" }),
|
|
62
|
+
act: [Act.browser({ url: "https://app.example.com/signup" })],
|
|
63
|
+
assert: [
|
|
64
|
+
Assert.noErrors(),
|
|
65
|
+
Assert.hasAction("user_created")
|
|
66
|
+
]
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
if (result.status !== "success") process.exit(1);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### prd.json example
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"stories": [
|
|
77
|
+
{
|
|
78
|
+
"id": "user-signup",
|
|
79
|
+
"title": "User can sign up",
|
|
80
|
+
"gateFile": "./gates/user-signup.gate.ts",
|
|
81
|
+
"status": "pending"
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**gateproof does not parse or own your PRD.** It's your repo's artifact. **You decide the format. gateproof only executes the gate files your PRD references.**
|
|
88
|
+
|
|
89
|
+
Stories carry state. The PRD tracks which stories are pending, in progress, or done. gateproof does not manage this state. It only enforces: proceed only when gates pass.
|
|
90
|
+
|
|
91
|
+
## How it works
|
|
92
|
+
|
|
93
|
+
The PRD defines stories. Stories reference gate files. Gate files use gateproof's API. Gates can be enforced in CI before merge/deploy.
|
|
94
|
+
|
|
95
|
+
The sequence: PRD story → gate file → gate execution → story marked "done" only when gate passes.
|
|
96
|
+
|
|
97
|
+
Progress is not declared. It is proven.
|
|
98
|
+
|
|
99
|
+
## Design notes
|
|
100
|
+
|
|
101
|
+
- [Effect and Schema: Gateproof's Foundation](docs/effect-and-schema.md)
|
|
6
102
|
|
|
7
103
|
## Quick Start
|
|
8
104
|
|
|
105
|
+
The API is minimal: three concepts (Gate, Act, Assert). Here's a gate:
|
|
106
|
+
|
|
9
107
|
```typescript
|
|
10
108
|
import { Gate, Act, Assert } from "gateproof";
|
|
11
109
|
import { CloudflareProvider } from "gateproof/cloudflare";
|
|
@@ -16,6 +114,7 @@ const provider = CloudflareProvider({
|
|
|
16
114
|
});
|
|
17
115
|
|
|
18
116
|
const result = await Gate.run({
|
|
117
|
+
name: "api-health-check",
|
|
19
118
|
observe: provider.observe({ backend: "analytics", dataset: "worker_logs" }),
|
|
20
119
|
act: [Act.browser({ url: "https://my-worker.workers.dev" })],
|
|
21
120
|
assert: [Assert.noErrors(), Assert.hasAction("request_received")]
|
|
@@ -24,12 +123,13 @@ const result = await Gate.run({
|
|
|
24
123
|
if (result.status !== "success") process.exit(1);
|
|
25
124
|
```
|
|
26
125
|
|
|
27
|
-
|
|
126
|
+
This gate is a story verification. The PRD points at it.
|
|
28
127
|
|
|
29
128
|
## Core API
|
|
30
129
|
|
|
31
130
|
### Gate.run(spec)
|
|
32
131
|
Run a gate. Returns a result with status, logs, and evidence.
|
|
132
|
+
`spec.name` is optional metadata for labeling a gate.
|
|
33
133
|
|
|
34
134
|
### Actions
|
|
35
135
|
```typescript
|
|
@@ -85,7 +185,7 @@ See `patterns/` for examples including:
|
|
|
85
185
|
```typescript
|
|
86
186
|
const provider = CloudflareProvider({ accountId, apiToken });
|
|
87
187
|
|
|
88
|
-
// Analytics Engine
|
|
188
|
+
// Analytics Engine
|
|
89
189
|
provider.observe({ backend: "analytics", dataset: "worker_logs" })
|
|
90
190
|
|
|
91
191
|
// Workers Logs API
|
|
@@ -105,7 +205,7 @@ See `patterns/` for complete examples:
|
|
|
105
205
|
|
|
106
206
|
## CI/CD
|
|
107
207
|
|
|
108
|
-
gateproof
|
|
208
|
+
gateproof enforces gates in CI/CD. See `patterns/ci-cd/github-actions.ts` for examples.
|
|
109
209
|
|
|
110
210
|
## Requirements
|
|
111
211
|
|
|
@@ -113,6 +213,7 @@ gateproof works great in CI/CD. See `patterns/ci-cd/github-actions.ts` for examp
|
|
|
113
213
|
- `playwright` (optional, for Act.browser)
|
|
114
214
|
- Cloudflare credentials (for CloudflareProvider, or bring your own backend)
|
|
115
215
|
|
|
216
|
+
|
|
116
217
|
## License
|
|
117
218
|
|
|
118
219
|
MIT
|
package/dist/act.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export type Action = {
|
|
|
13
13
|
_tag: "Exec";
|
|
14
14
|
command: string;
|
|
15
15
|
cwd?: string;
|
|
16
|
+
timeoutMs?: number;
|
|
16
17
|
};
|
|
17
18
|
export declare namespace Act {
|
|
18
19
|
function deploy(config: {
|
|
@@ -26,6 +27,7 @@ export declare namespace Act {
|
|
|
26
27
|
function wait(ms: number): Action;
|
|
27
28
|
function exec(command: string, opts?: {
|
|
28
29
|
cwd?: string;
|
|
30
|
+
timeoutMs?: number;
|
|
29
31
|
}): Action;
|
|
30
32
|
}
|
|
31
33
|
//# sourceMappingURL=act.d.ts.map
|
package/dist/act.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../src/act.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,MAAM,GACd;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../src/act.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,MAAM,GACd;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,yBAAiB,GAAG,CAAC;IACnB,SAAgB,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAEzD;IAED,SAAgB,OAAO,CAAC,MAAM,EAAE;QAC9B,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,MAAM,CAOT;IAED,SAAgB,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEvC;IAED,SAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAEzF;CACF"}
|
package/dist/act.js
CHANGED
package/dist/act.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act.js","sourceRoot":"","sources":["../src/act.ts"],"names":[],"mappings":"AAQA,MAAM,KAAW,GAAG,CAyBnB;AAzBD,WAAiB,GAAG;IAClB,SAAgB,MAAM,CAAC,MAA0B;QAC/C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC;IAFe,UAAM,SAErB,CAAA;IAED,SAAgB,OAAO,CAAC,MAIvB;QACC,OAAO;YACL,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;YACjC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;SAC9B,CAAC;IACJ,CAAC;IAXe,WAAO,UAWtB,CAAA;IAED,SAAgB,IAAI,CAAC,EAAU;QAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC9B,CAAC;IAFe,QAAI,OAEnB,CAAA;IAED,SAAgB,IAAI,CAAC,OAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"act.js","sourceRoot":"","sources":["../src/act.ts"],"names":[],"mappings":"AAQA,MAAM,KAAW,GAAG,CAyBnB;AAzBD,WAAiB,GAAG;IAClB,SAAgB,MAAM,CAAC,MAA0B;QAC/C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC;IAFe,UAAM,SAErB,CAAA;IAED,SAAgB,OAAO,CAAC,MAIvB;QACC,OAAO;YACL,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;YACjC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;SAC9B,CAAC;IACJ,CAAC;IAXe,WAAO,UAWtB,CAAA;IAED,SAAgB,IAAI,CAAC,EAAU;QAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC9B,CAAC;IAFe,QAAI,OAEnB,CAAA;IAED,SAAgB,IAAI,CAAC,OAAe,EAAE,IAA2C;QAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC/E,CAAC;IAFe,QAAI,OAEnB,CAAA;AACH,CAAC,EAzBgB,GAAG,KAAH,GAAG,QAyBnB"}
|
|
@@ -6,6 +6,16 @@ export interface ActionExecutor {
|
|
|
6
6
|
}
|
|
7
7
|
export declare const WaitExecutor: ActionExecutor;
|
|
8
8
|
export declare const DeployExecutor: ActionExecutor;
|
|
9
|
+
/**
|
|
10
|
+
* Executes shell commands.
|
|
11
|
+
*
|
|
12
|
+
* **SECURITY WARNING**: Commands are executed with `shell: true`, which means
|
|
13
|
+
* shell interpretation occurs. The `validateCommand` function blocks dangerous
|
|
14
|
+
* characters, but this executor should only be used with trusted input.
|
|
15
|
+
*
|
|
16
|
+
* For untrusted input, consider using `execFile` with explicit argument arrays
|
|
17
|
+
* instead of shell execution.
|
|
18
|
+
*/
|
|
9
19
|
export declare const ExecExecutor: ActionExecutor;
|
|
10
20
|
export declare const BrowserExecutor: ActionExecutor;
|
|
11
21
|
export declare function getActionExecutor(action: Action): ActionExecutor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-executors.d.ts","sourceRoot":"","sources":["../src/action-executors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAY,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"action-executors.d.ts","sourceRoot":"","sources":["../src/action-executors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAY,MAAM,QAAQ,CAAC;AAE1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;CACzD;AAED,eAAO,MAAM,YAAY,EAAE,cAU1B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,cA+B5B,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,EAAE,cA+B1B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cA2C7B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAahE"}
|
package/dist/action-executors.js
CHANGED
|
@@ -42,6 +42,16 @@ export const DeployExecutor = {
|
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Executes shell commands.
|
|
47
|
+
*
|
|
48
|
+
* **SECURITY WARNING**: Commands are executed with `shell: true`, which means
|
|
49
|
+
* shell interpretation occurs. The `validateCommand` function blocks dangerous
|
|
50
|
+
* characters, but this executor should only be used with trusted input.
|
|
51
|
+
*
|
|
52
|
+
* For untrusted input, consider using `execFile` with explicit argument arrays
|
|
53
|
+
* instead of shell execution.
|
|
54
|
+
*/
|
|
45
55
|
export const ExecExecutor = {
|
|
46
56
|
execute(action) {
|
|
47
57
|
if (action._tag !== "Exec") {
|
|
@@ -68,7 +78,7 @@ export const ExecExecutor = {
|
|
|
68
78
|
});
|
|
69
79
|
},
|
|
70
80
|
catch: (e) => new GateError({ cause: e })
|
|
71
|
-
}).pipe(Effect.timeout(
|
|
81
|
+
}).pipe(Effect.timeout(`${action.timeoutMs ?? 30000} millis`), Effect.retry(Schedule.exponential("100 millis").pipe(Schedule.compose(Schedule.recurs(3)))), Effect.catchTag("TimeoutException", (e) => Effect.fail(new GateError({ cause: e }))));
|
|
72
82
|
});
|
|
73
83
|
}
|
|
74
84
|
};
|
|
@@ -83,7 +93,8 @@ export const BrowserExecutor = {
|
|
|
83
93
|
try: async () => {
|
|
84
94
|
try {
|
|
85
95
|
const pw = await import("playwright");
|
|
86
|
-
|
|
96
|
+
const browser = await pw.chromium.launch({ headless: action.headless });
|
|
97
|
+
return browser;
|
|
87
98
|
}
|
|
88
99
|
catch (e) {
|
|
89
100
|
throw new Error(`Playwright not available: ${e instanceof Error ? e.message : String(e)}`);
|
|
@@ -118,7 +129,7 @@ export function getActionExecutor(action) {
|
|
|
118
129
|
case "Browser":
|
|
119
130
|
return BrowserExecutor;
|
|
120
131
|
default:
|
|
121
|
-
throw new Error(
|
|
132
|
+
throw new Error("Unknown action type");
|
|
122
133
|
}
|
|
123
134
|
}
|
|
124
135
|
//# sourceMappingURL=action-executors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-executors.js","sourceRoot":"","sources":["../src/action-executors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"action-executors.js","sourceRoot":"","sources":["../src/action-executors.ts"],"names":[],"mappings":"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"}
|
package/dist/assert.d.ts
CHANGED
|
@@ -25,14 +25,14 @@ export type Assertion = {
|
|
|
25
25
|
stage: string;
|
|
26
26
|
} | {
|
|
27
27
|
_tag: "Custom";
|
|
28
|
-
fn: (logs: Log[]) => boolean
|
|
28
|
+
fn: (logs: Log[]) => boolean | Promise<boolean>;
|
|
29
29
|
name: string;
|
|
30
30
|
};
|
|
31
31
|
export declare namespace Assert {
|
|
32
32
|
function noErrors(): Assertion;
|
|
33
33
|
function hasAction(action: string): Assertion;
|
|
34
34
|
function hasStage(stage: string): Assertion;
|
|
35
|
-
function custom(name: string, fn: (logs: Log[]) => boolean): Assertion;
|
|
35
|
+
function custom(name: string, fn: (logs: Log[]) => boolean | Promise<boolean>): Assertion;
|
|
36
36
|
function run(assertions: Assertion[], logs: Log[]): Effect.Effect<void, AssertionFailed | AssertionAggregateFailed>;
|
|
37
37
|
}
|
|
38
38
|
export {};
|
package/dist/assert.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../src/assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;;;;;;;AAEnC,qBAAa,eAAgB,SAAQ,oBAMpC;CAAG;;;;;;AAEJ,qBAAa,wBAAyB,SAAQ,6BAK7C;CAAG;AAEJ,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../src/assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;;;;;;;AAEnC,qBAAa,eAAgB,SAAQ,oBAMpC;CAAG;;;;;;AAEJ,qBAAa,wBAAyB,SAAQ,6BAK7C;CAAG;AAEJ,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF,yBAAiB,MAAM,CAAC;IACtB,SAAgB,QAAQ,IAAI,SAAS,CAEpC;IAED,SAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAEnD;IAED,SAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAEjD;IAED,SAAgB,MAAM,CACpB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAC9C,SAAS,CAEX;IAED,SAAgB,GAAG,CACjB,UAAU,EAAE,SAAS,EAAE,EACvB,IAAI,EAAE,GAAG,EAAE,GACV,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,wBAAwB,CAAC,CA8DjE;CACF"}
|
package/dist/assert.js
CHANGED
|
@@ -64,7 +64,7 @@ export var Assert;
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
else if (assertion._tag === "Custom") {
|
|
67
|
-
const passed = assertion.fn(logs);
|
|
67
|
+
const passed = yield* Effect.promise(() => Promise.resolve(assertion.fn(logs)));
|
|
68
68
|
if (!passed) {
|
|
69
69
|
failures.push(new AssertionFailed({
|
|
70
70
|
assertion: assertion.name,
|
package/dist/assert.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assert.js","sourceRoot":"","sources":["../src/assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGxC,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,WAAW,EAAmB,CACxE,iBAAiB,EACjB;IACE,SAAS,EAAE,MAAM,CAAC,MAAM;IACxB,OAAO,EAAE,MAAM,CAAC,OAAO;CACxB,CACF;CAAG;AAEJ,MAAM,OAAO,wBAAyB,SAAQ,MAAM,CAAC,WAAW,EAA4B,CAC1F,0BAA0B,EAC1B;IACE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;CAC3D,CACF;CAAG;AAQJ,MAAM,KAAW,MAAM,CAsFtB;AAtFD,WAAiB,MAAM;IACrB,SAAgB,QAAQ;QACtB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAFe,eAAQ,WAEvB,CAAA;IAED,SAAgB,SAAS,CAAC,MAAc;QACtC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IACvC,CAAC;IAFe,gBAAS,YAExB,CAAA;IAED,SAAgB,QAAQ,CAAC,KAAa;QACpC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAFe,eAAQ,WAEvB,CAAA;IAED,SAAgB,MAAM,CACpB,IAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"assert.js","sourceRoot":"","sources":["../src/assert.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-stream.d.ts","sourceRoot":"","sources":["../../src/cloudflare/cli-stream.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0E,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAElH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"cli-stream.d.ts","sourceRoot":"","sources":["../../src/cloudflare/cli-stream.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0E,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAElH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8BD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,eAAe,GACtB,OAAO,CAiFT"}
|
|
@@ -11,10 +11,14 @@ function parseLogLine(line) {
|
|
|
11
11
|
if (typeof msg === "string") {
|
|
12
12
|
const innerResult = yield* Effect.try({
|
|
13
13
|
try: () => JSON.parse(msg),
|
|
14
|
-
catch: () =>
|
|
14
|
+
catch: () => createObservabilityError(new Error("Failed to parse inner JSON"))
|
|
15
15
|
}).pipe(Effect.either);
|
|
16
|
-
if (Either.isRight(innerResult)) {
|
|
17
|
-
|
|
16
|
+
if (Either.isRight(innerResult) && innerResult.right && typeof innerResult.right === "object") {
|
|
17
|
+
const merged = {
|
|
18
|
+
...parsed,
|
|
19
|
+
...innerResult.right
|
|
20
|
+
};
|
|
21
|
+
return merged;
|
|
18
22
|
}
|
|
19
23
|
}
|
|
20
24
|
return parsed;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-stream.js","sourceRoot":"","sources":["../../src/cloudflare/cli-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE/C,OAAO,EAAsB,wBAAwB,EAAE,wBAAwB,EAAgB,MAAM,YAAY,CAAC;AAOlH,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"cli-stream.js","sourceRoot":"","sources":["../../src/cloudflare/cli-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const DEFAULT_IDLE_MS = 3000;
|
|
2
|
+
export declare const DEFAULT_MAX_MS = 15000;
|
|
3
|
+
export declare const MAX_LOG_BUFFER = 50000;
|
|
4
|
+
export declare const LOG_BUFFER_CAPACITY = 1000;
|
|
5
|
+
export declare const HTTP_DEFAULT_POLL_INTERVAL_MS = 1000;
|
|
6
|
+
export declare const HTTP_DEFAULT_TIMEOUT_MS = 5000;
|
|
7
|
+
export declare const HTTP_MAX_RESPONSE_SIZE_BYTES: number;
|
|
8
|
+
export declare const QUEUE_TAKE_TIMEOUT_MS = 100;
|
|
9
|
+
export declare const QUEUE_DRAIN_LIMIT = 100;
|
|
10
|
+
export declare const QUEUE_DRAIN_TIMEOUT_MS = 10;
|
|
11
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,OAAO,CAAC;AACpC,eAAO,MAAM,cAAc,QAAQ,CAAC;AAEpC,eAAO,MAAM,cAAc,QAAS,CAAC;AACrC,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAClD,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAC5C,eAAO,MAAM,4BAA4B,QAAmB,CAAC;AAE7D,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,sBAAsB,KAAK,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const DEFAULT_IDLE_MS = 3000;
|
|
2
|
+
export const DEFAULT_MAX_MS = 15000;
|
|
3
|
+
export const MAX_LOG_BUFFER = 50_000;
|
|
4
|
+
export const LOG_BUFFER_CAPACITY = 1000;
|
|
5
|
+
export const HTTP_DEFAULT_POLL_INTERVAL_MS = 1000;
|
|
6
|
+
export const HTTP_DEFAULT_TIMEOUT_MS = 5000;
|
|
7
|
+
export const HTTP_MAX_RESPONSE_SIZE_BYTES = 10 * 1024 * 1024;
|
|
8
|
+
export const QUEUE_TAKE_TIMEOUT_MS = 100;
|
|
9
|
+
export const QUEUE_DRAIN_LIMIT = 100;
|
|
10
|
+
export const QUEUE_DRAIN_TIMEOUT_MS = 10;
|
|
11
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AACpC,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;AAEpC,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAC;AAClD,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAC5C,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AACzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ObserveResource } from "./observe";
|
|
2
|
+
export interface HttpObserveConfig {
|
|
3
|
+
url: string;
|
|
4
|
+
method?: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
body?: string;
|
|
7
|
+
pollInterval?: number;
|
|
8
|
+
/**
|
|
9
|
+
* Request timeout in milliseconds. Defaults to 5000.
|
|
10
|
+
*/
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
/**
|
|
13
|
+
* Maximum allowed response size in bytes. Defaults to 10MB.
|
|
14
|
+
* If Content-Length exceeds this, the body is not read and an error log is emitted instead.
|
|
15
|
+
*/
|
|
16
|
+
maxResponseSizeBytes?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Creates an observe resource that polls an HTTP endpoint and captures responses as logs.
|
|
20
|
+
* This gives agents visibility into what the endpoint is returning.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createHttpObserveResource(config: HttpObserveConfig): ObserveResource;
|
|
23
|
+
//# sourceMappingURL=http-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-backend.d.ts","sourceRoot":"","sources":["../src/http-backend.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAO3E,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,CAqJpF"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Effect, Queue } from "effect";
|
|
2
|
+
import { createLogStreamFromQueue } from "./observe";
|
|
3
|
+
import { HTTP_DEFAULT_POLL_INTERVAL_MS, HTTP_DEFAULT_TIMEOUT_MS, HTTP_MAX_RESPONSE_SIZE_BYTES } from "./constants";
|
|
4
|
+
/**
|
|
5
|
+
* Creates an observe resource that polls an HTTP endpoint and captures responses as logs.
|
|
6
|
+
* This gives agents visibility into what the endpoint is returning.
|
|
7
|
+
*/
|
|
8
|
+
export function createHttpObserveResource(config) {
|
|
9
|
+
let queue = null;
|
|
10
|
+
let stopped = false;
|
|
11
|
+
let pollTimer = null;
|
|
12
|
+
const poll = async () => {
|
|
13
|
+
if (stopped || !queue)
|
|
14
|
+
return;
|
|
15
|
+
const startTime = Date.now();
|
|
16
|
+
const requestId = crypto.randomUUID();
|
|
17
|
+
const timeoutMs = config.timeoutMs ?? HTTP_DEFAULT_TIMEOUT_MS;
|
|
18
|
+
const maxResponseSizeBytes = config.maxResponseSizeBytes ?? HTTP_MAX_RESPONSE_SIZE_BYTES;
|
|
19
|
+
try {
|
|
20
|
+
const response = await fetch(config.url, {
|
|
21
|
+
method: config.method || "GET",
|
|
22
|
+
headers: config.headers,
|
|
23
|
+
body: config.body,
|
|
24
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
25
|
+
});
|
|
26
|
+
const durationMs = Date.now() - startTime;
|
|
27
|
+
const contentType = response.headers.get("content-type") || "";
|
|
28
|
+
let body = null;
|
|
29
|
+
const contentLengthHeader = response.headers.get("content-length");
|
|
30
|
+
const contentLength = contentLengthHeader ? Number(contentLengthHeader) : undefined;
|
|
31
|
+
if (typeof contentLength === "number" && !Number.isNaN(contentLength) && contentLength > maxResponseSizeBytes) {
|
|
32
|
+
const log = {
|
|
33
|
+
requestId,
|
|
34
|
+
timestamp: new Date().toISOString(),
|
|
35
|
+
stage: "http",
|
|
36
|
+
action: `${config.method || "GET"} ${config.url}`,
|
|
37
|
+
status: "error",
|
|
38
|
+
durationMs,
|
|
39
|
+
error: {
|
|
40
|
+
tag: "HttpResponseTooLarge",
|
|
41
|
+
message: `Response size ${contentLength} exceeds limit ${maxResponseSizeBytes}`,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
await Effect.runPromise(Queue.offer(queue, log).pipe(Effect.tapError((error) => Effect.logError("Failed to enqueue HTTP size-limit log", error)), Effect.catchAll(() => Effect.void)));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (contentType.includes("application/json")) {
|
|
48
|
+
body = await response.json().catch(() => null);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
body = await response.text().catch(() => null);
|
|
52
|
+
}
|
|
53
|
+
const log = {
|
|
54
|
+
requestId,
|
|
55
|
+
timestamp: new Date().toISOString(),
|
|
56
|
+
stage: "http",
|
|
57
|
+
action: `${config.method || "GET"} ${config.url}`,
|
|
58
|
+
status: response.ok ? "success" : "error",
|
|
59
|
+
durationMs,
|
|
60
|
+
data: {
|
|
61
|
+
statusCode: response.status,
|
|
62
|
+
statusText: response.statusText,
|
|
63
|
+
contentType,
|
|
64
|
+
body,
|
|
65
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
await Effect.runPromise(Queue.offer(queue, log).pipe(Effect.tapError((error) => Effect.logError("Failed to enqueue HTTP log", error)), Effect.catchAll(() => Effect.void)));
|
|
69
|
+
}
|
|
70
|
+
catch (unknownError) {
|
|
71
|
+
const error = unknownError instanceof Error ? unknownError : new Error(String(unknownError));
|
|
72
|
+
const durationMs = Date.now() - startTime;
|
|
73
|
+
const log = {
|
|
74
|
+
requestId,
|
|
75
|
+
timestamp: new Date().toISOString(),
|
|
76
|
+
stage: "http",
|
|
77
|
+
action: `${config.method || "GET"} ${config.url}`,
|
|
78
|
+
status: "error",
|
|
79
|
+
durationMs,
|
|
80
|
+
error: {
|
|
81
|
+
tag: error.name || "HttpError",
|
|
82
|
+
message: error.message || String(error),
|
|
83
|
+
stack: error.stack,
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
await Effect.runPromise(Queue.offer(queue, log).pipe(Effect.tapError((enqueueError) => Effect.logError("Failed to enqueue HTTP error log", enqueueError)), Effect.catchAll(() => Effect.void)));
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
return {
|
|
90
|
+
start() {
|
|
91
|
+
return Effect.gen(function* () {
|
|
92
|
+
stopped = false;
|
|
93
|
+
queue = yield* Queue.bounded(1000);
|
|
94
|
+
// Initial poll
|
|
95
|
+
yield* Effect.promise(() => poll());
|
|
96
|
+
// Start polling loop
|
|
97
|
+
const interval = config.pollInterval ?? HTTP_DEFAULT_POLL_INTERVAL_MS;
|
|
98
|
+
pollTimer = setInterval(() => poll(), interval);
|
|
99
|
+
return createLogStreamFromQueue(queue);
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
stop() {
|
|
103
|
+
return Effect.gen(function* () {
|
|
104
|
+
stopped = true;
|
|
105
|
+
if (pollTimer) {
|
|
106
|
+
clearInterval(pollTimer);
|
|
107
|
+
pollTimer = null;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
/**
|
|
112
|
+
* Query historical logs.
|
|
113
|
+
*
|
|
114
|
+
* Note: HTTP backend is forward-only and does not maintain historical logs.
|
|
115
|
+
* This method always returns an empty array because HTTP polling only captures
|
|
116
|
+
* logs as they arrive in real-time. For querying historical logs, use a backend
|
|
117
|
+
* that supports log storage (e.g., Cloudflare Analytics Engine).
|
|
118
|
+
*/
|
|
119
|
+
query(_filter) {
|
|
120
|
+
return Effect.succeed([]);
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=http-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-backend.js","sourceRoot":"","sources":["../src/http-backend.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -28,10 +28,27 @@ export interface GateSpec {
|
|
|
28
28
|
observe: ObserveResource;
|
|
29
29
|
act: Action[];
|
|
30
30
|
assert: Assertion[];
|
|
31
|
+
/**
|
|
32
|
+
* Timeout configuration for log collection.
|
|
33
|
+
*
|
|
34
|
+
* - **idleMs**: If no logs arrive for this duration AND logs have been collected, return early.
|
|
35
|
+
* Default: 3000ms
|
|
36
|
+
* - **maxMs**: Maximum total time to wait for logs. If exceeded, gate fails with timeout.
|
|
37
|
+
* Default: 15000ms
|
|
38
|
+
*
|
|
39
|
+
* Examples:
|
|
40
|
+
* - `{ idleMs: 1000, maxMs: 5000 }`: Wait up to 5s total, but return early if idle > 1s with logs
|
|
41
|
+
* - `{ idleMs: 0, maxMs: 10000 }`: Wait full 10s, never return early on idle
|
|
42
|
+
*/
|
|
31
43
|
stop?: {
|
|
32
44
|
idleMs: number;
|
|
33
45
|
maxMs: number;
|
|
34
46
|
};
|
|
47
|
+
/**
|
|
48
|
+
* Maximum number of logs to collect before stopping.
|
|
49
|
+
* Defaults to 50_000.
|
|
50
|
+
*/
|
|
51
|
+
maxLogs?: number;
|
|
35
52
|
report?: "json" | "pretty";
|
|
36
53
|
}
|
|
37
54
|
export declare namespace Gate {
|
|
@@ -45,4 +62,5 @@ export type { ObserveResource } from "./observe";
|
|
|
45
62
|
export type { Provider } from "./provider";
|
|
46
63
|
export { createEmptyBackend, createEmptyObserveResource, runGateWithErrorHandling } from "./utils";
|
|
47
64
|
export { createTestObserveResource } from "./test-helpers";
|
|
65
|
+
export { createHttpObserveResource } from "./http-backend";
|
|
48
66
|
//# 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,MAAM,EAAwC,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAO,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAU,eAAe,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAwC,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAO,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAU,eAAe,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;;;;;;AAUxC,qBAAa,SAAU,SAAQ,cAE7B;CAAG;;;;;;;;AAEL,qBAAa,eAAgB,SAAQ,oBAOpC;CAAG;AAEJ,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,eAAe,GAAG,eAAe,GAAG,wBAAwB,GAAG,kBAAkB,CAAC;AAE1H,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,eAAe,CAAC;IACzB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC5B;AA8ID,yBAAiB,IAAI,CAAC;IACpB,SAAgB,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAEvD;IAED,SAAgB,SAAS,CACvB,IAAI,EAAE,QAAQ,GACb,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,CAiGvD;CACF;AAqBD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@ import { Effect, Ref, Either, Stream } from "effect";
|
|
|
2
2
|
import { Assert } from "./assert";
|
|
3
3
|
import { Schema } from "@effect/schema";
|
|
4
4
|
import { getActionExecutor } from "./action-executors";
|
|
5
|
+
import { DEFAULT_IDLE_MS, DEFAULT_MAX_MS, MAX_LOG_BUFFER, LOG_BUFFER_CAPACITY } from "./constants";
|
|
5
6
|
export class GateError extends Schema.TaggedError()("GateError", {
|
|
6
7
|
cause: Schema.Unknown
|
|
7
8
|
}) {
|
|
@@ -34,45 +35,79 @@ function summarize(logs) {
|
|
|
34
35
|
errorTags: [...errorTags]
|
|
35
36
|
};
|
|
36
37
|
}
|
|
38
|
+
function makeLogTimeoutError(stop, cause) {
|
|
39
|
+
return new LogTimeoutError({
|
|
40
|
+
maxMs: stop.maxMs,
|
|
41
|
+
idleMs: stop.idleMs,
|
|
42
|
+
cause
|
|
43
|
+
});
|
|
44
|
+
}
|
|
37
45
|
function runAction(action) {
|
|
38
46
|
const executor = getActionExecutor(action);
|
|
39
47
|
return executor.execute(action);
|
|
40
48
|
}
|
|
41
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Collects logs from a stream with timeout and idle detection.
|
|
51
|
+
*
|
|
52
|
+
* Behavior:
|
|
53
|
+
* - **maxMs**: Maximum total time to wait for logs. If exceeded, returns LogTimeoutError.
|
|
54
|
+
* - **idleMs**: If no logs arrive for this duration, return early (with collected logs if any, or empty array if none).
|
|
55
|
+
*
|
|
56
|
+
* Examples:
|
|
57
|
+
* - Stream produces logs continuously: collects until maxLogs or maxMs exceeded
|
|
58
|
+
* - Stream stops producing logs: if idleMs elapsed and we have logs, return them
|
|
59
|
+
* - Stream never produces logs: waits for idleMs then returns empty array if maxMs not exceeded, otherwise timeout error
|
|
60
|
+
* - Stream error: preserved in LogTimeoutError.cause
|
|
61
|
+
*/
|
|
62
|
+
function collectLogs(stream, stop, maxLogs) {
|
|
42
63
|
const startTime = Date.now();
|
|
43
64
|
const lastLogTimeRef = Ref.unsafeMake(Date.now());
|
|
44
65
|
return Effect.gen(function* () {
|
|
45
66
|
const logStream = Stream.fromAsyncIterable(stream, () => Effect.void);
|
|
46
|
-
const collected = yield* logStream.pipe(Stream.tap(() => Ref.set(lastLogTimeRef, Date.now())), Stream.take(
|
|
67
|
+
const collected = yield* logStream.pipe(Stream.tap(() => Ref.set(lastLogTimeRef, Date.now())), Stream.take(maxLogs), Stream.buffer({ capacity: LOG_BUFFER_CAPACITY }), Stream.timeout(`${stop.maxMs} millis`), Stream.runCollect, Effect.catchAll((error) => Effect.gen(function* () {
|
|
68
|
+
// Stream-level timeout
|
|
47
69
|
if (error && typeof error === "object" && "_tag" in error && error._tag === "TimeoutException") {
|
|
48
|
-
return Effect.fail(
|
|
70
|
+
return yield* Effect.fail(makeLogTimeoutError(stop, error));
|
|
49
71
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
});
|
|
59
|
-
}));
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
const totalTime = now - startTime;
|
|
74
|
+
if (totalTime > stop.maxMs) {
|
|
75
|
+
return yield* Effect.fail(makeLogTimeoutError(stop, error));
|
|
76
|
+
}
|
|
77
|
+
// Non-timeout stream error before maxMs elapsed – surface as timeout with cause
|
|
78
|
+
return yield* Effect.fail(makeLogTimeoutError(stop, error));
|
|
79
|
+
})));
|
|
60
80
|
const now = Date.now();
|
|
61
81
|
const lastLogTime = yield* Ref.get(lastLogTimeRef);
|
|
62
82
|
const idleTime = now - lastLogTime;
|
|
63
83
|
const totalTime = now - startTime;
|
|
64
84
|
if (totalTime > stop.maxMs) {
|
|
65
|
-
return yield* Effect.fail(
|
|
85
|
+
return yield* Effect.fail(makeLogTimeoutError(stop));
|
|
66
86
|
}
|
|
87
|
+
// If we have logs and have been idle longer than idleMs, return what we have.
|
|
67
88
|
if (idleTime > stop.idleMs && collected.length > 0) {
|
|
68
89
|
return Array.from(collected);
|
|
69
90
|
}
|
|
91
|
+
// If we have any logs at all, return them.
|
|
70
92
|
if (collected.length > 0) {
|
|
71
93
|
return Array.from(collected);
|
|
72
94
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
95
|
+
// No logs collected yet. Wait for idleMs before giving up, unless maxMs would be exceeded.
|
|
96
|
+
if (idleTime < stop.idleMs) {
|
|
97
|
+
const remainingIdle = stop.idleMs - idleTime;
|
|
98
|
+
const remainingMax = stop.maxMs - totalTime;
|
|
99
|
+
const waitTime = Math.min(remainingIdle, remainingMax);
|
|
100
|
+
if (waitTime > 0) {
|
|
101
|
+
yield* Effect.sleep(`${waitTime} millis`);
|
|
102
|
+
// After waiting, check if maxMs is now exceeded
|
|
103
|
+
const afterWaitTime = Date.now() - startTime;
|
|
104
|
+
if (afterWaitTime > stop.maxMs) {
|
|
105
|
+
return yield* Effect.fail(makeLogTimeoutError(stop));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// No logs collected after waiting – return empty array.
|
|
110
|
+
return [];
|
|
76
111
|
});
|
|
77
112
|
}
|
|
78
113
|
function handleGateError(error, startedAt, logs) {
|
|
@@ -94,7 +129,8 @@ export var Gate;
|
|
|
94
129
|
function runEffect(spec) {
|
|
95
130
|
return Effect.acquireUseRelease(spec.observe.start().pipe(Effect.catchAll((error) => Effect.fail(new GateError({ cause: error })))), (stream) => Effect.gen(function* () {
|
|
96
131
|
const startedAt = Date.now();
|
|
97
|
-
const stop = spec.stop ?? { idleMs:
|
|
132
|
+
const stop = spec.stop ?? { idleMs: DEFAULT_IDLE_MS, maxMs: DEFAULT_MAX_MS };
|
|
133
|
+
const maxLogs = spec.maxLogs ?? MAX_LOG_BUFFER;
|
|
98
134
|
yield* Effect.sleep("200 millis");
|
|
99
135
|
let actionError = null;
|
|
100
136
|
for (const action of spec.act) {
|
|
@@ -108,7 +144,7 @@ export var Gate;
|
|
|
108
144
|
if (Either.isLeft(actionResult)) {
|
|
109
145
|
return handleGateError(actionResult.left, startedAt, []);
|
|
110
146
|
}
|
|
111
|
-
const logsResult = yield* collectLogs(stream, stop).pipe(Effect.timeoutFail({
|
|
147
|
+
const logsResult = yield* collectLogs(stream, stop, maxLogs).pipe(Effect.timeoutFail({
|
|
112
148
|
duration: `${stop.maxMs} millis`,
|
|
113
149
|
onTimeout: () => new LogTimeoutError({ maxMs: stop.maxMs, idleMs: stop.idleMs })
|
|
114
150
|
}), Effect.catchTag("LogTimeoutError", (error) => Effect.succeed({
|
|
@@ -118,30 +154,36 @@ export var Gate;
|
|
|
118
154
|
evidence: summarize([]),
|
|
119
155
|
error: error instanceof Error ? error : new Error(String(error))
|
|
120
156
|
})), Effect.either);
|
|
121
|
-
if (Either.isRight(logsResult)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
157
|
+
if (Either.isRight(logsResult)) {
|
|
158
|
+
const right = logsResult.right;
|
|
159
|
+
// Right side can be either collected logs or a pre-built timeout GateResult
|
|
160
|
+
if (Array.isArray(right)) {
|
|
161
|
+
const logs = right;
|
|
162
|
+
const assertResult = yield* Assert.run(spec.assert, logs).pipe(Effect.either);
|
|
163
|
+
const evidence = summarize(logs);
|
|
164
|
+
const durationMs = Date.now() - startedAt;
|
|
165
|
+
if (Either.isLeft(assertResult)) {
|
|
166
|
+
const result = handleGateError(assertResult.left, startedAt, logs);
|
|
167
|
+
printResult(spec.report, result);
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
const result = {
|
|
171
|
+
status: "success",
|
|
172
|
+
durationMs,
|
|
173
|
+
logs,
|
|
174
|
+
evidence
|
|
175
|
+
};
|
|
176
|
+
printResult(spec.report, result);
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
// Timeout case already mapped into a GateResult above
|
|
180
|
+
return right;
|
|
135
181
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
};
|
|
142
|
-
printResult(spec.report, result);
|
|
143
|
-
return result;
|
|
144
|
-
}), () => spec.observe.stop().pipe(Effect.catchAll(() => Effect.void)));
|
|
182
|
+
// Left side is a LogTimeoutError or other gate error
|
|
183
|
+
return handleGateError(logsResult.left, startedAt, []);
|
|
184
|
+
}), () => spec.observe
|
|
185
|
+
.stop()
|
|
186
|
+
.pipe(Effect.tapError((error) => Effect.logError("Failed to stop observe resource", error)), Effect.catchAll(() => Effect.void)));
|
|
145
187
|
}
|
|
146
188
|
Gate.runEffect = runEffect;
|
|
147
189
|
})(Gate || (Gate = {}));
|
|
@@ -152,8 +194,9 @@ function printResult(report, result) {
|
|
|
152
194
|
if (result.evidence.errorTags.length) {
|
|
153
195
|
console.log(`errorTags=${result.evidence.errorTags.join(",")}`);
|
|
154
196
|
}
|
|
155
|
-
if (result.status !== "success") {
|
|
156
|
-
const
|
|
197
|
+
if (result.status !== "success" && result.error) {
|
|
198
|
+
const errorWithTag = result.error;
|
|
199
|
+
const errorTag = errorWithTag._tag ?? "unknown";
|
|
157
200
|
console.log(`error=${errorTag}`);
|
|
158
201
|
}
|
|
159
202
|
}
|
|
@@ -165,4 +208,5 @@ export { Act } from "./act";
|
|
|
165
208
|
export { Assert } from "./assert";
|
|
166
209
|
export { createEmptyBackend, createEmptyObserveResource, runGateWithErrorHandling } from "./utils";
|
|
167
210
|
export { createTestObserveResource } from "./test-helpers";
|
|
211
|
+
export { createHttpObserveResource } from "./http-backend";
|
|
168
212
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAS,GAAG,EAAE,MAAM,EAAY,MAAM,EAAS,MAAM,QAAQ,CAAC;AAK7E,OAAO,EAAE,MAAM,EAA6C,MAAM,UAAU,CAAC;AAE7E,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/observe.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../src/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAmB,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;;;;;;;;
|
|
1
|
+
{"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../src/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAmB,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;;;;;;;;AAOxC,qBAAa,kBAAmB,SAAQ,uBAOvC;CAAG;AAEJ,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAO3E;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACtD,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAChD,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACtD,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;CACjD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAsBvE;AAkBD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GACtB,SAAS,CAqCX"}
|
package/dist/observe.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Effect, Queue, Runtime, Stream } from "effect";
|
|
2
2
|
import { Schema } from "@effect/schema";
|
|
3
|
+
import { QUEUE_DRAIN_LIMIT, QUEUE_DRAIN_TIMEOUT_MS, QUEUE_TAKE_TIMEOUT_MS } from "./constants";
|
|
3
4
|
export class ObservabilityError extends Schema.TaggedError()("ObservabilityError", {
|
|
4
5
|
cause: Schema.Unknown,
|
|
5
6
|
message: Schema.optional(Schema.String),
|
|
@@ -54,7 +55,7 @@ export function createLogStreamFromQueue(queue) {
|
|
|
54
55
|
async *[Symbol.asyncIterator]() {
|
|
55
56
|
try {
|
|
56
57
|
while (true) {
|
|
57
|
-
const log = await Runtime.runPromise(runtime)(Queue.take(queue).pipe(Effect.timeout(
|
|
58
|
+
const log = await Runtime.runPromise(runtime)(Queue.take(queue).pipe(Effect.timeout(`${QUEUE_TAKE_TIMEOUT_MS} millis`), Effect.catchAll(() => Effect.succeed(null))));
|
|
58
59
|
if (log === null)
|
|
59
60
|
break;
|
|
60
61
|
yield log;
|
|
@@ -63,8 +64,8 @@ export function createLogStreamFromQueue(queue) {
|
|
|
63
64
|
finally {
|
|
64
65
|
const remaining = [];
|
|
65
66
|
try {
|
|
66
|
-
for (let i = 0; i <
|
|
67
|
-
const log = await Runtime.runPromise(runtime)(Queue.take(queue).pipe(Effect.timeout(
|
|
67
|
+
for (let i = 0; i < QUEUE_DRAIN_LIMIT; i++) {
|
|
68
|
+
const log = await Runtime.runPromise(runtime)(Queue.take(queue).pipe(Effect.timeout(`${QUEUE_DRAIN_TIMEOUT_MS} millis`), Effect.catchAll(() => Effect.succeed(null))));
|
|
68
69
|
if (log === null)
|
|
69
70
|
break;
|
|
70
71
|
remaining.push(log);
|
package/dist/observe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../src/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../src/observe.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAQ,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAyB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAQ,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAyB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAGhE;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAU5C;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,wCAEzC;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CAcrB"}
|
package/dist/utils.js
CHANGED
|
@@ -34,8 +34,9 @@ export async function runGateWithErrorHandling(gate, name) {
|
|
|
34
34
|
try {
|
|
35
35
|
return await Gate.run(gate);
|
|
36
36
|
}
|
|
37
|
-
catch (
|
|
38
|
-
|
|
37
|
+
catch (unknownError) {
|
|
38
|
+
const error = unknownError instanceof Error ? unknownError : new Error(String(unknownError));
|
|
39
|
+
console.error(` ❌ Error: ${error.message}`);
|
|
39
40
|
return {
|
|
40
41
|
status: "failed",
|
|
41
42
|
durationMs: 0,
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,IAAI,EAAkC,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAgB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,IAAI,EAAkC,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAgB,MAAM,WAAW,CAAC;AAGhE;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CACV,MAAM,CAAC,OAAO,CAAqB;YACnC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;gBAC3B,OAAO;YACT,CAAC;SACF,CAAC;QACF,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;KACxB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,qBAAqB,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAc,EACd,IAAY;IAEZ,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,YAAY,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,YAAY,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7F,OAAO,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,OAAO;YACL,MAAM,EAAE,QAAiB;YACzB,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;YAC5E,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACjE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/validation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAQjF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAUzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAQjF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAUzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAgBjF"}
|
package/dist/validation.js
CHANGED
|
@@ -25,9 +25,13 @@ export function validateCommand(command) {
|
|
|
25
25
|
if (!command || typeof command !== "string") {
|
|
26
26
|
return Effect.fail(new GateError({ cause: new Error("Command must be a non-empty string") }));
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
// Extremely strict shell safety: block common shell metacharacters and expansion patterns
|
|
29
|
+
const dangerous = /[;&|`$(){}[\]<>\\'"\n\r\t]/;
|
|
30
|
+
const envExpansion = /\$\w+|\$\{[^}]+\}/;
|
|
31
|
+
if (dangerous.test(command) || envExpansion.test(command)) {
|
|
32
|
+
return Effect.fail(new GateError({
|
|
33
|
+
cause: new Error("Command contains potentially dangerous shell characters")
|
|
34
|
+
}));
|
|
31
35
|
}
|
|
32
36
|
return Effect.succeed(command);
|
|
33
37
|
}
|
package/dist/validation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,wCAAwC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,qCAAqC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,wCAAwC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,qCAAqC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,0FAA0F;IAC1F,MAAM,SAAS,GACb,4BAA4B,CAAC;IAC/B,MAAM,YAAY,GAAG,mBAAmB,CAAC;IACzC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,IAAI,CAChB,IAAI,SAAS,CAAC;YACZ,KAAK,EAAE,IAAI,KAAK,CAAC,yDAAyD,CAAC;SAC5E,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gateproof",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "E2E testing harness. Observe logs, run actions, assert results.",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -32,9 +32,12 @@
|
|
|
32
32
|
"pattern:cloudflare": "bun run patterns/cloudflare/*.ts",
|
|
33
33
|
"gate:production": "bun run gates/production/smoke.gate.ts",
|
|
34
34
|
"gate:local": "bun run gates/local/demo.gate.ts",
|
|
35
|
-
"gate:
|
|
35
|
+
"gate:framework": "bun run gates/framework/integrity.gate.ts",
|
|
36
|
+
"gate:demo": "bun run gates/demo/development.gate.ts",
|
|
37
|
+
"gate:dev": "bun run gate:framework && bun run gate:demo && bun run gate:local",
|
|
38
|
+
"gate:all": "bun run gate:dev && bun run gate:production",
|
|
36
39
|
"demo:gate": "bun run gate:production",
|
|
37
|
-
"prepush": "bun run
|
|
40
|
+
"prepush": "bun run gate:dev",
|
|
38
41
|
"prepublishOnly": "bun run build && bun test"
|
|
39
42
|
},
|
|
40
43
|
"keywords": [
|