@sonisoft/now-sdk-ext-core 6.0.0 → 6.2.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.
Files changed (45) hide show
  1. package/README.md +94 -0
  2. package/dist/comm/http/HTTPRequest.d.ts +14 -0
  3. package/dist/comm/http/RequestHandler.d.ts +13 -0
  4. package/dist/comm/http/RequestHandler.js +58 -5
  5. package/dist/comm/http/RequestHandler.js.map +1 -1
  6. package/dist/comm/http/ServiceNowProcessorRequest.d.ts +8 -2
  7. package/dist/comm/http/ServiceNowProcessorRequest.js +9 -4
  8. package/dist/comm/http/ServiceNowProcessorRequest.js.map +1 -1
  9. package/dist/index.d.ts +7 -0
  10. package/dist/index.js +7 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/policy/Policy.d.ts +40 -0
  13. package/dist/policy/Policy.js +161 -0
  14. package/dist/policy/Policy.js.map +1 -0
  15. package/dist/policy/PolicyEnv.d.ts +46 -0
  16. package/dist/policy/PolicyEnv.js +92 -0
  17. package/dist/policy/PolicyEnv.js.map +1 -0
  18. package/dist/policy/PolicyRefusal.d.ts +17 -0
  19. package/dist/policy/PolicyRefusal.js +69 -0
  20. package/dist/policy/PolicyRefusal.js.map +1 -0
  21. package/dist/policy/PolicyTypes.d.ts +65 -0
  22. package/dist/policy/PolicyTypes.js +15 -0
  23. package/dist/policy/PolicyTypes.js.map +1 -0
  24. package/dist/policy/ScanScript.d.ts +22 -0
  25. package/dist/policy/ScanScript.js +171 -0
  26. package/dist/policy/ScanScript.js.map +1 -0
  27. package/dist/policy/internal/Classify.d.ts +16 -0
  28. package/dist/policy/internal/Classify.js +121 -0
  29. package/dist/policy/internal/Classify.js.map +1 -0
  30. package/dist/sn/Application.js +18 -8
  31. package/dist/sn/Application.js.map +1 -1
  32. package/dist/sn/BackgroundScriptExecutor.d.ts +12 -0
  33. package/dist/sn/BackgroundScriptExecutor.js +60 -1
  34. package/dist/sn/BackgroundScriptExecutor.js.map +1 -1
  35. package/dist/sn/atf/ATFTestExecutor.js +3 -1
  36. package/dist/sn/atf/ATFTestExecutor.js.map +1 -1
  37. package/dist/sn/syslog/SyslogReader.js +6 -1
  38. package/dist/sn/syslog/SyslogReader.js.map +1 -1
  39. package/dist/sn/transaction/ClusterTransactionManager.d.ts +24 -0
  40. package/dist/sn/transaction/ClusterTransactionManager.js +264 -0
  41. package/dist/sn/transaction/ClusterTransactionManager.js.map +1 -0
  42. package/dist/sn/transaction/ClusterTransactionModels.d.ts +35 -0
  43. package/dist/sn/transaction/ClusterTransactionModels.js +2 -0
  44. package/dist/sn/transaction/ClusterTransactionModels.js.map +1 -0
  45. package/package.json +10 -9
