@jacebenson/jsn 4.3.2 → 4.3.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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/sdk.js +30 -16
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jacebenson/jsn",
3
- "version": "4.3.2",
3
+ "version": "4.3.3",
4
4
  "description": "A command-line interface for ServiceNow that follows the Unix philosophy: simple, composable, and scriptable.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/sdk.js CHANGED
@@ -6,6 +6,24 @@ import { getStringField } from './helpers.js';
6
6
 
7
7
  const DEFAULT_TIMEOUT = 30000;
8
8
 
9
+ function collectSetCookies(cookieJar, response) {
10
+ const values = response.headers.getSetCookie?.() || [];
11
+ const raw = Array.isArray(values) && values.length
12
+ ? values
13
+ : [response.headers.get('set-cookie')].filter(Boolean);
14
+ for (const value of raw) {
15
+ const pair = value.split(';', 1)[0].trim();
16
+ const separator = pair.indexOf('=');
17
+ if (separator > 0) {
18
+ cookieJar.set(pair.slice(0, separator), pair.slice(separator + 1));
19
+ }
20
+ }
21
+ }
22
+
23
+ function serializeCookies(cookieJar) {
24
+ return [...cookieJar].map(([name, value]) => `${name}=${value}`).join('; ');
25
+ }
26
+
9
27
  // Build the sys.scripts.do POST body for background script execution.
10
28
  // Extracted for testability (issue #177): maps script-mode options to the
11
29
  // form fields on ServiceNow's Script Background form. Defaults preserve the
@@ -798,28 +816,24 @@ export class SDKClient {
798
816
  try {
799
817
  const creds = await this.authProvider.getCredentials();
800
818
  if (creds.auth_method === 'oauth') {
801
- let cookies = '';
802
- const collectCookies = (resp) => {
803
- const values = resp.headers.getSetCookie?.() || [];
804
- const raw = Array.isArray(values) ? values : [resp.headers.get('set-cookie')].filter(Boolean);
805
- const next = raw.map(value => value.split(';', 1)[0]).filter(Boolean);
806
- if (next.length) cookies = [...new Set(`${cookies}; ${next.join('; ')}`.split(';').map(v => v.trim()).filter(Boolean))].join('; ');
807
- };
819
+ const cookieJar = new Map();
808
820
  const login = `${this.baseURL}/angular.do?sysparm_type=get_user`;
809
- collectCookies(await fetch(new Request(login, { method: 'POST' })));
821
+ collectSetCookies(cookieJar, await fetch(new Request(login, { method: 'POST' })));
810
822
  const scopeEndpoint = `${this.baseURL}/api/now/table/sys_scope?sysparm_fields=sys_id%2Csys_class_name&sysparm_limit=1`;
811
- collectCookies(await this._fetchWithAuth(scopeEndpoint, {
823
+ collectSetCookies(cookieJar, await this._fetchWithAuth(scopeEndpoint, {
812
824
  method: 'GET',
813
- headers: cookies ? { Cookie: cookies } : {},
825
+ headers: serializeCookies(cookieJar) ? { Cookie: serializeCookies(cookieJar) } : {},
814
826
  }));
815
- collectCookies(await this._fetchWithAuth(login, {
827
+ collectSetCookies(cookieJar, await this._fetchWithAuth(login, {
816
828
  method: 'POST',
817
- headers: cookies ? { Cookie: cookies } : {},
829
+ headers: serializeCookies(cookieJar) ? { Cookie: serializeCookies(cookieJar) } : {},
818
830
  }));
831
+ const cookies = serializeCookies(cookieJar);
819
832
  this.oauthCookies = cookies;
820
833
  return cookies;
821
834
  }
822
835
  const endpoint = `${this.baseURL}/angular.do`;
836
+ const cookieJar = new Map();
823
837
  const loginResp = await this._fetchWithAuth(`${endpoint}?sysparm_type=view_form.login`, {
824
838
  method: 'POST',
825
839
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
@@ -830,14 +844,14 @@ export class SDKClient {
830
844
  user_password: creds.password,
831
845
  }).toString(),
832
846
  });
833
- const values = loginResp.headers.getSetCookie?.() || [];
834
- const raw = Array.isArray(values) ? values : [loginResp.headers.get('set-cookie')].filter(Boolean);
835
- const cookies = raw.map(value => value.split(';', 1)[0]).filter(Boolean).join('; ');
847
+ collectSetCookies(cookieJar, loginResp);
836
848
  const refreshResp = await this._fetchWithAuth(`${endpoint}?sysparm_type=get_user`, {
837
849
  method: 'POST',
838
- headers: cookies ? { Cookie: cookies } : {},
850
+ headers: serializeCookies(cookieJar) ? { Cookie: serializeCookies(cookieJar) } : {},
839
851
  });
852
+ collectSetCookies(cookieJar, refreshResp);
840
853
  this.sessionUserToken = refreshResp.headers.get('x-usertoken-response') || '';
854
+ const cookies = serializeCookies(cookieJar);
841
855
  this.oauthCookies = cookies;
842
856
  return cookies;
843
857
  } catch {