@deepnoodle/mobius 0.0.1 → 0.0.3
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 +31 -0
- package/dist/api/index.d.ts +32 -61
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/schema.d.ts +3190 -1383
- package/dist/api/schema.d.ts.map +1 -1
- package/dist/client.d.ts +45 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +61 -12
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/retry.d.ts +36 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +150 -0
- package/dist/retry.js.map +1 -0
- package/dist/worker.d.ts +21 -5
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +105 -20
- package/dist/worker.js.map +1 -1
- package/package.json +10 -8
package/dist/client.d.ts
CHANGED
|
@@ -1,18 +1,53 @@
|
|
|
1
1
|
import type { JobClaim, JobClaimRequest, JobCompleteRequest, JobFenceRequest, JobHeartbeat } from "./api/index.js";
|
|
2
|
+
import { RateLimitError } from "./retry.js";
|
|
3
|
+
export { RateLimitError } from "./retry.js";
|
|
2
4
|
export interface ClientOptions {
|
|
3
5
|
apiKey: string;
|
|
4
6
|
baseURL?: string;
|
|
5
|
-
/**
|
|
7
|
+
/** Project handle used for all project-scoped operations. */
|
|
8
|
+
project?: string;
|
|
9
|
+
/** Compatibility alias for older callers. */
|
|
6
10
|
namespace?: string;
|
|
7
11
|
/** Fetch timeout in milliseconds. Defaults to 60_000. */
|
|
8
12
|
timeoutMs?: number;
|
|
13
|
+
/**
|
|
14
|
+
* Number of retries for 429/503 responses. Defaults to
|
|
15
|
+
* {@link DEFAULT_MAX_RETRIES}. Set to 0 to disable retries — 429
|
|
16
|
+
* responses then surface as {@link RateLimitError} on the first attempt.
|
|
17
|
+
* See `../../docs/retries.md` for the shared retry policy.
|
|
18
|
+
*/
|
|
19
|
+
retry?: number;
|
|
9
20
|
}
|
|
10
21
|
export declare const DEFAULT_BASE_URL = "https://api.mobiusops.ai";
|
|
22
|
+
export declare const DEFAULT_PROJECT = "default";
|
|
11
23
|
export declare const DEFAULT_NAMESPACE = "default";
|
|
12
24
|
export declare class LeaseLostError extends Error {
|
|
13
25
|
readonly jobId: string;
|
|
14
26
|
constructor(jobId: string);
|
|
15
27
|
}
|
|
28
|
+
export declare class PayloadTooLargeError extends Error {
|
|
29
|
+
readonly jobId: string;
|
|
30
|
+
constructor(jobId: string);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Legacy per-job rate-limit error raised by {@link Client.emitJobEvents}.
|
|
34
|
+
* Subclass of {@link RateLimitError} so callers catching the newer,
|
|
35
|
+
* transport-raised {@link RateLimitError} also catch this. New code
|
|
36
|
+
* should prefer {@link RateLimitError}.
|
|
37
|
+
*/
|
|
38
|
+
export declare class RateLimitedError extends RateLimitError {
|
|
39
|
+
readonly jobId: string;
|
|
40
|
+
constructor(jobId: string, retryAfter?: number);
|
|
41
|
+
}
|
|
42
|
+
export interface JobEventEntry {
|
|
43
|
+
type: string;
|
|
44
|
+
payload: Record<string, unknown>;
|
|
45
|
+
}
|
|
46
|
+
export interface JobEventsRequest {
|
|
47
|
+
worker_id: string;
|
|
48
|
+
attempt: number;
|
|
49
|
+
events: JobEventEntry[];
|
|
50
|
+
}
|
|
16
51
|
/**
|
|
17
52
|
* Low-level Mobius runtime API client. Prefer {@link Worker} in worker.ts
|
|
18
53
|
* rather than calling these methods directly.
|
|
@@ -23,9 +58,10 @@ export declare class LeaseLostError extends Error {
|
|
|
23
58
|
*/
|
|
24
59
|
export declare class Client {
|
|
25
60
|
private readonly baseURL;
|
|
26
|
-
|
|
61
|
+
readonly project: string;
|
|
27
62
|
private readonly headers;
|
|
28
63
|
private readonly timeoutMs;
|
|
64
|
+
private readonly fetchFn;
|
|
29
65
|
constructor(opts: ClientOptions);
|
|
30
66
|
/**
|
|
31
67
|
* Long-poll for the next claimable job. Returns null when the poll
|
|
@@ -36,6 +72,13 @@ export declare class Client {
|
|
|
36
72
|
heartbeatJob(jobId: string, req: JobFenceRequest): Promise<JobHeartbeat>;
|
|
37
73
|
/** Report the terminal status of a claimed job. */
|
|
38
74
|
completeJob(jobId: string, req: JobCompleteRequest): Promise<void>;
|
|
75
|
+
emitJobEvents(jobId: string, req: JobEventsRequest): Promise<void>;
|
|
76
|
+
emitJobEvent(jobId: string, req: {
|
|
77
|
+
worker_id: string;
|
|
78
|
+
attempt: number;
|
|
79
|
+
type: string;
|
|
80
|
+
payload: Record<string, unknown>;
|
|
81
|
+
}): Promise<void>;
|
|
39
82
|
private request;
|
|
40
83
|
}
|
|
41
84
|
export type { JobClaim, JobHeartbeat };
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,cAAc,EAEf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAC3D,eAAO,MAAM,eAAe,YAAY,CAAC;AACzC,eAAO,MAAM,iBAAiB,YAAkB,CAAC;AAEjD,qBAAa,cAAe,SAAQ,KAAK;aACX,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CAI1C;AAED,qBAAa,oBAAqB,SAAQ,KAAK;aACjB,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CAI1C;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAW/C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,IAAI,EAAE,aAAa;IAc/B;;;OAGG;IACG,QAAQ,CACZ,GAAG,EAAE,eAAe,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAS3B,0CAA0C;IACpC,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,YAAY,CAAC;IASxB,mDAAmD;IAC7C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlE,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;QACH,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GACA,OAAO,CAAC,IAAI,CAAC;YAQF,OAAO;CA8BtB;AAED,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC"}
|
package/dist/client.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { DEFAULT_MAX_RETRIES, RateLimitError, wrapFetchWithRetry, } from "./retry.js";
|
|
2
|
+
export { RateLimitError } from "./retry.js";
|
|
1
3
|
export const DEFAULT_BASE_URL = "https://api.mobiusops.ai";
|
|
2
|
-
export const
|
|
4
|
+
export const DEFAULT_PROJECT = "default";
|
|
5
|
+
export const DEFAULT_NAMESPACE = DEFAULT_PROJECT;
|
|
3
6
|
export class LeaseLostError extends Error {
|
|
4
7
|
constructor(jobId) {
|
|
5
8
|
super(`lease lost for job ${jobId}`);
|
|
@@ -7,6 +10,31 @@ export class LeaseLostError extends Error {
|
|
|
7
10
|
this.name = "LeaseLostError";
|
|
8
11
|
}
|
|
9
12
|
}
|
|
13
|
+
export class PayloadTooLargeError extends Error {
|
|
14
|
+
constructor(jobId) {
|
|
15
|
+
super(`custom event payload too large for job ${jobId}`);
|
|
16
|
+
this.jobId = jobId;
|
|
17
|
+
this.name = "PayloadTooLargeError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Legacy per-job rate-limit error raised by {@link Client.emitJobEvents}.
|
|
22
|
+
* Subclass of {@link RateLimitError} so callers catching the newer,
|
|
23
|
+
* transport-raised {@link RateLimitError} also catch this. New code
|
|
24
|
+
* should prefer {@link RateLimitError}.
|
|
25
|
+
*/
|
|
26
|
+
export class RateLimitedError extends RateLimitError {
|
|
27
|
+
constructor(jobId, retryAfter) {
|
|
28
|
+
super({
|
|
29
|
+
retryAfter: retryAfter ?? 0,
|
|
30
|
+
message: retryAfter != null
|
|
31
|
+
? `custom event rate limited for job ${jobId} (retry after ${retryAfter}s)`
|
|
32
|
+
: `custom event rate limited for job ${jobId}`,
|
|
33
|
+
});
|
|
34
|
+
this.name = "RateLimitedError";
|
|
35
|
+
this.jobId = jobId;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
10
38
|
/**
|
|
11
39
|
* Low-level Mobius runtime API client. Prefer {@link Worker} in worker.ts
|
|
12
40
|
* rather than calling these methods directly.
|
|
@@ -18,37 +46,52 @@ export class LeaseLostError extends Error {
|
|
|
18
46
|
export class Client {
|
|
19
47
|
constructor(opts) {
|
|
20
48
|
this.baseURL = (opts.baseURL ?? DEFAULT_BASE_URL).replace(/\/$/, "");
|
|
21
|
-
this.
|
|
49
|
+
this.project = opts.project ?? opts.namespace ?? DEFAULT_PROJECT;
|
|
22
50
|
this.headers = {
|
|
23
51
|
Authorization: `Bearer ${opts.apiKey}`,
|
|
24
52
|
"Content-Type": "application/json",
|
|
25
53
|
};
|
|
26
54
|
this.timeoutMs = opts.timeoutMs ?? 60000;
|
|
55
|
+
this.fetchFn = wrapFetchWithRetry((input, init) => globalThis.fetch(input, init), { maxRetries: opts.retry ?? DEFAULT_MAX_RETRIES });
|
|
27
56
|
}
|
|
28
57
|
/**
|
|
29
58
|
* Long-poll for the next claimable job. Returns null when the poll
|
|
30
59
|
* window closes without a job being available.
|
|
31
60
|
*/
|
|
32
61
|
async claimJob(req, signal) {
|
|
33
|
-
const resp = await this.request(`/
|
|
62
|
+
const resp = await this.request(`/projects/${encodeURIComponent(this.project)}/jobs/claim`, { method: "POST", body: req, signal });
|
|
34
63
|
if (resp.status === 204)
|
|
35
64
|
return null;
|
|
36
|
-
|
|
37
|
-
return body.data;
|
|
65
|
+
return (await resp.json());
|
|
38
66
|
}
|
|
39
67
|
/** Refresh the lease on a claimed job. */
|
|
40
68
|
async heartbeatJob(jobId, req) {
|
|
41
|
-
const resp = await this.request(`/
|
|
69
|
+
const resp = await this.request(`/projects/${encodeURIComponent(this.project)}/jobs/${encodeURIComponent(jobId)}/heartbeat`, { method: "POST", body: req });
|
|
42
70
|
if (resp.status === 409)
|
|
43
71
|
throw new LeaseLostError(jobId);
|
|
44
|
-
|
|
45
|
-
return body.data;
|
|
72
|
+
return (await resp.json());
|
|
46
73
|
}
|
|
47
74
|
/** Report the terminal status of a claimed job. */
|
|
48
75
|
async completeJob(jobId, req) {
|
|
49
|
-
const resp = await this.request(`/
|
|
76
|
+
const resp = await this.request(`/projects/${encodeURIComponent(this.project)}/jobs/${encodeURIComponent(jobId)}/complete`, { method: "POST", body: req });
|
|
77
|
+
if (resp.status === 409)
|
|
78
|
+
throw new LeaseLostError(jobId);
|
|
79
|
+
}
|
|
80
|
+
async emitJobEvents(jobId, req) {
|
|
81
|
+
// 429 responses surface as RateLimitError (thrown from the retry
|
|
82
|
+
// transport below). 409/413 are non-retryable and handled here.
|
|
83
|
+
const resp = await this.request(`/projects/${encodeURIComponent(this.project)}/jobs/${encodeURIComponent(jobId)}/events`, { method: "POST", body: req });
|
|
50
84
|
if (resp.status === 409)
|
|
51
85
|
throw new LeaseLostError(jobId);
|
|
86
|
+
if (resp.status === 413)
|
|
87
|
+
throw new PayloadTooLargeError(jobId);
|
|
88
|
+
}
|
|
89
|
+
async emitJobEvent(jobId, req) {
|
|
90
|
+
await this.emitJobEvents(jobId, {
|
|
91
|
+
worker_id: req.worker_id,
|
|
92
|
+
attempt: req.attempt,
|
|
93
|
+
events: [{ type: req.type, payload: req.payload }],
|
|
94
|
+
});
|
|
52
95
|
}
|
|
53
96
|
async request(path, opts) {
|
|
54
97
|
const timeout = AbortSignal.timeout(this.timeoutMs);
|
|
@@ -61,8 +104,12 @@ export class Client {
|
|
|
61
104
|
if (opts.body != null) {
|
|
62
105
|
init.body = JSON.stringify(opts.body);
|
|
63
106
|
}
|
|
64
|
-
const resp = await
|
|
65
|
-
if (!resp.ok &&
|
|
107
|
+
const resp = await this.fetchFn(this.baseURL + path, init);
|
|
108
|
+
if (!resp.ok &&
|
|
109
|
+
resp.status !== 204 &&
|
|
110
|
+
resp.status !== 409 &&
|
|
111
|
+
resp.status !== 413 &&
|
|
112
|
+
resp.status !== 429) {
|
|
66
113
|
const text = await resp.text().catch(() => "");
|
|
67
114
|
throw new Error(`mobius API ${opts.method} ${path}: HTTP ${resp.status}: ${text}`);
|
|
68
115
|
}
|
|
@@ -76,7 +123,9 @@ function anySignal(...signals) {
|
|
|
76
123
|
controller.abort(s.reason);
|
|
77
124
|
break;
|
|
78
125
|
}
|
|
79
|
-
s.addEventListener("abort", () => controller.abort(s.reason), {
|
|
126
|
+
s.addEventListener("abort", () => controller.abort(s.reason), {
|
|
127
|
+
once: true,
|
|
128
|
+
});
|
|
80
129
|
}
|
|
81
130
|
return controller.signal;
|
|
82
131
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAoB5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AACzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAEjD,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAA4B,KAAa;QACvC,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;QADX,UAAK,GAAL,KAAK,CAAQ;QAEvC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAA4B,KAAa;QACvC,KAAK,CAAC,0CAA0C,KAAK,EAAE,CAAC,CAAC;QAD/B,UAAK,GAAL,KAAK,CAAQ;QAEvC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IAGlD,YAAY,KAAa,EAAE,UAAmB;QAC5C,KAAK,CAAC;YACJ,UAAU,EAAE,UAAU,IAAI,CAAC;YAC3B,OAAO,EACL,UAAU,IAAI,IAAI;gBAChB,CAAC,CAAC,qCAAqC,KAAK,iBAAiB,UAAU,IAAI;gBAC3E,CAAC,CAAC,qCAAqC,KAAK,EAAE;SACnD,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAaD;;;;;;;GAOG;AACH,MAAM,OAAO,MAAM;IAOjB,YAAY,IAAmB;QAC7B,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,IAAI,eAAe,CAAC;QACjE,IAAI,CAAC,OAAO,GAAG;YACb,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAM,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAC/B,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,EAC9C,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,IAAI,mBAAmB,EAAE,CAClD,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CACZ,GAAoB,EACpB,MAAoB;QAEpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,aAAa,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAC1D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CACtC,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAa,CAAC;IACzC,CAAC;IAED,0CAA0C;IAC1C,KAAK,CAAC,YAAY,CAChB,KAAa,EACb,GAAoB;QAEpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,aAAa,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,kBAAkB,CAAC,KAAK,CAAC,YAAY,EAC3F,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAC9B,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAiB,CAAC;IAC7C,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,GAAuB;QACtD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,aAAa,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,kBAAkB,CAAC,KAAK,CAAC,WAAW,EAC1F,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAC9B,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,GAAqB;QACtD,iEAAiE;QACjE,gEAAgE;QAChE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,aAAa,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,kBAAkB,CAAC,KAAK,CAAC,SAAS,EACxF,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAC9B,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,KAAa,EACb,GAKC;QAED,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;YAC9B,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,IAAY,EACZ,IAA0E;QAE1E,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAEvE,MAAM,IAAI,GAAgB;YACxB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM;SACP,CAAC;QACF,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3D,IACE,CAAC,IAAI,CAAC,EAAE;YACR,IAAI,CAAC,MAAM,KAAK,GAAG;YACnB,IAAI,CAAC,MAAM,KAAK,GAAG;YACnB,IAAI,CAAC,MAAM,KAAK,GAAG;YACnB,IAAI,CAAC,MAAM,KAAK,GAAG,EACnB,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,cAAc,IAAI,CAAC,MAAM,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAClE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAID,SAAS,SAAS,CAAC,GAAG,OAAsB;IAC1C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM;QACR,CAAC;QACD,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;YAC5D,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAC;AAC3B,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export { Client, LeaseLostError } from "./client.js";
|
|
2
|
-
export { DEFAULT_BASE_URL, DEFAULT_NAMESPACE, type ClientOptions } from "./client.js";
|
|
1
|
+
export { Client, LeaseLostError, PayloadTooLargeError, RateLimitedError, RateLimitError, } from "./client.js";
|
|
2
|
+
export { DEFAULT_BASE_URL, DEFAULT_NAMESPACE, DEFAULT_PROJECT, type ClientOptions, type JobEventEntry, type JobEventsRequest, } from "./client.js";
|
|
3
|
+
export { DEFAULT_MAX_RETRIES, MAX_RETRY_BACKOFF_SECONDS, wrapFetchWithRetry, type WrapRetryOptions, } from "./retry.js";
|
|
3
4
|
export { Worker } from "./worker.js";
|
|
4
|
-
export type { WorkerConfig, ActionFn, Logger } from "./worker.js";
|
|
5
|
-
export type { JobClaim,
|
|
5
|
+
export type { WorkerConfig, ActionFn, Logger, ActionContext, } from "./worker.js";
|
|
6
|
+
export type { JobClaim, JobClaimRequest, JobCompleteRequest, JobFenceRequest, JobHeartbeat, JobHeartbeatDirectives, } from "./api/index.js";
|
|
6
7
|
//# 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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EACV,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,sBAAsB,GACvB,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { Client, LeaseLostError } from "./client.js";
|
|
2
|
-
export { DEFAULT_BASE_URL, DEFAULT_NAMESPACE } from "./client.js";
|
|
1
|
+
export { Client, LeaseLostError, PayloadTooLargeError, RateLimitedError, RateLimitError, } from "./client.js";
|
|
2
|
+
export { DEFAULT_BASE_URL, DEFAULT_NAMESPACE, DEFAULT_PROJECT, } from "./client.js";
|
|
3
|
+
export { DEFAULT_MAX_RETRIES, MAX_RETRY_BACKOFF_SECONDS, wrapFetchWithRetry, } from "./retry.js";
|
|
3
4
|
export { Worker } from "./worker.js";
|
|
4
5
|
//# 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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAIhB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,GAEnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/retry.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare class RateLimitError extends Error {
|
|
2
|
+
readonly retryAfter: number;
|
|
3
|
+
readonly limit: number | null;
|
|
4
|
+
readonly remaining: number | null;
|
|
5
|
+
readonly resetAt: Date | null;
|
|
6
|
+
readonly scope: string | null;
|
|
7
|
+
readonly policy: string | null;
|
|
8
|
+
constructor(init?: {
|
|
9
|
+
retryAfter?: number;
|
|
10
|
+
limit?: number | null;
|
|
11
|
+
remaining?: number | null;
|
|
12
|
+
resetAt?: Date | null;
|
|
13
|
+
scope?: string | null;
|
|
14
|
+
policy?: string | null;
|
|
15
|
+
message?: string;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export declare const DEFAULT_MAX_RETRIES = 3;
|
|
19
|
+
export declare const MAX_RETRY_BACKOFF_SECONDS = 60;
|
|
20
|
+
type FetchFn = typeof globalThis.fetch;
|
|
21
|
+
export interface WrapRetryOptions {
|
|
22
|
+
/** Number of retries for 429/503 responses. 0 disables retries. */
|
|
23
|
+
maxRetries?: number;
|
|
24
|
+
/** Override for tests — called in place of `setTimeout`-based sleeping. */
|
|
25
|
+
sleep?: (seconds: number) => Promise<void>;
|
|
26
|
+
/** Override for tests — called in place of `Date.now()` (milliseconds). */
|
|
27
|
+
now?: () => number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Wrap a `fetch` function so that 429 and 503 responses are retried per
|
|
31
|
+
* the shared policy. The returned function is a drop-in replacement for
|
|
32
|
+
* the global `fetch`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function wrapFetchWithRetry(fetchFn: FetchFn, options?: WrapRetryOptions): FetchFn;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAGA,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEnB,IAAI,GAAE;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;KACb;CAkBP;AAED,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAK5C,KAAK,OAAO,GAAG,OAAO,UAAU,CAAC,KAAK,CAAC;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAoCT"}
|
package/dist/retry.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// 429/503-aware retrying `fetch` wrapper. Implements the shared retry
|
|
2
|
+
// policy documented in ../../docs/retries.md.
|
|
3
|
+
export class RateLimitError extends Error {
|
|
4
|
+
constructor(init = {}) {
|
|
5
|
+
const scope = init.scope ?? null;
|
|
6
|
+
const scopeLabel = scope ?? "unknown";
|
|
7
|
+
const retryAfter = init.retryAfter ?? 0;
|
|
8
|
+
const message = init.message ??
|
|
9
|
+
(retryAfter > 0
|
|
10
|
+
? `mobius: rate limit exceeded (scope=${scopeLabel}, retry after ${retryAfter}s)`
|
|
11
|
+
: `mobius: rate limit exceeded (scope=${scopeLabel})`);
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "RateLimitError";
|
|
14
|
+
this.retryAfter = retryAfter;
|
|
15
|
+
this.limit = init.limit ?? null;
|
|
16
|
+
this.remaining = init.remaining ?? null;
|
|
17
|
+
this.resetAt = init.resetAt ?? null;
|
|
18
|
+
this.scope = scope;
|
|
19
|
+
this.policy = init.policy ?? null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export const DEFAULT_MAX_RETRIES = 3;
|
|
23
|
+
export const MAX_RETRY_BACKOFF_SECONDS = 60;
|
|
24
|
+
const BASE_RETRY_BACKOFF_SECONDS = 1;
|
|
25
|
+
const IDEMPOTENT_METHODS = new Set(["GET", "HEAD", "PUT", "DELETE", "OPTIONS"]);
|
|
26
|
+
/**
|
|
27
|
+
* Wrap a `fetch` function so that 429 and 503 responses are retried per
|
|
28
|
+
* the shared policy. The returned function is a drop-in replacement for
|
|
29
|
+
* the global `fetch`.
|
|
30
|
+
*/
|
|
31
|
+
export function wrapFetchWithRetry(fetchFn, options = {}) {
|
|
32
|
+
const maxRetries = Math.max(0, options.maxRetries ?? DEFAULT_MAX_RETRIES);
|
|
33
|
+
const sleep = options.sleep ?? defaultSleep;
|
|
34
|
+
const now = options.now ?? (() => Date.now());
|
|
35
|
+
return (async (input, init) => {
|
|
36
|
+
let attempt = 0;
|
|
37
|
+
// Capture method / idempotency bits once — retries re-send the same request.
|
|
38
|
+
const { method, hasIdempotencyKey } = describeRequest(input, init);
|
|
39
|
+
const idempotent = isIdempotent(method, hasIdempotencyKey);
|
|
40
|
+
while (true) {
|
|
41
|
+
const response = await fetchFn(input, init);
|
|
42
|
+
const status = response.status;
|
|
43
|
+
if (status !== 429 && status !== 503) {
|
|
44
|
+
return response;
|
|
45
|
+
}
|
|
46
|
+
const outOfBudget = attempt >= maxRetries || !idempotent;
|
|
47
|
+
if (status === 429 && outOfBudget) {
|
|
48
|
+
// Drain body so the connection can be reused.
|
|
49
|
+
await drainBody(response);
|
|
50
|
+
throw buildRateLimitError(response);
|
|
51
|
+
}
|
|
52
|
+
if (status === 503 && outOfBudget) {
|
|
53
|
+
return response;
|
|
54
|
+
}
|
|
55
|
+
const wait = retryAfterOrBackoff(response, attempt, now);
|
|
56
|
+
await drainBody(response);
|
|
57
|
+
if (wait > 0) {
|
|
58
|
+
await sleep(wait);
|
|
59
|
+
}
|
|
60
|
+
attempt++;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function describeRequest(input, init) {
|
|
65
|
+
let method = (init?.method ?? "GET").toUpperCase();
|
|
66
|
+
let headers;
|
|
67
|
+
if (init?.headers) {
|
|
68
|
+
headers = new Headers(init.headers);
|
|
69
|
+
}
|
|
70
|
+
if (input instanceof Request) {
|
|
71
|
+
if (!init?.method)
|
|
72
|
+
method = input.method.toUpperCase();
|
|
73
|
+
if (!headers)
|
|
74
|
+
headers = new Headers(input.headers);
|
|
75
|
+
}
|
|
76
|
+
const hasIdempotencyKey = headers
|
|
77
|
+
? (headers.get("Idempotency-Key") ?? "").trim() !== ""
|
|
78
|
+
: false;
|
|
79
|
+
return { method, hasIdempotencyKey };
|
|
80
|
+
}
|
|
81
|
+
function isIdempotent(method, hasIdempotencyKey) {
|
|
82
|
+
if (IDEMPOTENT_METHODS.has(method))
|
|
83
|
+
return true;
|
|
84
|
+
if (method === "POST" || method === "PATCH")
|
|
85
|
+
return hasIdempotencyKey;
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
async function drainBody(response) {
|
|
89
|
+
try {
|
|
90
|
+
await response.text();
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// ignore
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function retryAfterOrBackoff(response, attempt, now) {
|
|
97
|
+
const header = response.headers.get("Retry-After");
|
|
98
|
+
const parsed = parseRetryAfter(header, now);
|
|
99
|
+
if (parsed !== null)
|
|
100
|
+
return clamp(parsed);
|
|
101
|
+
return clamp(BASE_RETRY_BACKOFF_SECONDS * 2 ** attempt);
|
|
102
|
+
}
|
|
103
|
+
function parseRetryAfter(value, now) {
|
|
104
|
+
if (value == null || value.trim() === "")
|
|
105
|
+
return null;
|
|
106
|
+
const trimmed = value.trim();
|
|
107
|
+
if (/^-?\d+$/.test(trimmed)) {
|
|
108
|
+
return Number(trimmed);
|
|
109
|
+
}
|
|
110
|
+
const ts = Date.parse(trimmed);
|
|
111
|
+
if (Number.isNaN(ts))
|
|
112
|
+
return null;
|
|
113
|
+
const delta = (ts - now()) / 1000;
|
|
114
|
+
return Math.max(0, delta);
|
|
115
|
+
}
|
|
116
|
+
function clamp(seconds) {
|
|
117
|
+
if (!Number.isFinite(seconds) || seconds < 0)
|
|
118
|
+
return 0;
|
|
119
|
+
if (seconds > MAX_RETRY_BACKOFF_SECONDS)
|
|
120
|
+
return MAX_RETRY_BACKOFF_SECONDS;
|
|
121
|
+
return seconds;
|
|
122
|
+
}
|
|
123
|
+
function buildRateLimitError(response) {
|
|
124
|
+
const headers = response.headers;
|
|
125
|
+
const retryAfter = parseRetryAfter(headers.get("Retry-After"), () => Date.now()) ?? 0;
|
|
126
|
+
return new RateLimitError({
|
|
127
|
+
retryAfter,
|
|
128
|
+
limit: intOrNull(headers.get("X-RateLimit-Limit")),
|
|
129
|
+
remaining: intOrNull(headers.get("X-RateLimit-Remaining")),
|
|
130
|
+
resetAt: unixOrNull(headers.get("X-RateLimit-Reset")),
|
|
131
|
+
scope: headers.get("X-RateLimit-Scope"),
|
|
132
|
+
policy: headers.get("X-RateLimit-Policy"),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function intOrNull(v) {
|
|
136
|
+
if (v == null || v === "")
|
|
137
|
+
return null;
|
|
138
|
+
const n = Number.parseInt(v, 10);
|
|
139
|
+
return Number.isFinite(n) ? n : null;
|
|
140
|
+
}
|
|
141
|
+
function unixOrNull(v) {
|
|
142
|
+
if (v == null || v === "")
|
|
143
|
+
return null;
|
|
144
|
+
const n = Number.parseInt(v, 10);
|
|
145
|
+
return Number.isFinite(n) ? new Date(n * 1000) : null;
|
|
146
|
+
}
|
|
147
|
+
function defaultSleep(seconds) {
|
|
148
|
+
return new Promise((resolve) => setTimeout(resolve, seconds * 1000));
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"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"}
|
package/dist/worker.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export interface WorkerConfig {
|
|
|
18
18
|
version?: string;
|
|
19
19
|
/**
|
|
20
20
|
* Queue names this worker subscribes to. Empty (or omitted) means claim
|
|
21
|
-
* jobs from any queue in the
|
|
21
|
+
* jobs from any queue in the project. Runs default to the "default"
|
|
22
22
|
* queue.
|
|
23
23
|
*/
|
|
24
24
|
queues?: string[];
|
|
@@ -42,13 +42,29 @@ export interface WorkerConfig {
|
|
|
42
42
|
* (e.g. pino, winston) to route messages elsewhere.
|
|
43
43
|
*/
|
|
44
44
|
logger?: Logger | null;
|
|
45
|
+
/** Max buffered custom events per in-flight job before dropping oldest. */
|
|
46
|
+
eventQueueSize?: number;
|
|
47
|
+
/** Max custom events per HTTP batch. Defaults to 20. */
|
|
48
|
+
eventBatchSize?: number;
|
|
45
49
|
}
|
|
46
50
|
/**
|
|
47
51
|
* ActionFn implements a single Mobius action. Receives the JSON-decoded
|
|
48
52
|
* parameters delivered with the job claim and returns a JSON-serialisable
|
|
49
53
|
* result.
|
|
50
54
|
*/
|
|
51
|
-
export type ActionFn = (params: Record<string, unknown>, signal: AbortSignal) => Promise<unknown>;
|
|
55
|
+
export type ActionFn = (params: Record<string, unknown>, signal: AbortSignal, ctx: ActionContext) => Promise<unknown>;
|
|
56
|
+
export interface ActionContext {
|
|
57
|
+
jobId: string;
|
|
58
|
+
runId: string;
|
|
59
|
+
projectId?: string;
|
|
60
|
+
workerId: string;
|
|
61
|
+
attempt: number;
|
|
62
|
+
queue?: string;
|
|
63
|
+
workflowName?: string;
|
|
64
|
+
stepName?: string;
|
|
65
|
+
action?: string;
|
|
66
|
+
emitEvent(type: string, payload: Record<string, unknown>): void;
|
|
67
|
+
}
|
|
52
68
|
/**
|
|
53
69
|
* Worker claims jobs from Mobius and dispatches each to the corresponding
|
|
54
70
|
* registered action function. A *job* is a single action invocation on
|
|
@@ -68,10 +84,10 @@ export declare class Worker {
|
|
|
68
84
|
* stopped via {@link stop} or the given signal is aborted.
|
|
69
85
|
*/
|
|
70
86
|
run(signal?: AbortSignal): Promise<void>;
|
|
71
|
-
/** Gracefully stop the worker after in-flight
|
|
87
|
+
/** Gracefully stop the worker after in-flight jobs complete. */
|
|
72
88
|
stop(): void;
|
|
73
|
-
private
|
|
89
|
+
private executeJob;
|
|
74
90
|
private heartbeatInterval;
|
|
75
|
-
private
|
|
91
|
+
private failJob;
|
|
76
92
|
}
|
|
77
93
|
//# sourceMappingURL=worker.d.ts.map
|
package/dist/worker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,MAAM,EAKP,MAAM,aAAa,CAAC;AAErB;;;;GAIG;AACH,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC;AAcD,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,CACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACjE;AAED;;;;GAIG;AACH,qBAAa,MAAM;IAWf,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAIrB;IACF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,eAAe,CAAyB;gBAG7B,MAAM,EAAE,MAAM,EAC/B,MAAM,EAAE,YAAY;IAkBtB,wDAAwD;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI;IAK1C;;;OAGG;IACG,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiD9C,gEAAgE;IAChE,IAAI,IAAI,IAAI;YAME,UAAU;IAyGxB,OAAO,CAAC,iBAAiB;YASX,OAAO;CAsBtB"}
|