@@ -0,0 +1,264 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
2
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
4
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
5
+ import { XMLParser } from "fast-xml-parser";
6
+ import { DOMParser } from "@xmldom/xmldom";
7
+ import { ServiceNowRequest } from "../../comm/http/ServiceNowRequest.js";
8
+ import { InvalidParameterException } from "../../exception/InvalidParameterException.js";
9
+ import { READ_ONLY } from "../../policy/PolicyTypes.js";
10
+ import { redactMessage, stripSecretsFromError } from "../../util/redact.js";
11
+ const SYS_ID = /^[0-9a-f]{32}$/i;
12
+ const TRANSACTION_FIELDS = [
13
+ "node_id", "user", "age", "url", "type", "foreground", "thread", "state",
14
+ "query_count", "acl_time", "br_count", "br_time", "business_rule", "db_time", "event_count",
15
+ ];
16
+ export class ClusterTransactionManager {
17
+ _req;
18
+ _killActionSysId;
19
+ _xmlParser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: "" });
20
+ constructor(instance) {
21
+ this._req = new ServiceNowRequest(instance);
22
+ }
23
+ async getTransactions(options = {}) {
24
+ const pollIntervalMs = this.requireNonNegativeNumber(options.pollIntervalMs, 1000, "pollIntervalMs");
25
+ const timeoutMs = this.requireNonNegativeNumber(options.timeoutMs, 60000, "timeoutMs");
26
+ const limit = this.requirePositiveInteger(options.limit, 1000, "limit");
27
+ try {
28
+ this.throwIfAborted(options.signal);
29
+ const initialize = await this._req.get({
30
+ method: "GET", path: "/loading_transactions.do", headers: null,
31
+ query: null, body: null, requires: READ_ONLY, responseFormat: "text",
32
+ });
33
+ const page = this.responseText(initialize.data);
34
+ const executionMatch = /\bvar\s+executionID\s*=\s*(['"])(.*?)\1\s*;/.exec(page);
35
+ if (!executionMatch) {
36
+ throw new Error("Could not parse the collection execution id from /loading_transactions.do");
37
+ }
38
+ const executionId = executionMatch[2];
39
+ if (executionId && executionId !== "null") {
40
+ if (!SYS_ID.test(executionId)) {
41
+ throw new Error("The collection execution id from /loading_transactions.do was invalid");
42
+ }
43
+ await this.waitForCollection(executionId, pollIntervalMs, timeoutMs, options.signal);
44
+ }
45
+ return await this.readTransactionList(options.query, limit);
46
+ }
47
+ catch (error) {
48
+ throw this.sanitizeError(error);
49
+ }
50
+ }
51
+ async killTransaction(sysId, options = {}) {
52
+ if (typeof sysId !== "string" || !SYS_ID.test(sysId.trim())) {
53
+ throw new InvalidParameterException("A transaction sysId must be a 32-character hexadecimal value");
54
+ }
55
+ const transactionSysId = sysId.trim();
56
+ try {
57
+ const actionSysId = options.killActionSysId
58
+ ? this.validateActionSysId(options.killActionSysId)
59
+ : await this.resolveKillActionSysId();
60
+ const security = await this._req.post({
61
+ method: "POST", path: "/xmlhttp.do", headers: null, query: null, body: null,
62
+ requires: READ_ONLY, responseFormat: "text",
63
+ fields: {
64
+ sysparm_processor: "AJAXActionSecurity", sysparm_scope: "global",
65
+ sys_target: "v_cluster_transaction", sys_action: actionSysId,
66
+ sysparm_checked_items: transactionSysId, sysparm_target: "v_cluster_transaction",
67
+ sysparm_synch: "true",
68
+ },
69
+ });
70
+ if (!this.canExecuteAction(this.responseText(security.data), actionSysId, transactionSysId)) {
71
+ throw new Error("The Kill action is unavailable or was not authorized for the selected transaction");
72
+ }
73
+ const session = await this._req.getUserSession();
74
+ if (!session?.userToken) {
75
+ throw new Error("An authenticated ServiceNow session token is required to kill a transaction");
76
+ }
77
+ const result = await this._req.post({
78
+ method: "POST", path: "/v_cluster_transaction_list.do", headers: null,
79
+ query: null, body: null,
80
+ fields: {
81
+ sys_target: "v_cluster_transaction", sys_action: actionSysId,
82
+ sys_is_list: "true", sysparm_checked_items: transactionSysId,
83
+ sysparm_ck: session.userToken, sysparm_query: "",
84
+ sysparm_referring_url: "v_cluster_transaction_list.do",
85
+ },
86
+ });
87
+ const body = this.responseText(result.data);
88
+ if (/login\.do|Security constraints prevent access/i.test(body)) {
89
+ throw new Error("ServiceNow did not accept the transaction kill request");
90
+ }
91
+ return { accepted: true, sysId: transactionSysId };
92
+ }
93
+ catch (error) {
94
+ throw this.sanitizeError(error);
95
+ }
96
+ }
97
+ async waitForCollection(executionId, pollIntervalMs, timeoutMs, signal) {
98
+ const startedAt = Date.now();
99
+ let last = {};
100
+ while (true) {
101
+ this.throwIfAborted(signal);
102
+ if (Date.now() - startedAt >= timeoutMs) {
103
+ throw new Error(`Transaction collection timed out after ${timeoutMs} ms (last state ${last.state ?? "unknown"}, ${last.percent_complete ?? "unknown"}%)`);
104
+ }
105
+ const response = await this._req.post({
106
+ method: "POST", path: "/xmlhttp.do", headers: null, query: null, body: null,
107
+ requires: READ_ONLY,
108
+ fields: {
109
+ sysparm_processor: "AJAXProgressStatusChecker", sysparm_name: "getStatus",
110
+ sysparm_scope: "global", sysparm_execution_id: executionId,
111
+ },
112
+ });
113
+ last = this.parseProgress(this.responseText(response.data));
114
+ if (last.state === "2")
115
+ return;
116
+ if (last.state !== "0" && last.state !== "1") {
117
+ const detail = last.detail_message || last.message || "no platform detail was provided";
118
+ throw new Error(`Transaction collection failed: ${detail}`);
119
+ }
120
+ await this.delay(pollIntervalMs, signal);
121
+ }
122
+ }
123
+ parseProgress(xml) {
124
+ try {
125
+ const parsed = this._xmlParser.parse(xml);
126
+ const answer = parsed?.xml?.answer;
127
+ if (typeof answer !== "string")
128
+ throw new Error();
129
+ const status = JSON.parse(answer);
130
+ if (!status || typeof status !== "object" || typeof status.state !== "string")
131
+ throw new Error();
132
+ return status;
133
+ }
134
+ catch {
135
+ throw new Error("Could not parse the AJAXProgressStatusChecker response");
136
+ }
137
+ }
138
+ async readTransactionList(query, limit) {
139
+ // A live Table API probe was unavailable during implementation, so use the captured,
140
+ // stable list-2 structure. Keeping this behind one method preserves the planned seam.
141
+ const response = await this._req.get({
142
+ method: "GET", path: "/v_cluster_transaction_list.do", headers: null, body: null,
143
+ requires: READ_ONLY, responseFormat: "text",
144
+ query: { sysparm_query: query ?? "", sysparm_limit: limit },
145
+ });
146
+ return this.parseTransactionList(this.responseText(response.data), limit);
147
+ }
148
+ parseTransactionList(html, limit) {
149
+ try {
150
+ const columns = [...html.matchAll(/<th\b[^>]*\bname=["']([^"']+)["'][^>]*\bglide_type=["'][^"']*["'][^>]*>/gi)]
151
+ .map((match) => match[1])
152
+ .filter((name) => TRANSACTION_FIELDS.includes(name));
153
+ if (columns.length !== TRANSACTION_FIELDS.length || !TRANSACTION_FIELDS.every((field) => columns.includes(field))) {
154
+ throw new Error();
155
+ }
156
+ const records = [];
157
+ const rows = html.matchAll(/<tr\b[^>]*\bsys_id=["']([0-9a-f]{32})["'][^>]*>([\s\S]*?)<\/tr>/gi);
158
+ for (const row of rows) {
159
+ const cells = [...row[2].matchAll(/<td\b[^>]*>([\s\S]*?)<\/td>/gi)]
160
+ .map((cell) => this.cellText(cell[1]));
161
+ // List-2 rows surround the data with selection/icon and trailing spacer cells.
162
+ const dataCells = cells.length === columns.length ? cells : cells.slice(2, 2 + columns.length);
163
+ if (dataCells.length !== columns.length)
164
+ throw new Error();
165
+ const record = { sys_id: row[1] };
166
+ columns.forEach((column, index) => { record[column] = dataCells[index] ?? ""; });
167
+ records.push(record);
168
+ if (records.length >= limit)
169
+ break;
170
+ }
171
+ return records;
172
+ }
173
+ catch {
174
+ throw new Error("Could not parse /v_cluster_transaction_list.do transaction rows");
175
+ }
176
+ }
177
+ async resolveKillActionSysId() {
178
+ if (this._killActionSysId)
179
+ return this._killActionSysId;
180
+ const response = await this._req.get({
181
+ method: "GET", path: "/api/now/table/sys_ui_action", headers: { Accept: "application/json" },
182
+ body: null,
183
+ query: {
184
+ sysparm_query: "table=v_cluster_transaction^active=true^name=Kill",
185
+ sysparm_fields: "sys_id,name", sysparm_limit: 2, sysparm_display_value: "false",
186
+ },
187
+ });
188
+ const candidates = (response.bodyObject ?? response.data)?.result;
189
+ if (!Array.isArray(candidates) || candidates.length !== 1 || !SYS_ID.test(candidates[0].sys_id)) {
190
+ const names = Array.isArray(candidates) ? candidates.map((candidate) => candidate.name).filter(Boolean) : [];
191
+ const detail = names.length ? ` Candidates: ${names.join(", ")}.` : "";
192
+ throw new Error(`Could not uniquely resolve the Kill UI action.${detail} Supply killActionSysId to override it.`);
193
+ }
194
+ this._killActionSysId = candidates[0].sys_id;
195
+ return this._killActionSysId;
196
+ }
197
+ canExecuteAction(xml, actionSysId, transactionSysId) {
198
+ try {
199
+ const parsed = this._xmlParser.parse(xml);
200
+ const action = parsed?.xml?.[`action_${actionSysId}`];
201
+ const keys = Array.isArray(action?.key) ? action.key : action?.key ? [action.key] : [];
202
+ return keys.some((key) => String(key.can_execute) === "true" && key.sys_id === transactionSysId);
203
+ }
204
+ catch {
205
+ return false;
206
+ }
207
+ }
208
+ validateActionSysId(value) {
209
+ const actionSysId = typeof value === "string" ? value.trim() : "";
210
+ if (!SYS_ID.test(actionSysId)) {
211
+ throw new InvalidParameterException("killActionSysId must be a 32-character hexadecimal value");
212
+ }
213
+ return actionSysId;
214
+ }
215
+ responseText(data) {
216
+ if (typeof data === "string")
217
+ return data;
218
+ if (data instanceof String)
219
+ return data.toString();
220
+ throw new Error("ServiceNow returned an unexpected response type");
221
+ }
222
+ requireNonNegativeNumber(value, fallback, name) {
223
+ const result = value ?? fallback;
224
+ if (!Number.isFinite(result) || result < 0)
225
+ throw new InvalidParameterException(`${name} must be a non-negative number`);
226
+ return result;
227
+ }
228
+ requirePositiveInteger(value, fallback, name) {
229
+ const result = value ?? fallback;
230
+ if (!Number.isInteger(result) || result <= 0)
231
+ throw new InvalidParameterException(`${name} must be a positive integer`);
232
+ return result;
233
+ }
234
+ delay(ms, signal) {
235
+ return new Promise((resolve, reject) => {
236
+ const onAbort = () => {
237
+ clearTimeout(timer);
238
+ reject(new Error("Transaction collection was aborted"));
239
+ };
240
+ const timer = setTimeout(() => {
241
+ signal?.removeEventListener("abort", onAbort);
242
+ resolve();
243
+ }, ms);
244
+ signal?.addEventListener("abort", onAbort, { once: true });
245
+ });
246
+ }
247
+ throwIfAborted(signal) {
248
+ if (signal?.aborted)
249
+ throw new Error("Transaction collection was aborted");
250
+ }
251
+ sanitizeError(error) {
252
+ if (error instanceof Error)
253
+ error.message = redactMessage(error.message);
254
+ return stripSecretsFromError(error);
255
+ }
256
+ cellText(value) {
257
+ const document = new DOMParser().parseFromString(`<root>${value.replace(/&nbsp;/gi, "&#160;")}</root>`, "application/xml");
258
+ if (document.getElementsByTagName("parsererror").length > 0) {
259
+ throw new Error("Could not parse a transaction list cell");
260
+ }
261
+ return document.documentElement.textContent?.trim() ?? "";
262
+ }
263
+ }
264
+ //# sourceMappingURL=ClusterTransactionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClusterTransactionManager.js","sourceRoot":"","sources":["../../../src/sn/transaction/ClusterTransactionManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /** One active transaction, as collected from a cluster node. */
2
+ export interface ClusterTransaction {
3
+ sys_id: string;
4
+ node_id: string;
5
+ user: string;
6
+ age: string;
7
+ url: string;
8
+ type: string;
9
+ foreground: string;
10
+ thread: string;
11
+ /** The transaction state, unrelated to the collection progress state. */
12
+ state: string;
13
+ query_count: string;
14
+ acl_time: string;
15
+ br_count: string;
16
+ br_time: string;
17
+ business_rule: string;
18
+ db_time: string;
19
+ event_count: string;
20
+ }
21
+ export interface GetTransactionsOptions {
22
+ pollIntervalMs?: number;
23
+ timeoutMs?: number;
24
+ query?: string;
25
+ limit?: number;
26
+ signal?: AbortSignal;
27
+ }
28
+ export interface KillTransactionOptions {
29
+ /** Override for instances whose Kill UI action cannot be resolved automatically. */
30
+ killActionSysId?: string;
31
+ }
32
+ export interface KillTransactionResult {
33
+ accepted: boolean;
34
+ sysId: string;
35
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ClusterTransactionModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClusterTransactionModels.js","sourceRoot":"","sources":["../../../src/sn/transaction/ClusterTransactionModels.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonisoft/now-sdk-ext-core",
3
- "version": "6.0.0",
3
+ "version": "6.2.0",
4
4
  "description": "Comprehensive TypeScript library extending ServiceNow SDK with application management, ATF testing, real-time log monitoring, AMB event subscriptions, and automation tools",
5
5
  "keywords": [
6
6
  "servicenow",
@@ -61,6 +61,7 @@
61
61
  "@servicenow/sdk-core": "4.9.2",
62
62
  "@ts-morph/common": "^0.24.0",
63
63
  "@xmldom/xmldom": "^0.8.10",
64
+ "acorn": "^8.18.0",
64
65
  "async": "3.2.6",
65
66
  "bluebird": "3.7.2",
66
67
  "cometd": "^9.0.0",
@@ -104,17 +105,17 @@
104
105
  "@types/uuid": "^11.0.0",
105
106
  "@types/winston": "2.4.4",
106
107
  "@types/ws": "^8.5.12",
107
- "chai": "5.1.1",
108
- "concurrently": "8.2.2",
109
- "conventional-changelog-conventionalcommits": "^9.1.0",
108
+ "chai": "6.2.2",
109
+ "concurrently": "10.0.4",
110
+ "conventional-changelog-conventionalcommits": "^10.2.1",
110
111
  "create-ts-index": "^1.14.0",
111
112
  "ctix": "^2.6.4",
112
- "diff": "^8.0.3",
113
- "eslint": "^8.57.0",
114
- "glob": "^11.0.0",
115
- "globals": "^15.9.0",
113
+ "diff": "^9.0.0",
114
+ "eslint": "^10.8.0",
115
+ "glob": "^13.0.6",
116
+ "globals": "^17.8.0",
116
117
  "jest": "^30.2.0",
117
- "jest-junit": "^16.0.0",
118
+ "jest-junit": "^17.0.0",
118
119
  "jsdom": "^30.0.0",
119
120
  "mock-fs": "^5.2.0",
120
121
  "nodemon": "^3.1.4",