@nsshunt/ststestrunner 1.1.105 → 1.1.107
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/dist/ststestrunner.cjs +307 -82
- package/dist/ststestrunner.cjs.map +1 -1
- package/dist/ststestrunner.mjs +307 -82
- package/dist/ststestrunner.mjs.map +1 -1
- package/package.json +3 -2
- package/types/libmodule/authHelper.d.ts +37 -0
- package/types/libmodule/authHelper.d.ts.map +1 -0
- package/types/libmodule/clientHelper.d.ts +32 -0
- package/types/libmodule/clientHelper.d.ts.map +1 -0
- package/types/libmodule/lockHelper.d.ts +8 -0
- package/types/libmodule/lockHelper.d.ts.map +1 -0
- package/types/libmodule/workerFhirTestCases.d.ts +6 -28
- package/types/libmodule/workerFhirTestCases.d.ts.map +1 -1
package/dist/ststestrunner.mjs
CHANGED
|
@@ -2,11 +2,12 @@ import { AbstractRunnerExecutionWorker } from "@nsshunt/stsrunnerframework";
|
|
|
2
2
|
import { STSAxiosConfig, Sleep, createAgentManager, isNode } from "@nsshunt/stsutils";
|
|
3
3
|
import chalk from "chalk";
|
|
4
4
|
import axios from "axios";
|
|
5
|
-
import { FhirRESTClient, FhirSocketClientAllInOne, FhirSocketClientIndividual, createRetryAxiosClient } from "@nsshunt/stsfhirclient";
|
|
6
5
|
import http from "node:http";
|
|
7
6
|
import https from "node:https";
|
|
7
|
+
import { FhirRESTClient, FhirSocketClientAllInOne, FhirSocketClientIndividual, createRetryAxiosClient } from "@nsshunt/stsfhirclient";
|
|
8
8
|
//#region \0rolldown/runtime.js
|
|
9
9
|
var __defProp = Object.defineProperty;
|
|
10
|
+
var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
|
|
10
11
|
var __exportAll = (all, no_symbols) => {
|
|
11
12
|
let target = {};
|
|
12
13
|
for (var name in all) __defProp(target, name, {
|
|
@@ -469,14 +470,14 @@ var TestCaseFhirBase = class {
|
|
|
469
470
|
if (axiosError.response.status === StatusCodes.UNAUTHORIZED) {
|
|
470
471
|
this.runner.instrumentData.authenticationErrorCount++;
|
|
471
472
|
this.Error(chalk.red(`TestCaseFhirBase:HandleError(): [${this._id}] UNAUTHORIZED - Reset Access Token`));
|
|
472
|
-
this.runnerExecutionWorker.ResetAccessToken();
|
|
473
|
+
this.runnerExecutionWorker.authHelper.ResetAccessToken();
|
|
473
474
|
return true;
|
|
474
475
|
}
|
|
475
476
|
} else this.Error(chalk.red(`TestCaseFhirBase:HandleError(): [${this._id}] AXIOS Error = [${axiosError}]`));
|
|
476
477
|
} else if (error.message === "UNAUTHORIZED") {
|
|
477
478
|
this.runner.instrumentData.authenticationErrorCount++;
|
|
478
479
|
this.Error(chalk.red(`TestCaseFhirBase:HandleError(): [${this._id}] UNAUTHORIZED - Reset Access Token`));
|
|
479
|
-
this.runnerExecutionWorker.ResetAccessToken();
|
|
480
|
+
this.runnerExecutionWorker.authHelper.ResetAccessToken();
|
|
480
481
|
return true;
|
|
481
482
|
}
|
|
482
483
|
return false;
|
|
@@ -703,9 +704,9 @@ var TestCaseFhirQueryBase = class extends TestCaseFhirBase {
|
|
|
703
704
|
var TestCaseFhir01 = class extends TestCaseFhirQueryBase {
|
|
704
705
|
PerformExecuteQuery = async () => {
|
|
705
706
|
const __snapshot1 = performance.now();
|
|
706
|
-
await this.runnerExecutionWorker.GetAccessToken();
|
|
707
|
+
await this.runnerExecutionWorker.authHelper.GetAccessToken();
|
|
707
708
|
this._CheckOutputLongDurationError(__snapshot1, "await this.GetAccessToken()");
|
|
708
|
-
this.runnerExecutionWorker.ResetAccessToken();
|
|
709
|
+
this.runnerExecutionWorker.authHelper.ResetAccessToken();
|
|
709
710
|
return null;
|
|
710
711
|
};
|
|
711
712
|
};
|
|
@@ -36033,78 +36034,99 @@ var ResourceDataGenerator = class {
|
|
|
36033
36034
|
};
|
|
36034
36035
|
};
|
|
36035
36036
|
//#endregion
|
|
36036
|
-
//#region src/libmodule/
|
|
36037
|
-
var
|
|
36037
|
+
//#region src/libmodule/lockHelper.ts
|
|
36038
|
+
var import_tiny_emitter = (/* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
36039
|
+
function E() {}
|
|
36040
|
+
E.prototype = {
|
|
36041
|
+
on: function(name, callback, ctx) {
|
|
36042
|
+
var e = this.e || (this.e = {});
|
|
36043
|
+
(e[name] || (e[name] = [])).push({
|
|
36044
|
+
fn: callback,
|
|
36045
|
+
ctx
|
|
36046
|
+
});
|
|
36047
|
+
return this;
|
|
36048
|
+
},
|
|
36049
|
+
once: function(name, callback, ctx) {
|
|
36050
|
+
var self = this;
|
|
36051
|
+
function listener() {
|
|
36052
|
+
self.off(name, listener);
|
|
36053
|
+
callback.apply(ctx, arguments);
|
|
36054
|
+
}
|
|
36055
|
+
listener._ = callback;
|
|
36056
|
+
return this.on(name, listener, ctx);
|
|
36057
|
+
},
|
|
36058
|
+
emit: function(name) {
|
|
36059
|
+
var data = [].slice.call(arguments, 1);
|
|
36060
|
+
var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
|
|
36061
|
+
var i = 0;
|
|
36062
|
+
var len = evtArr.length;
|
|
36063
|
+
for (; i < len; i++) evtArr[i].fn.apply(evtArr[i].ctx, data);
|
|
36064
|
+
return this;
|
|
36065
|
+
},
|
|
36066
|
+
off: function(name, callback) {
|
|
36067
|
+
var e = this.e || (this.e = {});
|
|
36068
|
+
var evts = e[name];
|
|
36069
|
+
var liveEvents = [];
|
|
36070
|
+
if (evts && callback) {
|
|
36071
|
+
for (var i = 0, len = evts.length; i < len; i++) if (evts[i].fn !== callback && evts[i].fn._ !== callback) liveEvents.push(evts[i]);
|
|
36072
|
+
}
|
|
36073
|
+
liveEvents.length ? e[name] = liveEvents : delete e[name];
|
|
36074
|
+
return this;
|
|
36075
|
+
}
|
|
36076
|
+
};
|
|
36077
|
+
module.exports = E;
|
|
36078
|
+
module.exports.TinyEmitter = E;
|
|
36079
|
+
})))();
|
|
36080
|
+
var LockHelper = class {
|
|
36081
|
+
_onHoldKeys = {};
|
|
36082
|
+
GetOnHold = (holdKey) => {
|
|
36083
|
+
if (this._onHoldKeys[holdKey]) return true;
|
|
36084
|
+
return false;
|
|
36085
|
+
};
|
|
36086
|
+
WaitOnHold = async (holdKey, timeout) => {
|
|
36087
|
+
const start = performance.now();
|
|
36088
|
+
for (;;) {
|
|
36089
|
+
if (this._onHoldKeys[holdKey]) await Sleep(100);
|
|
36090
|
+
else break;
|
|
36091
|
+
if (performance.now() - start > timeout) throw new Error(`WorkerFhirTestCases:WaitOnHold(): Timeout: [${timeout}] reached.`);
|
|
36092
|
+
}
|
|
36093
|
+
return true;
|
|
36094
|
+
};
|
|
36095
|
+
SetOnHold = (holdKey) => {
|
|
36096
|
+
this._onHoldKeys[holdKey] = true;
|
|
36097
|
+
};
|
|
36098
|
+
ReleaseOnHold = (holdKey) => {
|
|
36099
|
+
delete this._onHoldKeys[holdKey];
|
|
36100
|
+
};
|
|
36101
|
+
};
|
|
36102
|
+
//#endregion
|
|
36103
|
+
//#region src/libmodule/authHelper.ts
|
|
36104
|
+
var AuthHelper = class extends import_tiny_emitter.TinyEmitter {
|
|
36038
36105
|
_options;
|
|
36039
|
-
_resourceDataGenerator;
|
|
36040
|
-
fhirClient = void 0;
|
|
36041
36106
|
_id = crypto.randomUUID();
|
|
36042
|
-
|
|
36107
|
+
_lockHelper = new LockHelper();
|
|
36043
36108
|
#accesssToken = null;
|
|
36044
36109
|
_authMaxTimeout = 5e3;
|
|
36045
36110
|
#originRegex = /^(api:\/\/\w+)/;
|
|
36046
36111
|
#authAgentManager;
|
|
36047
|
-
restFhirClient = null;
|
|
36048
36112
|
logPrefix = `WorkerFhirTestCases:[${this._id}]:`;
|
|
36049
36113
|
constructor(options) {
|
|
36050
36114
|
super();
|
|
36051
36115
|
this._options = options;
|
|
36052
|
-
this._resourceDataGenerator = new ResourceDataGenerator();
|
|
36053
36116
|
this.#authAgentManager = this.GetAuthAgentManager();
|
|
36054
36117
|
}
|
|
36055
36118
|
Warning = (message) => {
|
|
36056
|
-
this.logger.warn(`${this.logPrefix}${message}`);
|
|
36119
|
+
this._options.logger.warn(`${this.logPrefix}${message}`);
|
|
36057
36120
|
};
|
|
36058
36121
|
Error = (message) => {
|
|
36059
|
-
this.logger.error(`${this.logPrefix}${message}`);
|
|
36122
|
+
this._options.logger.error(`${this.logPrefix}${message}`);
|
|
36060
36123
|
};
|
|
36061
36124
|
Debug = (message) => {
|
|
36062
|
-
this.logger.debug(`${this.logPrefix}${message}`);
|
|
36125
|
+
this._options.logger.debug(`${this.logPrefix}${message}`);
|
|
36063
36126
|
};
|
|
36064
36127
|
get id() {
|
|
36065
36128
|
return this._id;
|
|
36066
36129
|
}
|
|
36067
|
-
get resourceDataGenerator() {
|
|
36068
|
-
return this._resourceDataGenerator;
|
|
36069
|
-
}
|
|
36070
|
-
get logger() {
|
|
36071
|
-
return this._options.logger;
|
|
36072
|
-
}
|
|
36073
|
-
CreateAsyncRunner = async (testRunnerTelemetryPayload) => {
|
|
36074
|
-
return AsyncRunnerFactory.CreateAsyncRunner(this, testRunnerTelemetryPayload);
|
|
36075
|
-
};
|
|
36076
|
-
async ProcessPreTerminateWorkerMessage(messagePayload) {
|
|
36077
|
-
this.logger.debug(chalk.rgb(220, 100, 0)(`ProcessPreTerminateWorkerMessage(): [${JSON.stringify(messagePayload, null, 2)}]`));
|
|
36078
|
-
if (this.fhirClient) {
|
|
36079
|
-
this.logger.debug(chalk.rgb(220, 100, 0)(`ProcessPreTerminateWorkerMessage(): ResetSocket()`));
|
|
36080
|
-
this.fhirClient.ResetSocket();
|
|
36081
|
-
this.fhirClient = void 0;
|
|
36082
|
-
}
|
|
36083
|
-
await Sleep(250);
|
|
36084
|
-
return {
|
|
36085
|
-
originalMessage: { ...messagePayload },
|
|
36086
|
-
myresponsepreterminate: `I got: [${JSON.stringify(messagePayload.payload.data)}]`
|
|
36087
|
-
};
|
|
36088
|
-
}
|
|
36089
|
-
GetOnHold = (holdKey) => {
|
|
36090
|
-
if (this._onHoldKeys[holdKey]) return true;
|
|
36091
|
-
return false;
|
|
36092
|
-
};
|
|
36093
|
-
WaitOnHold = async (holdKey, timeout) => {
|
|
36094
|
-
const start = performance.now();
|
|
36095
|
-
for (;;) {
|
|
36096
|
-
if (this._onHoldKeys[holdKey]) await Sleep(100);
|
|
36097
|
-
else break;
|
|
36098
|
-
if (performance.now() - start > timeout) throw new Error(`WorkerFhirTestCases:WaitOnHold(): Timeout: [${timeout}] reached.`);
|
|
36099
|
-
}
|
|
36100
|
-
return true;
|
|
36101
|
-
};
|
|
36102
|
-
SetOnHold = (holdKey) => {
|
|
36103
|
-
this._onHoldKeys[holdKey] = true;
|
|
36104
|
-
};
|
|
36105
|
-
ReleaseOnHold = (holdKey) => {
|
|
36106
|
-
delete this._onHoldKeys[holdKey];
|
|
36107
|
-
};
|
|
36108
36130
|
defaultAgentOptions = {
|
|
36109
36131
|
keepAlive: true,
|
|
36110
36132
|
maxSockets: 10,
|
|
@@ -36160,9 +36182,6 @@ var WorkerFhirTestCases = class extends AbstractRunnerExecutionWorker {
|
|
|
36160
36182
|
});
|
|
36161
36183
|
return agentManager;
|
|
36162
36184
|
};
|
|
36163
|
-
GetFhirAgentManager = () => {
|
|
36164
|
-
return this.GetAgentManager(this._options.fhirOptions.stsfhiragentOptions);
|
|
36165
|
-
};
|
|
36166
36185
|
GetAuthAgentManager = () => {
|
|
36167
36186
|
return this.GetAgentManager(this._options.authOptions.asagentoptions);
|
|
36168
36187
|
};
|
|
@@ -36218,14 +36237,14 @@ var WorkerFhirTestCases = class extends AbstractRunnerExecutionWorker {
|
|
|
36218
36237
|
retryJitterMs: 150,
|
|
36219
36238
|
maxRetryDurationMs: 5e3,
|
|
36220
36239
|
onRetryAttempt: (attempt, error, delayMs) => {
|
|
36221
|
-
this.
|
|
36222
|
-
this.
|
|
36240
|
+
this.emit("authenticationErrorCount", 1);
|
|
36241
|
+
this.emit("authenticationRetryCount", 1);
|
|
36223
36242
|
const message = `GetAPITokenFromAuthServerUsingScope(): [${this._id}] Retry #${attempt} after ${delayMs}ms due to ${error.code || error.response?.status}`;
|
|
36224
36243
|
this.Warning(message);
|
|
36225
|
-
this.
|
|
36244
|
+
this.emit("logMessage", chalk.red(message));
|
|
36226
36245
|
}
|
|
36227
36246
|
})(url, axiosConfig.config);
|
|
36228
|
-
this.
|
|
36247
|
+
this.emit("authenticationCount", 1);
|
|
36229
36248
|
stage = "7";
|
|
36230
36249
|
if (retVal.status) {
|
|
36231
36250
|
if (retVal.status !== 200) this.Warning(chalk.magenta(`GetAPITokenFromAuthServerUsingScope(): [${this._id}] Invalid response from server: [${retVal.status}]`));
|
|
@@ -36263,11 +36282,11 @@ var WorkerFhirTestCases = class extends AbstractRunnerExecutionWorker {
|
|
|
36263
36282
|
if (this.#accesssToken) return this.#accesssToken;
|
|
36264
36283
|
const lockKey = "GetAccessToken";
|
|
36265
36284
|
const lockTimeout = 6e4;
|
|
36266
|
-
if (this.GetOnHold(lockKey) === true) {
|
|
36285
|
+
if (this._lockHelper.GetOnHold(lockKey) === true) {
|
|
36267
36286
|
this.Debug(chalk.magenta(`GetAccessToken(): accesssToken does not exist - some other client setting up the new accesssToken (on hold/lock), lock key: [${lockKey}] - waiting ...`));
|
|
36268
36287
|
try {
|
|
36269
36288
|
const miniStart = performance.now();
|
|
36270
|
-
await this.WaitOnHold(lockKey, lockTimeout);
|
|
36289
|
+
await this._lockHelper.WaitOnHold(lockKey, lockTimeout);
|
|
36271
36290
|
this.Debug(chalk.yellow(`GetAccessToken(): hold (lock) released after: [${performance.now() - miniStart}ms], lock key: [${lockKey}]`));
|
|
36272
36291
|
if (this.#accesssToken) {
|
|
36273
36292
|
this.Debug(chalk.green(`GetAccessToken(): Getting existing accesssToken (post hold release), lock key: [${lockKey}]`));
|
|
@@ -36282,7 +36301,7 @@ var WorkerFhirTestCases = class extends AbstractRunnerExecutionWorker {
|
|
|
36282
36301
|
}
|
|
36283
36302
|
this.Debug(chalk.yellow(`GetAccessToken(): accesssToken does not exist - setting up new accesssToken`));
|
|
36284
36303
|
this.Debug(chalk.yellow(`GetAccessToken(): setting hold (lock), lock key: [${lockKey}]`));
|
|
36285
|
-
this.SetOnHold(lockKey);
|
|
36304
|
+
this._lockHelper.SetOnHold(lockKey);
|
|
36286
36305
|
timeout = setTimeout(() => {
|
|
36287
36306
|
this.Warning(chalk.magenta(`GetAccessToken(): Timeout: [${this._authMaxTimeout}] exceeded for getting access token ...`));
|
|
36288
36307
|
}, this._authMaxTimeout);
|
|
@@ -36298,8 +36317,8 @@ var WorkerFhirTestCases = class extends AbstractRunnerExecutionWorker {
|
|
|
36298
36317
|
const totalTime = performance.now() - start;
|
|
36299
36318
|
if (totalTime > this._authMaxTimeout) this.Warning(chalk.magenta(`GetAccessToken(): The total time for getting the access token: [${totalTime}]`));
|
|
36300
36319
|
this.#accesssToken = workingAaccesssToken;
|
|
36301
|
-
this.ReleaseOnHold(lockKey);
|
|
36302
|
-
this.Debug(chalk.yellow(`GetAccessToken(): release hold (lock) Time taken for get access token: [${performance.now() - start}ms]`));
|
|
36320
|
+
this._lockHelper.ReleaseOnHold(lockKey);
|
|
36321
|
+
this.Debug(chalk.yellow(`GetAccessToken(): release hold (lock) Time taken for get access token: [${performance.now() - start}ms], lock key: [${lockKey}]`));
|
|
36303
36322
|
return this.#accesssToken;
|
|
36304
36323
|
} catch (error) {
|
|
36305
36324
|
if (timeout) clearTimeout(timeout);
|
|
@@ -36336,16 +36355,100 @@ var WorkerFhirTestCases = class extends AbstractRunnerExecutionWorker {
|
|
|
36336
36355
|
ResetAccessToken = () => {
|
|
36337
36356
|
this.#accesssToken = null;
|
|
36338
36357
|
};
|
|
36358
|
+
};
|
|
36359
|
+
//#endregion
|
|
36360
|
+
//#region src/libmodule/clientHelper.ts
|
|
36361
|
+
var ClientHelper = class extends import_tiny_emitter.TinyEmitter {
|
|
36362
|
+
_options;
|
|
36363
|
+
fhirClient = void 0;
|
|
36364
|
+
_id = crypto.randomUUID();
|
|
36365
|
+
_lockHelper = new LockHelper();
|
|
36366
|
+
restFhirClient = null;
|
|
36367
|
+
logPrefix = `WorkerFhirTestCases:[${this._id}]:`;
|
|
36368
|
+
constructor(options) {
|
|
36369
|
+
super();
|
|
36370
|
+
this._options = options;
|
|
36371
|
+
}
|
|
36372
|
+
Warning = (message) => {
|
|
36373
|
+
this._options.logger.warn(`${this.logPrefix}${message}`);
|
|
36374
|
+
};
|
|
36375
|
+
Error = (message) => {
|
|
36376
|
+
this._options.logger.error(`${this.logPrefix}${message}`);
|
|
36377
|
+
};
|
|
36378
|
+
Debug = (message) => {
|
|
36379
|
+
this._options.logger.debug(`${this.logPrefix}${message}`);
|
|
36380
|
+
};
|
|
36381
|
+
get id() {
|
|
36382
|
+
return this._id;
|
|
36383
|
+
}
|
|
36384
|
+
defaultAgentOptions = {
|
|
36385
|
+
keepAlive: true,
|
|
36386
|
+
maxSockets: 10,
|
|
36387
|
+
maxTotalSockets: 20,
|
|
36388
|
+
maxFreeSockets: 10,
|
|
36389
|
+
timeout: 6e4,
|
|
36390
|
+
rejectUnauthorized: false
|
|
36391
|
+
};
|
|
36392
|
+
stressTestAgentOptions = {
|
|
36393
|
+
keepAlive: true,
|
|
36394
|
+
maxSockets: 200,
|
|
36395
|
+
maxTotalSockets: 500,
|
|
36396
|
+
maxFreeSockets: 50,
|
|
36397
|
+
timeout: 3e4,
|
|
36398
|
+
rejectUnauthorized: false
|
|
36399
|
+
};
|
|
36400
|
+
stressTestExtremeAgentOptions = {
|
|
36401
|
+
keepAlive: true,
|
|
36402
|
+
maxSockets: 500,
|
|
36403
|
+
maxTotalSockets: 1e3,
|
|
36404
|
+
maxFreeSockets: 500,
|
|
36405
|
+
timeout: 3e4,
|
|
36406
|
+
rejectUnauthorized: false
|
|
36407
|
+
};
|
|
36408
|
+
GetAgentManager = (testingAgentOptions) => {
|
|
36409
|
+
let agentManager = void 0;
|
|
36410
|
+
let agentOptions = void 0;
|
|
36411
|
+
switch (testingAgentOptions.nodeAgentMode) {
|
|
36412
|
+
case "no-agent": break;
|
|
36413
|
+
case "custom-agent-options":
|
|
36414
|
+
if (testingAgentOptions.nodeAgentCustomOptions) agentOptions = { ...testingAgentOptions.nodeAgentCustomOptions };
|
|
36415
|
+
else agentOptions = { ...this.defaultAgentOptions };
|
|
36416
|
+
break;
|
|
36417
|
+
case "default-agent-options":
|
|
36418
|
+
agentOptions = { ...this.defaultAgentOptions };
|
|
36419
|
+
break;
|
|
36420
|
+
case "stress-test-agent-options":
|
|
36421
|
+
agentOptions = { ...this.stressTestAgentOptions };
|
|
36422
|
+
break;
|
|
36423
|
+
case "stress-test-extreme-agent-options":
|
|
36424
|
+
agentOptions = { ...this.stressTestExtremeAgentOptions };
|
|
36425
|
+
break;
|
|
36426
|
+
default: throw new Error(`TestCaseFhirBase:GetAgentManager(): [${this._id}] unknown nodeAgentMode: [${testingAgentOptions.nodeAgentMode}]`);
|
|
36427
|
+
}
|
|
36428
|
+
if (agentOptions) agentManager = createAgentManager({
|
|
36429
|
+
agentOptions,
|
|
36430
|
+
httpAgentFactory(options) {
|
|
36431
|
+
return new http.Agent(options);
|
|
36432
|
+
},
|
|
36433
|
+
httpsAgentFactory(options) {
|
|
36434
|
+
return new https.Agent(options);
|
|
36435
|
+
}
|
|
36436
|
+
});
|
|
36437
|
+
return agentManager;
|
|
36438
|
+
};
|
|
36439
|
+
GetFhirAgentManager = () => {
|
|
36440
|
+
return this.GetAgentManager(this._options.fhirOptions.stsfhiragentOptions);
|
|
36441
|
+
};
|
|
36339
36442
|
GetFhirSocketClient = async () => {
|
|
36340
36443
|
try {
|
|
36341
36444
|
if (this.fhirClient) return this.fhirClient;
|
|
36342
36445
|
const lockKey = "GetFhirSocketClient";
|
|
36343
36446
|
const lockTimeout = 6e4;
|
|
36344
|
-
if (this.GetOnHold(lockKey) === true) {
|
|
36447
|
+
if (this._lockHelper.GetOnHold(lockKey) === true) {
|
|
36345
36448
|
this.Debug(chalk.magenta(`GetFhirSocketClient(): fhir client does not exist - some other client setting up the new client (on hold/lock), lock key: [${lockKey}] - waiting ...`));
|
|
36346
36449
|
try {
|
|
36347
36450
|
const start = performance.now();
|
|
36348
|
-
await this.WaitOnHold(lockKey, lockTimeout);
|
|
36451
|
+
await this._lockHelper.WaitOnHold(lockKey, lockTimeout);
|
|
36349
36452
|
this.Debug(chalk.yellow(`GetFhirSocketClient(): hold (lock) released after: [${performance.now() - start}ms], lock key: [${lockKey}]`));
|
|
36350
36453
|
if (this.fhirClient) {
|
|
36351
36454
|
this.Debug(chalk.green(`GetFhirSocketClient(): Getting existing fhir client (post hold release), lock key: [${lockKey}]`));
|
|
@@ -36361,7 +36464,7 @@ var WorkerFhirTestCases = class extends AbstractRunnerExecutionWorker {
|
|
|
36361
36464
|
const start = performance.now();
|
|
36362
36465
|
this.Debug(chalk.yellow(`GetFhirSocketClient(): fhir client does not exist - setting up new client`));
|
|
36363
36466
|
this.Debug(chalk.yellow(`GetFhirSocketClient(): setting hold (lock), lock key: [${lockKey}]`));
|
|
36364
|
-
this.SetOnHold(lockKey);
|
|
36467
|
+
this._lockHelper.SetOnHold(lockKey);
|
|
36365
36468
|
const fhirOptions = this._options.fhirOptions;
|
|
36366
36469
|
const options = {
|
|
36367
36470
|
fhirServerEndpoint: fhirOptions.stsfhirserverendpoint,
|
|
@@ -36373,18 +36476,18 @@ var WorkerFhirTestCases = class extends AbstractRunnerExecutionWorker {
|
|
|
36373
36476
|
baseUrl: fhirOptions.stsfhirbaseurl,
|
|
36374
36477
|
agentManager: this.GetFhirAgentManager(),
|
|
36375
36478
|
joinRooms: [],
|
|
36376
|
-
logger: this.logger,
|
|
36479
|
+
logger: this._options.logger,
|
|
36377
36480
|
verboseLogging: true,
|
|
36378
|
-
GetConnectionAccessToken: this.GetAccessTokenForSocketClientAccess,
|
|
36379
|
-
GetAccessToken: this.GetAccessToken
|
|
36481
|
+
GetConnectionAccessToken: this._options.authHelper.GetAccessTokenForSocketClientAccess,
|
|
36482
|
+
GetAccessToken: this._options.authHelper.GetAccessToken
|
|
36380
36483
|
};
|
|
36381
36484
|
let workingFhirClient;
|
|
36382
|
-
if (this._options.
|
|
36485
|
+
if (this._options.fhirOptions.stsfhirsocketclientmode === "socket-client-all-in-one") workingFhirClient = new FhirSocketClientAllInOne("FhirSocketClient", options);
|
|
36383
36486
|
else workingFhirClient = new FhirSocketClientIndividual("FhirSocketClient", options);
|
|
36384
36487
|
await workingFhirClient.WaitForSocketConnected();
|
|
36385
36488
|
this.Debug(chalk.yellow(`GetFhirSocketClient(): setting fhir client into object`));
|
|
36386
36489
|
this.fhirClient = workingFhirClient;
|
|
36387
|
-
this.ReleaseOnHold(lockKey);
|
|
36490
|
+
this._lockHelper.ReleaseOnHold(lockKey);
|
|
36388
36491
|
this.Debug(chalk.yellow(`GetFhirSocketClient(): release hold (lock) Time taken for socket connection and set object: [${performance.now() - start}ms], lock key: [${lockKey}]`));
|
|
36389
36492
|
return this.fhirClient;
|
|
36390
36493
|
} catch (error) {
|
|
@@ -36395,20 +36498,18 @@ var WorkerFhirTestCases = class extends AbstractRunnerExecutionWorker {
|
|
|
36395
36498
|
GetRESTClient = async () => {
|
|
36396
36499
|
if (this.restFhirClient) return this.restFhirClient;
|
|
36397
36500
|
const onRetryAttempt = (attempt, error, delayMs) => {
|
|
36398
|
-
this._options.runner.instrumentData.errorCount++;
|
|
36399
|
-
this._options.runner.instrumentData.requestCount++;
|
|
36400
36501
|
const message = `TestCaseFhirBase:onRetryAttempt(): [${this._id}] Retry #${attempt} after ${delayMs}ms due to ${error.code || error.response?.status}`;
|
|
36401
36502
|
this.Warning(message);
|
|
36402
|
-
this.
|
|
36503
|
+
this.emit("retry", message);
|
|
36403
36504
|
};
|
|
36404
36505
|
const fhirOptions = this._options.fhirOptions;
|
|
36405
36506
|
const fhirRESTClient = new FhirRESTClient({
|
|
36406
|
-
GetAccessToken: this.GetAccessToken,
|
|
36507
|
+
GetAccessToken: this._options.authHelper.GetAccessToken,
|
|
36407
36508
|
user: "USR_user01@stsmda.com.au",
|
|
36408
36509
|
endpoint: fhirOptions.stsfhirserverendpoint,
|
|
36409
36510
|
stsfhirapiroot: fhirOptions.stsfhirapiroot,
|
|
36410
36511
|
stsfhirport: fhirOptions.stsfhirport,
|
|
36411
|
-
logger: this.logger,
|
|
36512
|
+
logger: this._options.logger,
|
|
36412
36513
|
agentManager: this.GetFhirAgentManager(),
|
|
36413
36514
|
onRetryAttempt
|
|
36414
36515
|
});
|
|
@@ -36417,12 +36518,136 @@ var WorkerFhirTestCases = class extends AbstractRunnerExecutionWorker {
|
|
|
36417
36518
|
};
|
|
36418
36519
|
GetClient = async () => {
|
|
36419
36520
|
let client;
|
|
36420
|
-
if (this._options.
|
|
36521
|
+
if (this._options.fhirOptions.stsfhirsocketclientmode === "no-socket-client") client = await this.GetRESTClient();
|
|
36421
36522
|
else client = await this.GetFhirSocketClient();
|
|
36422
36523
|
return client;
|
|
36423
36524
|
};
|
|
36424
36525
|
};
|
|
36425
36526
|
//#endregion
|
|
36527
|
+
//#region src/libmodule/workerFhirTestCases.ts
|
|
36528
|
+
var WorkerFhirTestCases = class extends AbstractRunnerExecutionWorker {
|
|
36529
|
+
_options;
|
|
36530
|
+
_resourceDataGenerator;
|
|
36531
|
+
fhirClient = void 0;
|
|
36532
|
+
_id = crypto.randomUUID();
|
|
36533
|
+
_clientHelper;
|
|
36534
|
+
_authHelper;
|
|
36535
|
+
restFhirClient = null;
|
|
36536
|
+
logPrefix = `WorkerFhirTestCases:[${this._id}]:`;
|
|
36537
|
+
constructor(options) {
|
|
36538
|
+
super();
|
|
36539
|
+
this._options = options;
|
|
36540
|
+
this._resourceDataGenerator = new ResourceDataGenerator();
|
|
36541
|
+
this._authHelper = new AuthHelper({
|
|
36542
|
+
authOptions: options.authOptions,
|
|
36543
|
+
logger: options.logger
|
|
36544
|
+
});
|
|
36545
|
+
this._clientHelper = new ClientHelper({
|
|
36546
|
+
authHelper: this._authHelper,
|
|
36547
|
+
logger: options.logger,
|
|
36548
|
+
fhirOptions: options.fhirOptions
|
|
36549
|
+
});
|
|
36550
|
+
}
|
|
36551
|
+
get authHelper() {
|
|
36552
|
+
return this._authHelper;
|
|
36553
|
+
}
|
|
36554
|
+
Warning = (message) => {
|
|
36555
|
+
this.logger.warn(`${this.logPrefix}${message}`);
|
|
36556
|
+
};
|
|
36557
|
+
Error = (message) => {
|
|
36558
|
+
this.logger.error(`${this.logPrefix}${message}`);
|
|
36559
|
+
};
|
|
36560
|
+
Debug = (message) => {
|
|
36561
|
+
this.logger.debug(`${this.logPrefix}${message}`);
|
|
36562
|
+
};
|
|
36563
|
+
get id() {
|
|
36564
|
+
return this._id;
|
|
36565
|
+
}
|
|
36566
|
+
get resourceDataGenerator() {
|
|
36567
|
+
return this._resourceDataGenerator;
|
|
36568
|
+
}
|
|
36569
|
+
get logger() {
|
|
36570
|
+
return this._options.logger;
|
|
36571
|
+
}
|
|
36572
|
+
CreateAsyncRunner = async (testRunnerTelemetryPayload) => {
|
|
36573
|
+
return AsyncRunnerFactory.CreateAsyncRunner(this, testRunnerTelemetryPayload);
|
|
36574
|
+
};
|
|
36575
|
+
async ProcessPreTerminateWorkerMessage(messagePayload) {
|
|
36576
|
+
this.logger.debug(chalk.rgb(220, 100, 0)(`ProcessPreTerminateWorkerMessage(): [${JSON.stringify(messagePayload, null, 2)}]`));
|
|
36577
|
+
if (this.fhirClient) {
|
|
36578
|
+
this.logger.debug(chalk.rgb(220, 100, 0)(`ProcessPreTerminateWorkerMessage(): ResetSocket()`));
|
|
36579
|
+
this.fhirClient.ResetSocket();
|
|
36580
|
+
this.fhirClient = void 0;
|
|
36581
|
+
}
|
|
36582
|
+
await Sleep(250);
|
|
36583
|
+
return {
|
|
36584
|
+
originalMessage: { ...messagePayload },
|
|
36585
|
+
myresponsepreterminate: `I got: [${JSON.stringify(messagePayload.payload.data)}]`
|
|
36586
|
+
};
|
|
36587
|
+
}
|
|
36588
|
+
defaultAgentOptions = {
|
|
36589
|
+
keepAlive: true,
|
|
36590
|
+
maxSockets: 10,
|
|
36591
|
+
maxTotalSockets: 20,
|
|
36592
|
+
maxFreeSockets: 10,
|
|
36593
|
+
timeout: 6e4,
|
|
36594
|
+
rejectUnauthorized: false
|
|
36595
|
+
};
|
|
36596
|
+
stressTestAgentOptions = {
|
|
36597
|
+
keepAlive: true,
|
|
36598
|
+
maxSockets: 200,
|
|
36599
|
+
maxTotalSockets: 500,
|
|
36600
|
+
maxFreeSockets: 50,
|
|
36601
|
+
timeout: 3e4,
|
|
36602
|
+
rejectUnauthorized: false
|
|
36603
|
+
};
|
|
36604
|
+
stressTestExtremeAgentOptions = {
|
|
36605
|
+
keepAlive: true,
|
|
36606
|
+
maxSockets: 500,
|
|
36607
|
+
maxTotalSockets: 1e3,
|
|
36608
|
+
maxFreeSockets: 500,
|
|
36609
|
+
timeout: 3e4,
|
|
36610
|
+
rejectUnauthorized: false
|
|
36611
|
+
};
|
|
36612
|
+
GetAgentManager = (testingAgentOptions) => {
|
|
36613
|
+
let agentManager = void 0;
|
|
36614
|
+
let agentOptions = void 0;
|
|
36615
|
+
switch (testingAgentOptions.nodeAgentMode) {
|
|
36616
|
+
case "no-agent": break;
|
|
36617
|
+
case "custom-agent-options":
|
|
36618
|
+
if (testingAgentOptions.nodeAgentCustomOptions) agentOptions = { ...testingAgentOptions.nodeAgentCustomOptions };
|
|
36619
|
+
else agentOptions = { ...this.defaultAgentOptions };
|
|
36620
|
+
break;
|
|
36621
|
+
case "default-agent-options":
|
|
36622
|
+
agentOptions = { ...this.defaultAgentOptions };
|
|
36623
|
+
break;
|
|
36624
|
+
case "stress-test-agent-options":
|
|
36625
|
+
agentOptions = { ...this.stressTestAgentOptions };
|
|
36626
|
+
break;
|
|
36627
|
+
case "stress-test-extreme-agent-options":
|
|
36628
|
+
agentOptions = { ...this.stressTestExtremeAgentOptions };
|
|
36629
|
+
break;
|
|
36630
|
+
default: throw new Error(`TestCaseFhirBase:GetAgentManager(): [${this._id}] unknown nodeAgentMode: [${testingAgentOptions.nodeAgentMode}]`);
|
|
36631
|
+
}
|
|
36632
|
+
if (agentOptions) agentManager = createAgentManager({
|
|
36633
|
+
agentOptions,
|
|
36634
|
+
httpAgentFactory(options) {
|
|
36635
|
+
return new http.Agent(options);
|
|
36636
|
+
},
|
|
36637
|
+
httpsAgentFactory(options) {
|
|
36638
|
+
return new https.Agent(options);
|
|
36639
|
+
}
|
|
36640
|
+
});
|
|
36641
|
+
return agentManager;
|
|
36642
|
+
};
|
|
36643
|
+
GetFhirAgentManager = () => {
|
|
36644
|
+
return this.GetAgentManager(this._options.fhirOptions.stsfhiragentOptions);
|
|
36645
|
+
};
|
|
36646
|
+
GetClient = async () => {
|
|
36647
|
+
return this._clientHelper.GetClient();
|
|
36648
|
+
};
|
|
36649
|
+
};
|
|
36650
|
+
//#endregion
|
|
36426
36651
|
export { WorkerFhirTestCases };
|
|
36427
36652
|
|
|
36428
36653
|
//# sourceMappingURL=ststestrunner.mjs.map
|