brass-runtime 1.15.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +409 -137
- package/dist/agent/cli/main.cjs +40 -35
- package/dist/agent/cli/main.js +9 -4
- package/dist/agent/cli/main.mjs +9 -4
- package/dist/agent/index.cjs +8 -4
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.js +7 -3
- package/dist/agent/index.mjs +7 -3
- package/dist/{chunk-PPUXIH5R.js → chunk-2WC63LJK.mjs} +11 -7
- package/dist/chunk-3RG5ZIWI.js +10 -0
- package/dist/chunk-45F7OKGT.cjs +104 -0
- package/dist/chunk-5YOQOXEQ.cjs +2491 -0
- package/dist/{chunk-STVLQ3XD.cjs → chunk-7HUOJA4W.cjs} +78 -74
- package/dist/{chunk-BMH5AV44.js → chunk-7LVI2GIN.js} +251 -370
- package/dist/chunk-7TL2LHQJ.js +2491 -0
- package/dist/chunk-7V4KY4RL.mjs +104 -0
- package/dist/chunk-7XOPAB5Q.js +2143 -0
- package/dist/chunk-CCKHV5BT.mjs +193 -0
- package/dist/{chunk-AR22SXML.js → chunk-CY33PGEX.mjs} +488 -421
- package/dist/chunk-DJQ7OMMB.cjs +144 -0
- package/dist/chunk-F5EUMJL7.mjs +2143 -0
- package/dist/chunk-FM4W4QPL.js +193 -0
- package/dist/{chunk-TO7IKXYT.js → chunk-G3XGCZDQ.js} +1 -1
- package/dist/{chunk-BDF4AMWX.mjs → chunk-G6IQOE4P.mjs} +251 -370
- package/dist/chunk-GOV47PPB.mjs +552 -0
- package/dist/chunk-H55LI6WY.js +93 -0
- package/dist/chunk-IJT6RRQ5.cjs +93 -0
- package/dist/{chunk-ELOOF35R.mjs → chunk-J3H54ZRV.mjs} +1 -1
- package/dist/chunk-JF4XXPZ5.cjs +552 -0
- package/dist/chunk-JNFRRJYH.cjs +2143 -0
- package/dist/chunk-JX3LZQJH.cjs +354 -0
- package/dist/chunk-K2T3DV26.mjs +93 -0
- package/dist/chunk-KCPT2D6G.js +552 -0
- package/dist/chunk-MWXMNYJS.cjs +1110 -0
- package/dist/{chunk-VEZNF5GZ.cjs → chunk-N6VHMOWB.cjs} +130 -126
- package/dist/{chunk-3QMOKAS5.js → chunk-NC5SDRYE.js} +9 -5
- package/dist/chunk-NOYZIMUJ.mjs +144 -0
- package/dist/{chunk-R3R2FVLG.cjs → chunk-NYL4D7SK.cjs} +5 -5
- package/dist/chunk-OBGZSXTJ.cjs +10 -0
- package/dist/{chunk-4NHES7VK.mjs → chunk-OOGJ73B6.js} +11 -7
- package/dist/chunk-PNVFW245.js +144 -0
- package/dist/chunk-PRWCB3QL.mjs +2491 -0
- package/dist/{chunk-JFPU5GQI.mjs → chunk-QY5FKYEQ.js} +488 -421
- package/dist/chunk-ROJC3NBJ.js +104 -0
- package/dist/chunk-SPUEME2B.cjs +343 -0
- package/dist/chunk-TDVMADDN.js +343 -0
- package/dist/chunk-TVN5I4U6.cjs +193 -0
- package/dist/chunk-U5KWK3PX.mjs +343 -0
- package/dist/chunk-VFIUZG7J.mjs +354 -0
- package/dist/{chunk-TGIFUAK4.cjs → chunk-WQ5QNU5R.cjs} +459 -578
- package/dist/chunk-XDZOO4L5.js +354 -0
- package/dist/chunk-Y6FXYEAI.mjs +10 -0
- package/dist/{chunk-K6M7MDZ4.mjs → chunk-ZGLD4TVZ.mjs} +9 -5
- package/dist/client-CtFmoDvM.d.ts +645 -0
- package/dist/core/index.cjs +72 -4
- package/dist/core/index.d.ts +92 -198
- package/dist/core/index.js +106 -38
- package/dist/core/index.mjs +106 -38
- package/dist/{effect-CMOQKX8y.d.ts → effect-CGNl5Rqp.d.ts} +107 -1
- package/dist/effectRunner-3ZHAD3LE.cjs +8 -0
- package/dist/effectRunner-A4CHJXJI.js +8 -0
- package/dist/effectRunner-OPUF6QRN.mjs +8 -0
- package/dist/http/index.cjs +2189 -1271
- package/dist/http/index.d.ts +830 -270
- package/dist/http/index.js +2008 -1090
- package/dist/http/index.mjs +2008 -1090
- package/dist/http/testing.cjs +159 -0
- package/dist/http/testing.d.ts +42 -0
- package/dist/http/testing.js +159 -0
- package/dist/http/testing.mjs +159 -0
- package/dist/index.cjs +246 -178
- package/dist/index.d.ts +9 -35
- package/dist/index.js +120 -52
- package/dist/index.mjs +120 -52
- package/dist/observability/index.cjs +677 -0
- package/dist/observability/index.d.ts +79 -0
- package/dist/observability/index.js +677 -0
- package/dist/observability/index.mjs +677 -0
- package/dist/schedule-Fque9Abz.d.ts +70 -0
- package/dist/schema/index.cjs +25 -0
- package/dist/schema/index.d.ts +177 -0
- package/dist/schema/index.js +25 -0
- package/dist/schema/index.mjs +25 -0
- package/dist/server-C8hDXA74.d.ts +674 -0
- package/dist/{stream-FQm9h4Mg.d.ts → stream-dvSs0QS5.d.ts} +1 -1
- package/dist/tracer-B5tRH9H7.d.ts +230 -0
- package/dist/tracing-Dt9S_6V8.d.ts +148 -0
- package/package.json +27 -1
- package/dist/chunk-BDYEENHT.js +0 -224
- package/dist/chunk-MS34J5LY.cjs +0 -224
- package/dist/chunk-UMAZLXAB.mjs +0 -224
- package/dist/chunk-XPZNXSVN.cjs +0 -1043
- package/dist/tracing-DNT9jEbr.d.ts +0 -106
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
var _chunkDJQ7OMMBcjs = require('./chunk-DJQ7OMMB.cjs');
|
|
4
|
+
|
|
5
|
+
// src/http/effectRunner.ts
|
|
6
|
+
function registerHttpEffect(effect, env, cb) {
|
|
7
|
+
let done = false;
|
|
8
|
+
let currentCancel;
|
|
9
|
+
const finish = (exit) => {
|
|
10
|
+
if (done) return;
|
|
11
|
+
done = true;
|
|
12
|
+
currentCancel = void 0;
|
|
13
|
+
cb(exit);
|
|
14
|
+
};
|
|
15
|
+
const run = (current, cont) => {
|
|
16
|
+
if (done) return;
|
|
17
|
+
switch (current._tag) {
|
|
18
|
+
case "Succeed":
|
|
19
|
+
cont({ _tag: "Success", value: current.value });
|
|
20
|
+
return;
|
|
21
|
+
case "Fail":
|
|
22
|
+
cont({ _tag: "Failure", cause: _chunkDJQ7OMMBcjs.Cause.fail(current.error) });
|
|
23
|
+
return;
|
|
24
|
+
case "Sync":
|
|
25
|
+
try {
|
|
26
|
+
cont({ _tag: "Success", value: current.thunk(env) });
|
|
27
|
+
} catch (e) {
|
|
28
|
+
cont({ _tag: "Failure", cause: _chunkDJQ7OMMBcjs.Cause.die(e) });
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
case "Async": {
|
|
32
|
+
const cancel = current.register(env, (exit) => {
|
|
33
|
+
currentCancel = void 0;
|
|
34
|
+
if (done) return;
|
|
35
|
+
cont(exit);
|
|
36
|
+
});
|
|
37
|
+
currentCancel = typeof cancel === "function" ? cancel : void 0;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
case "FlatMap":
|
|
41
|
+
run(current.first, (exit) => {
|
|
42
|
+
if (done) return;
|
|
43
|
+
if (exit._tag === "Failure") {
|
|
44
|
+
cont(exit);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
run(current.andThen(exit.value), cont);
|
|
49
|
+
} catch (e) {
|
|
50
|
+
cont({ _tag: "Failure", cause: _chunkDJQ7OMMBcjs.Cause.die(e) });
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
case "Fold":
|
|
55
|
+
run(current.first, (exit) => {
|
|
56
|
+
if (done) return;
|
|
57
|
+
try {
|
|
58
|
+
if (exit._tag === "Success") {
|
|
59
|
+
run(current.onSuccess(exit.value), cont);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (exit.cause._tag === "Fail") {
|
|
63
|
+
run(current.onFailure(exit.cause.error), cont);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
cont(exit);
|
|
67
|
+
} catch (e) {
|
|
68
|
+
cont({ _tag: "Failure", cause: _chunkDJQ7OMMBcjs.Cause.die(e) });
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return;
|
|
72
|
+
case "Fork":
|
|
73
|
+
cont({ _tag: "Success", value: void 0 });
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
run(effect, finish);
|
|
78
|
+
return () => {
|
|
79
|
+
if (done) return;
|
|
80
|
+
const cancel = currentCancel;
|
|
81
|
+
currentCancel = void 0;
|
|
82
|
+
done = true;
|
|
83
|
+
try {
|
|
84
|
+
_optionalChain([cancel, 'optionalCall', _ => _()]);
|
|
85
|
+
} finally {
|
|
86
|
+
cb({ _tag: "Failure", cause: _chunkDJQ7OMMBcjs.Cause.interrupt() });
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
exports.registerHttpEffect = registerHttpEffect;
|
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
var _chunk45F7OKGTcjs = require('./chunk-45F7OKGT.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkTVN5I4U6cjs = require('./chunk-TVN5I4U6.cjs');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunkWQ5QNU5Rcjs = require('./chunk-WQ5QNU5R.cjs');
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
var _chunkDJQ7OMMBcjs = require('./chunk-DJQ7OMMB.cjs');
|
|
20
|
+
|
|
21
|
+
// src/core/runtime/resource.ts
|
|
22
|
+
function bracket(acquire, use, release) {
|
|
23
|
+
return _chunkDJQ7OMMBcjs.asyncEffect.call(void 0, (env, cb) => {
|
|
24
|
+
const runtime = _chunkWQ5QNU5Rcjs.unsafeGetCurrentRuntime.call(void 0, );
|
|
25
|
+
const scope = new (0, _chunkTVN5I4U6cjs.Scope)(runtime);
|
|
26
|
+
const acquireFiber = scope.fork(acquire);
|
|
27
|
+
acquireFiber.join((acquireExit) => {
|
|
28
|
+
if (acquireExit._tag === "Failure") {
|
|
29
|
+
scope.close(acquireExit);
|
|
30
|
+
cb(acquireExit);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const resource2 = acquireExit.value;
|
|
34
|
+
const useFiber = scope.fork(use(resource2));
|
|
35
|
+
useFiber.join((useExit) => {
|
|
36
|
+
const releaseEffect = safeRelease(release, resource2, useExit);
|
|
37
|
+
const releaseFiber = runtime.fork(releaseEffect);
|
|
38
|
+
releaseFiber.join(() => {
|
|
39
|
+
scope.close(useExit);
|
|
40
|
+
cb(useExit);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
return () => {
|
|
45
|
+
scope.close(_chunkDJQ7OMMBcjs.Exit.failCause(_chunkDJQ7OMMBcjs.Cause.interrupt()));
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function safeRelease(release, resource2, exit) {
|
|
50
|
+
return _chunkDJQ7OMMBcjs.asyncFold.call(void 0,
|
|
51
|
+
(() => {
|
|
52
|
+
try {
|
|
53
|
+
return release(resource2, exit);
|
|
54
|
+
} catch (e) {
|
|
55
|
+
return _chunkDJQ7OMMBcjs.unit.call(void 0, );
|
|
56
|
+
}
|
|
57
|
+
})(),
|
|
58
|
+
() => _chunkDJQ7OMMBcjs.unit.call(void 0, ),
|
|
59
|
+
() => _chunkDJQ7OMMBcjs.unit.call(void 0, )
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
function ensuring(effect, finalizer) {
|
|
63
|
+
return _chunkDJQ7OMMBcjs.asyncEffect.call(void 0, (env, cb) => {
|
|
64
|
+
const runtime = _chunkWQ5QNU5Rcjs.unsafeGetCurrentRuntime.call(void 0, );
|
|
65
|
+
const fiber = runtime.fork(effect);
|
|
66
|
+
fiber.join((exit) => {
|
|
67
|
+
const fin = _chunkDJQ7OMMBcjs.asyncFold.call(void 0,
|
|
68
|
+
(() => {
|
|
69
|
+
try {
|
|
70
|
+
return finalizer(exit);
|
|
71
|
+
} catch (e2) {
|
|
72
|
+
return _chunkDJQ7OMMBcjs.unit.call(void 0, );
|
|
73
|
+
}
|
|
74
|
+
})(),
|
|
75
|
+
() => _chunkDJQ7OMMBcjs.unit.call(void 0, ),
|
|
76
|
+
() => _chunkDJQ7OMMBcjs.unit.call(void 0, )
|
|
77
|
+
);
|
|
78
|
+
runtime.fork(fin).join(() => {
|
|
79
|
+
cb(exit);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
return () => {
|
|
83
|
+
fiber.interrupt();
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function resource(acquire, release) {
|
|
88
|
+
return makeResourceFromUse((body) => bracket(acquire, body, release));
|
|
89
|
+
}
|
|
90
|
+
var makeResource = resource;
|
|
91
|
+
function resourceSucceed(value) {
|
|
92
|
+
return makeResourceFromUse((body) => body(value));
|
|
93
|
+
}
|
|
94
|
+
function resourceFromManaged(m) {
|
|
95
|
+
return makeResourceFromUse((body) => useManaged(m, body));
|
|
96
|
+
}
|
|
97
|
+
function useResource(res, body) {
|
|
98
|
+
return res.use(body);
|
|
99
|
+
}
|
|
100
|
+
function resourceAll(resources) {
|
|
101
|
+
const build = (index) => {
|
|
102
|
+
if (index >= resources.length) return resourceSucceed([]);
|
|
103
|
+
return resources[index].flatMap(
|
|
104
|
+
(head) => build(index + 1).map((tail) => [head, ...tail])
|
|
105
|
+
);
|
|
106
|
+
};
|
|
107
|
+
return build(0).map((values) => values);
|
|
108
|
+
}
|
|
109
|
+
var Resource = Object.freeze({
|
|
110
|
+
make: resource,
|
|
111
|
+
succeed: resourceSucceed,
|
|
112
|
+
fromManaged: resourceFromManaged,
|
|
113
|
+
all: resourceAll,
|
|
114
|
+
use: useResource
|
|
115
|
+
});
|
|
116
|
+
function makeResourceFromUse(use) {
|
|
117
|
+
const self = {
|
|
118
|
+
_tag: "Resource",
|
|
119
|
+
use,
|
|
120
|
+
map: (f) => makeResourceFromUse((body) => self.use((a) => body(f(a)))),
|
|
121
|
+
flatMap: (f) => makeResourceFromUse((body) => self.use((a) => f(a).use(body))),
|
|
122
|
+
zip: (that) => self.flatMap((a) => that.map((b) => [a, b]))
|
|
123
|
+
};
|
|
124
|
+
return self;
|
|
125
|
+
}
|
|
126
|
+
function managed(acquire, release) {
|
|
127
|
+
return {
|
|
128
|
+
_tag: "Managed",
|
|
129
|
+
acquire,
|
|
130
|
+
release: (resource2, exit) => release(resource2, exit)
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function useManaged(m, body) {
|
|
134
|
+
return bracket(m.acquire, body, m.release);
|
|
135
|
+
}
|
|
136
|
+
function managedAll(manageds) {
|
|
137
|
+
const acquire = _chunkDJQ7OMMBcjs.asyncEffect.call(void 0, (env, cb) => {
|
|
138
|
+
const runtime = _chunkWQ5QNU5Rcjs.unsafeGetCurrentRuntime.call(void 0, );
|
|
139
|
+
const resources = [];
|
|
140
|
+
let i = 0;
|
|
141
|
+
const acquireNext = () => {
|
|
142
|
+
if (i >= manageds.length) {
|
|
143
|
+
cb({ _tag: "Success", value: resources });
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const m = manageds[i];
|
|
147
|
+
const fiber = runtime.fork(m.acquire);
|
|
148
|
+
fiber.join((exit) => {
|
|
149
|
+
if (exit._tag === "Failure") {
|
|
150
|
+
releaseAcquired(runtime, manageds, resources, exit).then(() => {
|
|
151
|
+
cb(exit);
|
|
152
|
+
});
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
resources.push(exit.value);
|
|
156
|
+
i++;
|
|
157
|
+
acquireNext();
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
acquireNext();
|
|
161
|
+
});
|
|
162
|
+
const release = (resources, exit) => {
|
|
163
|
+
return _chunkDJQ7OMMBcjs.asyncEffect.call(void 0, (_env, cb) => {
|
|
164
|
+
const runtime = _chunkWQ5QNU5Rcjs.unsafeGetCurrentRuntime.call(void 0, );
|
|
165
|
+
releaseAcquired(runtime, manageds, resources, exit).then(() => {
|
|
166
|
+
cb({ _tag: "Success", value: void 0 });
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
return { _tag: "Managed", acquire, release };
|
|
171
|
+
}
|
|
172
|
+
async function releaseAcquired(runtime, manageds, resources, exit) {
|
|
173
|
+
for (let i = resources.length - 1; i >= 0; i--) {
|
|
174
|
+
try {
|
|
175
|
+
const m = manageds[i];
|
|
176
|
+
await new Promise((resolve) => {
|
|
177
|
+
const releaseEff = _chunkDJQ7OMMBcjs.asyncFold.call(void 0,
|
|
178
|
+
m.release(resources[i], exit),
|
|
179
|
+
() => _chunkDJQ7OMMBcjs.unit.call(void 0, ),
|
|
180
|
+
() => _chunkDJQ7OMMBcjs.unit.call(void 0, )
|
|
181
|
+
);
|
|
182
|
+
runtime.fork(releaseEff).join(() => resolve());
|
|
183
|
+
});
|
|
184
|
+
} catch (e3) {
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// src/core/runtime/circuitBreaker.ts
|
|
190
|
+
function makeCircuitBreaker(config = {}) {
|
|
191
|
+
const failureThreshold = _nullishCoalesce(config.failureThreshold, () => ( 5));
|
|
192
|
+
const resetTimeoutMs = _nullishCoalesce(config.resetTimeoutMs, () => ( 3e4));
|
|
193
|
+
const successThreshold = _nullishCoalesce(config.successThreshold, () => ( 1));
|
|
194
|
+
const isFailure = _nullishCoalesce(config.isFailure, () => ( (() => true)));
|
|
195
|
+
const onStateChange = config.onStateChange;
|
|
196
|
+
let currentState = "closed";
|
|
197
|
+
let consecutiveFailures = 0;
|
|
198
|
+
let consecutiveSuccesses = 0;
|
|
199
|
+
let openedAt = 0;
|
|
200
|
+
let totalRequests = 0;
|
|
201
|
+
let totalFailures = 0;
|
|
202
|
+
let totalSuccesses = 0;
|
|
203
|
+
let totalRejected = 0;
|
|
204
|
+
let lastFailureTime = null;
|
|
205
|
+
let lastSuccessTime = null;
|
|
206
|
+
const transition = (to) => {
|
|
207
|
+
if (currentState === to) return;
|
|
208
|
+
const from = currentState;
|
|
209
|
+
currentState = to;
|
|
210
|
+
_optionalChain([onStateChange, 'optionalCall', _ => _(from, to)]);
|
|
211
|
+
};
|
|
212
|
+
const onSuccess = () => {
|
|
213
|
+
totalSuccesses++;
|
|
214
|
+
lastSuccessTime = Date.now();
|
|
215
|
+
consecutiveFailures = 0;
|
|
216
|
+
if (currentState === "half-open") {
|
|
217
|
+
consecutiveSuccesses++;
|
|
218
|
+
if (consecutiveSuccesses >= successThreshold) {
|
|
219
|
+
consecutiveSuccesses = 0;
|
|
220
|
+
transition("closed");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
const onFailure = (error) => {
|
|
225
|
+
if (!isFailure(error)) {
|
|
226
|
+
onSuccess();
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
totalFailures++;
|
|
230
|
+
lastFailureTime = Date.now();
|
|
231
|
+
consecutiveSuccesses = 0;
|
|
232
|
+
consecutiveFailures++;
|
|
233
|
+
if (currentState === "half-open") {
|
|
234
|
+
openedAt = Date.now();
|
|
235
|
+
transition("open");
|
|
236
|
+
} else if (currentState === "closed" && consecutiveFailures >= failureThreshold) {
|
|
237
|
+
openedAt = Date.now();
|
|
238
|
+
transition("open");
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
const shouldAllow = () => {
|
|
242
|
+
switch (currentState) {
|
|
243
|
+
case "closed":
|
|
244
|
+
return true;
|
|
245
|
+
case "open": {
|
|
246
|
+
const elapsed2 = Date.now() - openedAt;
|
|
247
|
+
if (elapsed2 >= resetTimeoutMs) {
|
|
248
|
+
transition("half-open");
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
case "half-open":
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
const protect = (effect) => {
|
|
258
|
+
totalRequests++;
|
|
259
|
+
if (!shouldAllow()) {
|
|
260
|
+
totalRejected++;
|
|
261
|
+
return _chunkDJQ7OMMBcjs.asyncFail.call(void 0, {
|
|
262
|
+
_tag: "CircuitBreakerOpen",
|
|
263
|
+
openSince: openedAt,
|
|
264
|
+
failures: consecutiveFailures
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
return _chunkDJQ7OMMBcjs.asyncFold.call(void 0,
|
|
268
|
+
effect,
|
|
269
|
+
(error) => {
|
|
270
|
+
onFailure(error);
|
|
271
|
+
return _chunkDJQ7OMMBcjs.asyncFail.call(void 0, error);
|
|
272
|
+
},
|
|
273
|
+
(value) => {
|
|
274
|
+
onSuccess();
|
|
275
|
+
return _chunkDJQ7OMMBcjs.asyncSucceed.call(void 0, value);
|
|
276
|
+
}
|
|
277
|
+
);
|
|
278
|
+
};
|
|
279
|
+
const stats = () => ({
|
|
280
|
+
state: currentState,
|
|
281
|
+
failures: consecutiveFailures,
|
|
282
|
+
successes: consecutiveSuccesses,
|
|
283
|
+
totalRequests,
|
|
284
|
+
totalFailures,
|
|
285
|
+
totalSuccesses,
|
|
286
|
+
totalRejected,
|
|
287
|
+
lastFailureTime,
|
|
288
|
+
lastSuccessTime
|
|
289
|
+
});
|
|
290
|
+
const reset = () => {
|
|
291
|
+
consecutiveFailures = 0;
|
|
292
|
+
consecutiveSuccesses = 0;
|
|
293
|
+
transition("closed");
|
|
294
|
+
};
|
|
295
|
+
return {
|
|
296
|
+
state: () => currentState,
|
|
297
|
+
protect,
|
|
298
|
+
stats,
|
|
299
|
+
reset
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// src/core/runtime/schedule.ts
|
|
304
|
+
function recurs(n) {
|
|
305
|
+
return {
|
|
306
|
+
_tag: "Schedule",
|
|
307
|
+
initial: () => 0,
|
|
308
|
+
step: (count, _input) => {
|
|
309
|
+
const next = count + 1;
|
|
310
|
+
return [{ continue: next < n, delayMs: 0 }, next, next];
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
function fixed(delayMs) {
|
|
315
|
+
return {
|
|
316
|
+
_tag: "Schedule",
|
|
317
|
+
initial: () => 0,
|
|
318
|
+
step: (count, _input) => {
|
|
319
|
+
return [{ continue: true, delayMs }, count + 1, count + 1];
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
function exponential(baseMs, maxMs = Infinity) {
|
|
324
|
+
return {
|
|
325
|
+
_tag: "Schedule",
|
|
326
|
+
initial: () => 0,
|
|
327
|
+
step: (count, _input) => {
|
|
328
|
+
const delay = Math.min(baseMs * Math.pow(2, count), maxMs);
|
|
329
|
+
return [{ continue: true, delayMs: delay }, count + 1, count + 1];
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
function fibonacci(baseMs, maxMs = Infinity) {
|
|
334
|
+
const base = Math.max(0, baseMs);
|
|
335
|
+
const cap = Math.max(0, maxMs);
|
|
336
|
+
return {
|
|
337
|
+
_tag: "Schedule",
|
|
338
|
+
initial: () => ({ prev: 0, curr: 1, count: 0 }),
|
|
339
|
+
step: (state, _input) => {
|
|
340
|
+
const delay = Math.min(base * state.curr, cap);
|
|
341
|
+
const next = {
|
|
342
|
+
prev: state.curr,
|
|
343
|
+
curr: state.prev + state.curr,
|
|
344
|
+
count: state.count + 1
|
|
345
|
+
};
|
|
346
|
+
return [{ continue: true, delayMs: delay }, next, state.count + 1];
|
|
347
|
+
}
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
function jittered(baseMs, maxMs = Infinity) {
|
|
351
|
+
return jitteredSchedule(exponential(baseMs, maxMs), { factor: 1 });
|
|
352
|
+
}
|
|
353
|
+
function elapsed(maxMs) {
|
|
354
|
+
return {
|
|
355
|
+
_tag: "Schedule",
|
|
356
|
+
initial: () => performance.now(),
|
|
357
|
+
step: (startedAt, _input) => {
|
|
358
|
+
const el = performance.now() - startedAt;
|
|
359
|
+
return [{ continue: el < maxMs, delayMs: 0 }, startedAt, el];
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
function whileInput(pred) {
|
|
364
|
+
return {
|
|
365
|
+
_tag: "Schedule",
|
|
366
|
+
initial: () => void 0,
|
|
367
|
+
step: (_state, input) => {
|
|
368
|
+
return [{ continue: pred(input), delayMs: 0 }, void 0, input];
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
function take(schedule, n) {
|
|
373
|
+
return {
|
|
374
|
+
_tag: "Schedule",
|
|
375
|
+
initial: () => ({ inner: schedule.initial(), count: 0 }),
|
|
376
|
+
step: (state, input) => {
|
|
377
|
+
if (state.count >= n) return [{ continue: false, delayMs: 0 }, state, void 0];
|
|
378
|
+
const [decision, nextInner, output] = schedule.step(state.inner, input);
|
|
379
|
+
const nextState = { inner: nextInner, count: state.count + 1 };
|
|
380
|
+
return [{ continue: decision.continue && state.count + 1 < n, delayMs: decision.delayMs }, nextState, output];
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
function map(schedule, f) {
|
|
385
|
+
return {
|
|
386
|
+
_tag: "Schedule",
|
|
387
|
+
initial: schedule.initial,
|
|
388
|
+
step: (state, input) => {
|
|
389
|
+
const [decision, nextState, output] = schedule.step(state, input);
|
|
390
|
+
return [decision, nextState, f(output)];
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
function contramap(schedule, f) {
|
|
395
|
+
return {
|
|
396
|
+
_tag: "Schedule",
|
|
397
|
+
initial: schedule.initial,
|
|
398
|
+
step: (state, input) => schedule.step(state, f(input))
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
function jitteredSchedule(schedule, options = {}) {
|
|
402
|
+
const factor = typeof options === "number" ? options : _nullishCoalesce(options.factor, () => ( 1));
|
|
403
|
+
const random = typeof options === "number" ? Math.random : _nullishCoalesce(options.random, () => ( Math.random));
|
|
404
|
+
const spread = Math.max(0, factor);
|
|
405
|
+
return {
|
|
406
|
+
_tag: "Schedule",
|
|
407
|
+
initial: schedule.initial,
|
|
408
|
+
step: (state, input) => {
|
|
409
|
+
const [decision, nextState, output] = schedule.step(state, input);
|
|
410
|
+
if (!decision.continue || decision.delayMs <= 0 || spread === 0) {
|
|
411
|
+
return [decision, nextState, output];
|
|
412
|
+
}
|
|
413
|
+
const delay = spread >= 1 ? Math.floor(random() * decision.delayMs) : Math.floor(decision.delayMs * (1 - spread + random() * spread * 2));
|
|
414
|
+
return [{ ...decision, delayMs: Math.max(0, delay) }, nextState, output];
|
|
415
|
+
}
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
var jitter = jitteredSchedule;
|
|
419
|
+
function windowed(schedule, windowMs, clock = defaultClock) {
|
|
420
|
+
const window = Math.max(0, windowMs);
|
|
421
|
+
return {
|
|
422
|
+
_tag: "Schedule",
|
|
423
|
+
initial: () => ({ inner: schedule.initial(), windowStartedAt: clock() }),
|
|
424
|
+
step: (state, input) => {
|
|
425
|
+
const now = clock();
|
|
426
|
+
const shouldReset = window > 0 && now - state.windowStartedAt > window;
|
|
427
|
+
const inner = shouldReset ? schedule.initial() : state.inner;
|
|
428
|
+
const windowStartedAt = shouldReset ? now : state.windowStartedAt;
|
|
429
|
+
const [decision, nextInner, output] = schedule.step(inner, input);
|
|
430
|
+
return [decision, { inner: nextInner, windowStartedAt }, output];
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
function defaultClock() {
|
|
435
|
+
return typeof performance !== "undefined" && typeof performance.now === "function" ? performance.now() : Date.now();
|
|
436
|
+
}
|
|
437
|
+
function andThen(first, second) {
|
|
438
|
+
return {
|
|
439
|
+
_tag: "Schedule",
|
|
440
|
+
initial: () => ({ phase: "first", inner: first.initial() }),
|
|
441
|
+
step: (state, input) => {
|
|
442
|
+
if (state.phase === "first") {
|
|
443
|
+
const [decision2, nextInner2, output2] = first.step(state.inner, input);
|
|
444
|
+
if (decision2.continue) {
|
|
445
|
+
return [decision2, { phase: "first", inner: nextInner2 }, output2];
|
|
446
|
+
}
|
|
447
|
+
return [{ continue: true, delayMs: decision2.delayMs }, { phase: "second", inner: second.initial() }, output2];
|
|
448
|
+
}
|
|
449
|
+
const [decision, nextInner, output] = second.step(state.inner, input);
|
|
450
|
+
return [decision, { phase: "second", inner: nextInner }, output];
|
|
451
|
+
}
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
function intersect(left, right) {
|
|
455
|
+
return {
|
|
456
|
+
_tag: "Schedule",
|
|
457
|
+
initial: () => ({ left: left.initial(), right: right.initial() }),
|
|
458
|
+
step: (state, input) => {
|
|
459
|
+
const [ld, ls, lo] = left.step(state.left, input);
|
|
460
|
+
const [rd, rs, ro] = right.step(state.right, input);
|
|
461
|
+
const cont = ld.continue && rd.continue;
|
|
462
|
+
const delay = Math.max(ld.delayMs, rd.delayMs);
|
|
463
|
+
return [{ continue: cont, delayMs: delay }, { left: ls, right: rs }, [lo, ro]];
|
|
464
|
+
}
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
function union(left, right) {
|
|
468
|
+
return {
|
|
469
|
+
_tag: "Schedule",
|
|
470
|
+
initial: () => ({ left: left.initial(), right: right.initial() }),
|
|
471
|
+
step: (state, input) => {
|
|
472
|
+
const [ld, ls, lo] = left.step(state.left, input);
|
|
473
|
+
const [rd, rs, ro] = right.step(state.right, input);
|
|
474
|
+
const cont = ld.continue || rd.continue;
|
|
475
|
+
const delay = Math.min(ld.delayMs, rd.delayMs);
|
|
476
|
+
return [{ continue: cont, delayMs: delay }, { left: ls, right: rs }, [lo, ro]];
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
function retryWithSchedule(effect, schedule) {
|
|
481
|
+
const loop = (state) => _chunkDJQ7OMMBcjs.asyncFold.call(void 0,
|
|
482
|
+
effect,
|
|
483
|
+
(error) => {
|
|
484
|
+
const [decision, nextState, _output] = schedule.step(state, error);
|
|
485
|
+
if (!decision.continue) return _chunkDJQ7OMMBcjs.asyncFail.call(void 0, error);
|
|
486
|
+
if (decision.delayMs <= 0) return loop(nextState);
|
|
487
|
+
return _chunkDJQ7OMMBcjs.asyncFlatMap.call(void 0, _chunk45F7OKGTcjs.sleep.call(void 0, decision.delayMs), () => loop(nextState));
|
|
488
|
+
},
|
|
489
|
+
(value) => _chunkDJQ7OMMBcjs.asyncSucceed.call(void 0, value)
|
|
490
|
+
);
|
|
491
|
+
return loop(schedule.initial());
|
|
492
|
+
}
|
|
493
|
+
function repeatWithSchedule(effect, schedule) {
|
|
494
|
+
const loop = (state, lastValue) => {
|
|
495
|
+
const [decision, nextState, _output] = schedule.step(state, lastValue);
|
|
496
|
+
if (!decision.continue) return _chunkDJQ7OMMBcjs.asyncSucceed.call(void 0, lastValue);
|
|
497
|
+
if (decision.delayMs <= 0) {
|
|
498
|
+
return _chunkDJQ7OMMBcjs.asyncFold.call(void 0,
|
|
499
|
+
effect,
|
|
500
|
+
(error) => _chunkDJQ7OMMBcjs.asyncFail.call(void 0, error),
|
|
501
|
+
(value) => loop(nextState, value)
|
|
502
|
+
);
|
|
503
|
+
}
|
|
504
|
+
return _chunkDJQ7OMMBcjs.asyncFlatMap.call(void 0,
|
|
505
|
+
_chunk45F7OKGTcjs.sleep.call(void 0, decision.delayMs),
|
|
506
|
+
() => _chunkDJQ7OMMBcjs.asyncFold.call(void 0,
|
|
507
|
+
effect,
|
|
508
|
+
(error) => _chunkDJQ7OMMBcjs.asyncFail.call(void 0, error),
|
|
509
|
+
(value) => loop(nextState, value)
|
|
510
|
+
)
|
|
511
|
+
);
|
|
512
|
+
};
|
|
513
|
+
return _chunkDJQ7OMMBcjs.asyncFold.call(void 0,
|
|
514
|
+
effect,
|
|
515
|
+
(error) => _chunkDJQ7OMMBcjs.asyncFail.call(void 0, error),
|
|
516
|
+
(value) => loop(schedule.initial(), value)
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
exports.bracket = bracket; exports.ensuring = ensuring; exports.resource = resource; exports.makeResource = makeResource; exports.resourceSucceed = resourceSucceed; exports.resourceFromManaged = resourceFromManaged; exports.useResource = useResource; exports.resourceAll = resourceAll; exports.Resource = Resource; exports.managed = managed; exports.useManaged = useManaged; exports.managedAll = managedAll; exports.makeCircuitBreaker = makeCircuitBreaker; exports.recurs = recurs; exports.fixed = fixed; exports.exponential = exponential; exports.fibonacci = fibonacci; exports.jittered = jittered; exports.elapsed = elapsed; exports.whileInput = whileInput; exports.take = take; exports.map = map; exports.contramap = contramap; exports.jitteredSchedule = jitteredSchedule; exports.jitter = jitter; exports.windowed = windowed; exports.andThen = andThen; exports.intersect = intersect; exports.union = union; exports.retryWithSchedule = retryWithSchedule; exports.repeatWithSchedule = repeatWithSchedule;
|