@ancon/wildcat-utils 1.44.0-terminal-refactor.3 → 1.44.0-terminal-refactor.5
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/hangfire/createHangfirePoller.d.ts +7 -1
- package/hangfire/createHangfirePoller.js +1 -1
- package/hangfire/createHangfirePoller.mjs +55 -47
- package/hangfire/createMakeHangfireRequest.d.ts +14 -2
- package/hangfire/createMakeHangfireRequest.js +1 -1
- package/hangfire/createMakeHangfireRequest.mjs +16 -14
- package/package.json +1 -1
|
@@ -6,6 +6,10 @@ declare type HangfirePollerConfig = {
|
|
|
6
6
|
maxGroupsSize: number;
|
|
7
7
|
/** Max number of simultaneous workers per group */
|
|
8
8
|
maxWorkersSize: number;
|
|
9
|
+
/** Successful response interceptor */
|
|
10
|
+
responseInterceptor?: (response: any) => any;
|
|
11
|
+
/** Failed response interceptor */
|
|
12
|
+
responseRejectionInterceptor?: (error: any) => any;
|
|
9
13
|
/**
|
|
10
14
|
* Function returning a boolean indicating whether connected
|
|
11
15
|
* @example () => isNetworkOnlineSelector(getStore().getState())
|
|
@@ -27,16 +31,18 @@ declare class HangfirePoller {
|
|
|
27
31
|
private workerByIdMap;
|
|
28
32
|
private timer;
|
|
29
33
|
private config;
|
|
34
|
+
private axiosInstance;
|
|
30
35
|
constructor(options?: Partial<HangfirePollerConfig>);
|
|
31
36
|
private stopTimer;
|
|
32
37
|
private startTimer;
|
|
33
38
|
private waitForNetworkOnline;
|
|
34
39
|
private executeWorkerRequest;
|
|
35
40
|
private deleteWorker;
|
|
36
|
-
createWorker(groupId: string, { workerId, url, headers, }: {
|
|
41
|
+
createWorker(groupId: string, { workerId, url, headers, onResolved, }: {
|
|
37
42
|
workerId: string;
|
|
38
43
|
url: string;
|
|
39
44
|
headers?: APIHeaders;
|
|
45
|
+
onResolved?: (forced: boolean) => void | Promise<void>;
|
|
40
46
|
}): Promise<unknown>;
|
|
41
47
|
/** Trigger a worker to execute immediately, ignoring busy state */
|
|
42
48
|
triggerWorker(workerId: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var p=Object.defineProperty;var b=(i,e,r)=>e in i?p(i,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):i[e]=r;var o=(i,e,r)=>(b(i,typeof e!="symbol"?e+"":e,r),r);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const k=require("axios"),n=require("@ancon/wildcat-types"),u=require("../error/createCodedError.js"),w=require("../error/isNotFoundError.js"),W=require("../error/serializeError.js"),m=require("../error/isErrorWithStatusCode.js"),x=require("../api/isNoContentResponse.js"),y=require("../shared/wait.js");require("../error/isCodedError.js");require("../error/isAPIError.js");class f{constructor(e){o(this,"busyWorkers",new Set);o(this,"enabledGroups",new Set);o(this,"groups",new Map);o(this,"workerByIdMap",new Map);o(this,"timer",null);o(this,"config",{pollerInterval:5e3,maxGroupsSize:50,maxWorkersSize:20,responseInterceptor:void 0,responseRejectionInterceptor:void 0,getIsNetworkOnline(){return!0},async getRequestHeaders(){return{}},debug(...e){console.log(...e)}});o(this,"axiosInstance");this.config={...this.config,...e??null},this.axiosInstance=k.create(),(this.config.responseInterceptor||this.config.responseRejectionInterceptor)&&this.axiosInstance.interceptors.response.use(this.config.responseInterceptor,this.config.responseRejectionInterceptor)}stopTimer(){this.timer!=null&&(this.config.debug("*stop timer*"),clearInterval(this.timer),this.timer=null)}startTimer(){if(this.timer!=null)throw u(new Error("Timer already started"),n.ErrorCode.GenericUnexpectedHangfireError);this.config.debug("*start timer*"),this.timer=setInterval(()=>{this.config.debug("*tick*",{busyWorkers:this.busyWorkers.size,enabledGroups:this.enabledGroups.size,groups:this.groups}),this.enabledGroups.forEach(e=>{const r=this.groups.get(e);r&&r.forEach(t=>this.executeWorkerRequest(t))}),this.groups.size<1&&this.stopTimer()},this.config.pollerInterval)}async waitForNetworkOnline(e=5){let r=0;for(;!this.config.getIsNetworkOnline()&&r<e+1;)r+=1,await y(1e3)}async executeWorkerRequest(e,r=!1){const t=r!==!0&&this.busyWorkers.has(e.workerId);this.config.debug("*executeWorkerRequest*",{workerId:e.workerId,isBusy:t,force:r}),t?this.config.debug("*executeWorkerRequest* worker is busy",e.workerId):(this.busyWorkers.add(e.workerId),await this.waitForNetworkOnline(),this.config.debug("*executeWorkerRequest* request",{isNetworkOnline:this.config.getIsNetworkOnline()}),this.axiosInstance({url:e.url,method:"get",timeout:this.config.pollerInterval,headers:{...await this.config.getRequestHeaders(),...e.headers}}).then(s=>{s&&!x(s)?(e.resolve(s),this.deleteWorker(e.groupId,e.workerId)):this.busyWorkers.delete(e.workerId)}).catch(s=>{if(m(s)){if(w(s)){this.config.debug("*executeWorkerRequest* worker is expired or invalid",e.workerId);const c=W(u(new Error("The Hangfire worker is expired or invalid"),n.ErrorCode.HangfireWorkerExpiredOrInvalid));e.reject(c)}else e.reject(s);this.deleteWorker(e.groupId,e.workerId)}else this.config.debug("*executeWorkerRequest* not an api error"),this.busyWorkers.delete(e.workerId)}))}deleteWorker(e,r){const t=this.groups.get(e);t&&(this.config.debug("*delete worker*",t.size,t),t.delete(r),this.workerByIdMap.delete(r),this.busyWorkers.delete(r),t.size<1&&(this.groups.delete(e),this.enabledGroups.delete(e),this.enabledGroups.size<1&&this.stopTimer()))}createWorker(e,{workerId:r,url:t,headers:s,onResolved:c}){if(!this.groups.has(e)){if(this.groups.size>=this.config.maxGroupsSize){const h=u(new Error("Max number of Hangfire groups exceeded"),n.ErrorCode.GenericUnexpectedHangfireError,{count:this.groups.size});throw this.destroy(),h}this.groups.set(e,new Map)}const a=this.groups.get(e);return new Promise((h,l)=>{if(a.has(r))throw u(new Error("Duplicate Hangfire worker ID"),n.ErrorCode.GenericUnexpectedHangfireError);if(a.size>=this.config.maxWorkersSize){const g=u(new Error("Max number of Hangfire workers in group exceeded"),n.ErrorCode.GenericUnexpectedHangfireError,{groupId:e,count:a.size});throw l(g),this.destroy(),g}const d={workerId:r,groupId:e,url:t,resolve:h,reject:l,headers:s,onResolved:c};a.set(r,d),this.workerByIdMap.set(r,d),this.enabledGroups.has(e)||this.enabledGroups.add(e),this.timer==null&&this.enabledGroups.size>0&&this.startTimer()})}triggerWorker(e){this.config.debug("*triggerWorker*");const r=this.workerByIdMap.get(e);r?this.executeWorkerRequest(r,!0):this.config.debug("*triggerWorker* worker not found",e)}triggerAllWorkers(){this.config.debug("*triggerAllWorkers*");for(const e of this.workerByIdMap.values())this.executeWorkerRequest(e)}enableWorkers(e){this.config.debug("*enable*",e),this.enabledGroups.add(e),this.groups.has(e)&&this.timer==null&&this.startTimer()}disableWorkers(e){this.config.debug("*disable*",e),this.enabledGroups.delete(e),this.enabledGroups.size<1&&this.stopTimer()}destroy(){this.config.debug("*destroy*"),this.groups.clear(),this.stopTimer()}}function E(i){return new f(i)}exports.HangfirePoller=f;exports.default=E;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var o = (
|
|
4
|
-
import
|
|
5
|
-
import { ErrorCode as
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
1
|
+
var f = Object.defineProperty;
|
|
2
|
+
var p = (i, e, r) => e in i ? f(i, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : i[e] = r;
|
|
3
|
+
var o = (i, e, r) => (p(i, typeof e != "symbol" ? e + "" : e, r), r);
|
|
4
|
+
import m from "axios";
|
|
5
|
+
import { ErrorCode as n } from "@ancon/wildcat-types";
|
|
6
|
+
import a from "../error/createCodedError.mjs";
|
|
7
|
+
import b from "../error/isNotFoundError.mjs";
|
|
8
|
+
import k from "../error/serializeError.mjs";
|
|
9
|
+
import w from "../error/isErrorWithStatusCode.mjs";
|
|
10
|
+
import W from "../api/isNoContentResponse.mjs";
|
|
11
|
+
import x from "../shared/wait.mjs";
|
|
12
12
|
import "../error/isCodedError.mjs";
|
|
13
13
|
import "../error/isAPIError.mjs";
|
|
14
|
-
class
|
|
14
|
+
class y {
|
|
15
15
|
constructor(e) {
|
|
16
16
|
/** Workers currently executing a request */
|
|
17
17
|
o(this, "busyWorkers", /* @__PURE__ */ new Set());
|
|
@@ -26,6 +26,8 @@ class x {
|
|
|
26
26
|
pollerInterval: 5e3,
|
|
27
27
|
maxGroupsSize: 50,
|
|
28
28
|
maxWorkersSize: 20,
|
|
29
|
+
responseInterceptor: void 0,
|
|
30
|
+
responseRejectionInterceptor: void 0,
|
|
29
31
|
getIsNetworkOnline() {
|
|
30
32
|
return !0;
|
|
31
33
|
},
|
|
@@ -36,19 +38,23 @@ class x {
|
|
|
36
38
|
console.log(...e);
|
|
37
39
|
}
|
|
38
40
|
});
|
|
41
|
+
o(this, "axiosInstance");
|
|
39
42
|
this.config = {
|
|
40
43
|
...this.config,
|
|
41
44
|
...e ?? null
|
|
42
|
-
}
|
|
45
|
+
}, this.axiosInstance = m.create(), (this.config.responseInterceptor || this.config.responseRejectionInterceptor) && this.axiosInstance.interceptors.response.use(
|
|
46
|
+
this.config.responseInterceptor,
|
|
47
|
+
this.config.responseRejectionInterceptor
|
|
48
|
+
);
|
|
43
49
|
}
|
|
44
50
|
stopTimer() {
|
|
45
51
|
this.timer != null && (this.config.debug("*stop timer*"), clearInterval(this.timer), this.timer = null);
|
|
46
52
|
}
|
|
47
53
|
startTimer() {
|
|
48
54
|
if (this.timer != null)
|
|
49
|
-
throw
|
|
55
|
+
throw a(
|
|
50
56
|
new Error("Timer already started"),
|
|
51
|
-
|
|
57
|
+
n.GenericUnexpectedHangfireError
|
|
52
58
|
);
|
|
53
59
|
this.config.debug("*start timer*"), this.timer = setInterval(() => {
|
|
54
60
|
this.config.debug("*tick*", {
|
|
@@ -64,7 +70,7 @@ class x {
|
|
|
64
70
|
async waitForNetworkOnline(e = 5) {
|
|
65
71
|
let r = 0;
|
|
66
72
|
for (; !this.config.getIsNetworkOnline() && r < e + 1; )
|
|
67
|
-
r += 1, await
|
|
73
|
+
r += 1, await x(1e3);
|
|
68
74
|
}
|
|
69
75
|
async executeWorkerRequest(e, r = !1) {
|
|
70
76
|
const t = r !== !0 && this.busyWorkers.has(e.workerId);
|
|
@@ -77,7 +83,7 @@ class x {
|
|
|
77
83
|
e.workerId
|
|
78
84
|
) : (this.busyWorkers.add(e.workerId), await this.waitForNetworkOnline(), this.config.debug("*executeWorkerRequest* request", {
|
|
79
85
|
isNetworkOnline: this.config.getIsNetworkOnline()
|
|
80
|
-
}),
|
|
86
|
+
}), this.axiosInstance({
|
|
81
87
|
url: e.url,
|
|
82
88
|
method: "get",
|
|
83
89
|
timeout: this.config.pollerInterval,
|
|
@@ -85,24 +91,24 @@ class x {
|
|
|
85
91
|
...await this.config.getRequestHeaders(),
|
|
86
92
|
...e.headers
|
|
87
93
|
}
|
|
88
|
-
}).then((
|
|
89
|
-
|
|
90
|
-
}).catch((
|
|
91
|
-
if (
|
|
92
|
-
if (
|
|
94
|
+
}).then((s) => {
|
|
95
|
+
s && !W(s) ? (e.resolve(s), this.deleteWorker(e.groupId, e.workerId)) : this.busyWorkers.delete(e.workerId);
|
|
96
|
+
}).catch((s) => {
|
|
97
|
+
if (w(s)) {
|
|
98
|
+
if (b(s)) {
|
|
93
99
|
this.config.debug(
|
|
94
100
|
"*executeWorkerRequest* worker is expired or invalid",
|
|
95
101
|
e.workerId
|
|
96
102
|
);
|
|
97
|
-
const
|
|
98
|
-
|
|
103
|
+
const u = k(
|
|
104
|
+
a(
|
|
99
105
|
new Error("The Hangfire worker is expired or invalid"),
|
|
100
|
-
|
|
106
|
+
n.HangfireWorkerExpiredOrInvalid
|
|
101
107
|
)
|
|
102
108
|
);
|
|
103
|
-
e.reject(
|
|
109
|
+
e.reject(u);
|
|
104
110
|
} else
|
|
105
|
-
e.reject(
|
|
111
|
+
e.reject(s);
|
|
106
112
|
this.deleteWorker(e.groupId, e.workerId);
|
|
107
113
|
} else
|
|
108
114
|
this.config.debug("*executeWorkerRequest* not an api error"), this.busyWorkers.delete(e.workerId);
|
|
@@ -115,31 +121,32 @@ class x {
|
|
|
115
121
|
createWorker(e, {
|
|
116
122
|
workerId: r,
|
|
117
123
|
url: t,
|
|
118
|
-
headers:
|
|
124
|
+
headers: s,
|
|
125
|
+
onResolved: u
|
|
119
126
|
}) {
|
|
120
127
|
if (!this.groups.has(e)) {
|
|
121
128
|
if (this.groups.size >= this.config.maxGroupsSize) {
|
|
122
|
-
const
|
|
129
|
+
const c = a(
|
|
123
130
|
new Error("Max number of Hangfire groups exceeded"),
|
|
124
|
-
|
|
131
|
+
n.GenericUnexpectedHangfireError,
|
|
125
132
|
{ count: this.groups.size }
|
|
126
133
|
);
|
|
127
|
-
throw this.destroy(),
|
|
134
|
+
throw this.destroy(), c;
|
|
128
135
|
}
|
|
129
136
|
this.groups.set(e, /* @__PURE__ */ new Map());
|
|
130
137
|
}
|
|
131
|
-
const
|
|
132
|
-
return new Promise((
|
|
133
|
-
if (
|
|
134
|
-
throw
|
|
138
|
+
const h = this.groups.get(e);
|
|
139
|
+
return new Promise((c, l) => {
|
|
140
|
+
if (h.has(r))
|
|
141
|
+
throw a(
|
|
135
142
|
new Error("Duplicate Hangfire worker ID"),
|
|
136
|
-
|
|
143
|
+
n.GenericUnexpectedHangfireError
|
|
137
144
|
);
|
|
138
|
-
if (
|
|
139
|
-
const d =
|
|
145
|
+
if (h.size >= this.config.maxWorkersSize) {
|
|
146
|
+
const d = a(
|
|
140
147
|
new Error("Max number of Hangfire workers in group exceeded"),
|
|
141
|
-
|
|
142
|
-
{ groupId: e, count:
|
|
148
|
+
n.GenericUnexpectedHangfireError,
|
|
149
|
+
{ groupId: e, count: h.size }
|
|
143
150
|
);
|
|
144
151
|
throw l(d), this.destroy(), d;
|
|
145
152
|
}
|
|
@@ -147,11 +154,12 @@ class x {
|
|
|
147
154
|
workerId: r,
|
|
148
155
|
groupId: e,
|
|
149
156
|
url: t,
|
|
150
|
-
resolve:
|
|
157
|
+
resolve: c,
|
|
151
158
|
reject: l,
|
|
152
|
-
headers:
|
|
159
|
+
headers: s,
|
|
160
|
+
onResolved: u
|
|
153
161
|
};
|
|
154
|
-
|
|
162
|
+
h.set(r, g), this.workerByIdMap.set(r, g), this.enabledGroups.has(e) || this.enabledGroups.add(e), this.timer == null && this.enabledGroups.size > 0 && this.startTimer();
|
|
155
163
|
});
|
|
156
164
|
}
|
|
157
165
|
/** Trigger a worker to execute immediately, ignoring busy state */
|
|
@@ -177,10 +185,10 @@ class x {
|
|
|
177
185
|
this.config.debug("*destroy*"), this.groups.clear(), this.stopTimer();
|
|
178
186
|
}
|
|
179
187
|
}
|
|
180
|
-
function
|
|
181
|
-
return new
|
|
188
|
+
function O(i) {
|
|
189
|
+
return new y(i);
|
|
182
190
|
}
|
|
183
191
|
export {
|
|
184
|
-
|
|
185
|
-
|
|
192
|
+
y as HangfirePoller,
|
|
193
|
+
O as default
|
|
186
194
|
};
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import type { APIHeaders, APIParams, APIPostRequest, APIPutRequest } from '@ancon/wildcat-types';
|
|
2
|
-
import type {
|
|
2
|
+
import type { AxiosResponse } from 'axios';
|
|
3
3
|
import { HangfirePoller } from './createHangfirePoller';
|
|
4
|
+
declare type MakeHangfireRequestWorkerOptions = {
|
|
5
|
+
headers?: APIHeaders;
|
|
6
|
+
/**
|
|
7
|
+
* @param forced Forced indicates it was triggered by an event rather than via polling
|
|
8
|
+
*/
|
|
9
|
+
onWorkerResolved?: (forced: boolean) => void | Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
declare type MakeHangfireRequestOptions = {
|
|
12
|
+
/** Optional callback on successful init response */
|
|
13
|
+
onInitResponse?: () => void | Promise<void>;
|
|
14
|
+
workerOptions?: MakeHangfireRequestWorkerOptions;
|
|
15
|
+
};
|
|
4
16
|
/**
|
|
5
17
|
*
|
|
6
18
|
* @param hangfirePoller `HangfirePoller` instance from `createHangfirePoller()`
|
|
7
19
|
* @returns `makeHangfireRequest()` callback function
|
|
8
20
|
*/
|
|
9
|
-
declare function createMakeHangfireRequest(hangfirePoller: HangfirePoller): <TData extends Record<string, any>, TParams extends APIParams>(request: APIPostRequest<unknown, TData, TParams> | APIPutRequest<unknown, TData, TParams>, data: TData, params: TParams, groupId: string,
|
|
21
|
+
declare function createMakeHangfireRequest(hangfirePoller: HangfirePoller): <TData extends Record<string, any>, TParams extends APIParams>(request: APIPostRequest<unknown, TData, TParams> | APIPutRequest<unknown, TData, TParams>, data: TData, params: TParams, groupId: string, options?: MakeHangfireRequestOptions) => Promise<AxiosResponse>;
|
|
10
22
|
export default createMakeHangfireRequest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const
|
|
1
|
+
"use strict";const h=require("./isHangfireResponse.js");require("../api/isAcceptedResponse.js");function q(r,u){return`${r.config.baseURL??""}/${r.config.url??""}/status/${u}`}function t(r){return async function(R,n,w,l,e){var c,f,k,d;const a=await R(n,w,(c=e==null?void 0:e.workerOptions)==null?void 0:c.headers);if(await((f=e==null?void 0:e.onInitResponse)==null?void 0:f.call(e)),h(a)){const g=a.data.id;return r.createWorker(l,{workerId:g,url:q(a,g),headers:(k=e==null?void 0:e.workerOptions)==null?void 0:k.headers,onResolved:(d=e==null?void 0:e.workerOptions)==null?void 0:d.onWorkerResolved})}return a}}module.exports=t;
|
|
@@ -1,22 +1,24 @@
|
|
|
1
|
-
import
|
|
1
|
+
import n from "./isHangfireResponse.mjs";
|
|
2
2
|
import "../api/isAcceptedResponse.mjs";
|
|
3
|
-
function
|
|
4
|
-
return `${r.config.baseURL ?? ""}/${r.config.url ?? ""}/status/${
|
|
3
|
+
function t(r, u) {
|
|
4
|
+
return `${r.config.baseURL ?? ""}/${r.config.url ?? ""}/status/${u}`;
|
|
5
5
|
}
|
|
6
|
-
function
|
|
7
|
-
return async function(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
6
|
+
function O(r) {
|
|
7
|
+
return async function(g, l, w, m, e) {
|
|
8
|
+
var f, c, d, k;
|
|
9
|
+
const a = await g(l, w, (f = e == null ? void 0 : e.workerOptions) == null ? void 0 : f.headers);
|
|
10
|
+
if (await ((c = e == null ? void 0 : e.onInitResponse) == null ? void 0 : c.call(e)), n(a)) {
|
|
11
|
+
const R = a.data.id;
|
|
12
|
+
return r.createWorker(m, {
|
|
13
|
+
workerId: R,
|
|
14
|
+
url: t(a, R),
|
|
15
|
+
headers: (d = e == null ? void 0 : e.workerOptions) == null ? void 0 : d.headers,
|
|
16
|
+
onResolved: (k = e == null ? void 0 : e.workerOptions) == null ? void 0 : k.onWorkerResolved
|
|
15
17
|
});
|
|
16
18
|
}
|
|
17
|
-
return
|
|
19
|
+
return a;
|
|
18
20
|
};
|
|
19
21
|
}
|
|
20
22
|
export {
|
|
21
|
-
|
|
23
|
+
O as default
|
|
22
24
|
};
|