mirror of
https://github.com/sasjs/adapter.git
synced 2026-01-07 04:20:05 +00:00
Merge branch 'api-execution' of https://github.com/sasjs/adapter into api-execution
This commit is contained in:
@@ -20,6 +20,7 @@ export class SASViyaApiClient {
|
|||||||
private serverUrl: string,
|
private serverUrl: string,
|
||||||
private rootFolderName: string,
|
private rootFolderName: string,
|
||||||
private contextName: string,
|
private contextName: string,
|
||||||
|
private setCsrfToken: (csrfToken: CsrfToken) => void,
|
||||||
private rootFolderMap = new Map<string, Job[]>()
|
private rootFolderMap = new Map<string, Job[]>()
|
||||||
) {
|
) {
|
||||||
if (!rootFolderName) {
|
if (!rootFolderName) {
|
||||||
@@ -28,7 +29,7 @@ export class SASViyaApiClient {
|
|||||||
}
|
}
|
||||||
private csrfToken: CsrfToken | null = null;
|
private csrfToken: CsrfToken | null = null;
|
||||||
private rootFolder: Folder | null = null;
|
private rootFolder: Folder | null = null;
|
||||||
private sessionManager = new SessionManager(this.serverUrl, this.contextName);
|
private sessionManager = new SessionManager(this.serverUrl, this.contextName, this.setCsrfToken);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a map containing the directory structure in the currently set root folder.
|
* Returns a map containing the directory structure in the currently set root folder.
|
||||||
@@ -1025,8 +1026,9 @@ export class SASViyaApiClient {
|
|||||||
return `/folders/folders/${folder.id}`;
|
return `/folders/folders/${folder.id}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
setCsrfToken = (csrfToken: CsrfToken) => {
|
setCsrfTokenLocal = (csrfToken: CsrfToken) => {
|
||||||
this.csrfToken = csrfToken;
|
this.csrfToken = csrfToken;
|
||||||
|
this.setCsrfToken(csrfToken);
|
||||||
};
|
};
|
||||||
|
|
||||||
private async request<T>(
|
private async request<T>(
|
||||||
@@ -1040,6 +1042,6 @@ export class SASViyaApiClient {
|
|||||||
[this.csrfToken.headerName]: this.csrfToken.value,
|
[this.csrfToken.headerName]: this.csrfToken.value,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return await makeRequest<T>(url, options, this.setCsrfToken, contentType);
|
return await makeRequest<T>(url, options, this.setCsrfTokenLocal, contentType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
32
src/SASjs.ts
32
src/SASjs.ts
@@ -20,6 +20,7 @@ import {
|
|||||||
SASjsRequest,
|
SASjsRequest,
|
||||||
SASjsWaitingRequest,
|
SASjsWaitingRequest,
|
||||||
ServerType,
|
ServerType,
|
||||||
|
CsrfToken,
|
||||||
} from "./types";
|
} from "./types";
|
||||||
import { SASViyaApiClient } from "./SASViyaApiClient";
|
import { SASViyaApiClient } from "./SASViyaApiClient";
|
||||||
import { SAS9ApiClient } from "./SAS9ApiClient";
|
import { SAS9ApiClient } from "./SAS9ApiClient";
|
||||||
@@ -46,8 +47,7 @@ export default class SASjs {
|
|||||||
private jobsPath: string = "";
|
private jobsPath: string = "";
|
||||||
private logoutUrl: string = "";
|
private logoutUrl: string = "";
|
||||||
private loginUrl: string = "";
|
private loginUrl: string = "";
|
||||||
private _csrf: string | null = null;
|
private csrfToken: CsrfToken | null = null;
|
||||||
private _csrfHeader: string | null = null;
|
|
||||||
private retryCount: number = 0;
|
private retryCount: number = 0;
|
||||||
private sasjsRequests: SASjsRequest[] = [];
|
private sasjsRequests: SASjsRequest[] = [];
|
||||||
private sasjsWaitingRequests: SASjsWaitingRequest[] = [];
|
private sasjsWaitingRequests: SASjsWaitingRequest[] = [];
|
||||||
@@ -239,7 +239,7 @@ export default class SASjs {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public getCsrf() {
|
public getCsrf() {
|
||||||
return this._csrf;
|
return this.csrfToken?.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -452,7 +452,8 @@ export default class SASjs {
|
|||||||
sasApiClient = new SASViyaApiClient(
|
sasApiClient = new SASViyaApiClient(
|
||||||
serverUrl,
|
serverUrl,
|
||||||
appLoc,
|
appLoc,
|
||||||
this.sasjsConfig.contextName
|
this.sasjsConfig.contextName,
|
||||||
|
this.setCsrfToken
|
||||||
);
|
);
|
||||||
} else if (this.sasjsConfig.serverType === ServerType.SAS9) {
|
} else if (this.sasjsConfig.serverType === ServerType.SAS9) {
|
||||||
sasApiClient = new SAS9ApiClient(serverUrl);
|
sasApiClient = new SAS9ApiClient(serverUrl);
|
||||||
@@ -517,7 +518,7 @@ export default class SASjs {
|
|||||||
return JSON.parse(response!.result);
|
return JSON.parse(response!.result);
|
||||||
})
|
})
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
if (e && e.includes(401)) {
|
if (e && e.status === 401) {
|
||||||
if (loginRequiredCallback) loginRequiredCallback(true);
|
if (loginRequiredCallback) loginRequiredCallback(true);
|
||||||
sasjsWaitingRequest.requestPromise.resolve = resolve;
|
sasjsWaitingRequest.requestPromise.resolve = resolve;
|
||||||
sasjsWaitingRequest.requestPromise.reject = reject;
|
sasjsWaitingRequest.requestPromise.reject = reject;
|
||||||
@@ -698,8 +699,8 @@ export default class SASjs {
|
|||||||
reject({ MESSAGE: errorMsg });
|
reject({ MESSAGE: errorMsg });
|
||||||
}
|
}
|
||||||
const headers: any = {};
|
const headers: any = {};
|
||||||
if (this._csrfHeader && this._csrf) {
|
if (this.csrfToken) {
|
||||||
headers[this._csrfHeader] = this._csrf;
|
headers[this.csrfToken.headerName] = this.csrfToken.value;
|
||||||
}
|
}
|
||||||
fetch(apiUrl, {
|
fetch(apiUrl, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
@@ -714,8 +715,10 @@ export default class SASjs {
|
|||||||
|
|
||||||
if (tokenHeader) {
|
if (tokenHeader) {
|
||||||
const token = response.headers.get(tokenHeader);
|
const token = response.headers.get(tokenHeader);
|
||||||
this._csrfHeader = tokenHeader;
|
this.csrfToken = {
|
||||||
this._csrf = token;
|
headerName: tokenHeader,
|
||||||
|
value: token || ''
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -810,6 +813,10 @@ export default class SASjs {
|
|||||||
return sasjsWaitingRequest.requestPromise.promise;
|
return sasjsWaitingRequest.requestPromise.promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private setCsrfToken = (csrfToken: CsrfToken) => {
|
||||||
|
this.csrfToken = csrfToken;
|
||||||
|
};
|
||||||
|
|
||||||
private async resendWaitingRequests() {
|
private async resendWaitingRequests() {
|
||||||
for (const sasjsWaitingRequest of this.sasjsWaitingRequests) {
|
for (const sasjsWaitingRequest of this.sasjsWaitingRequests) {
|
||||||
this.request(
|
this.request(
|
||||||
@@ -832,8 +839,8 @@ export default class SASjs {
|
|||||||
private getRequestParams(): any {
|
private getRequestParams(): any {
|
||||||
const requestParams: any = {};
|
const requestParams: any = {};
|
||||||
|
|
||||||
if (this._csrf) {
|
if (this.csrfToken) {
|
||||||
requestParams["_csrf"] = this._csrf;
|
requestParams["_csrf"] = this.csrfToken.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.sasjsConfig.debug) {
|
if (this.sasjsConfig.debug) {
|
||||||
@@ -1070,7 +1077,8 @@ export default class SASjs {
|
|||||||
this.sasViyaApiClient = new SASViyaApiClient(
|
this.sasViyaApiClient = new SASViyaApiClient(
|
||||||
this.sasjsConfig.serverUrl,
|
this.sasjsConfig.serverUrl,
|
||||||
this.sasjsConfig.appLoc,
|
this.sasjsConfig.appLoc,
|
||||||
this.sasjsConfig.contextName
|
this.sasjsConfig.contextName,
|
||||||
|
this.setCsrfToken
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (this.sasjsConfig.serverType === ServerType.SAS9) {
|
if (this.sasjsConfig.serverType === ServerType.SAS9) {
|
||||||
|
|||||||
@@ -4,7 +4,11 @@ import { asyncForEach, makeRequest } from "./utils";
|
|||||||
const MAX_SESSION_COUNT = 1;
|
const MAX_SESSION_COUNT = 1;
|
||||||
|
|
||||||
export class SessionManager {
|
export class SessionManager {
|
||||||
constructor(private serverUrl: string, private contextName: string) {}
|
constructor(
|
||||||
|
private serverUrl: string,
|
||||||
|
private contextName: string,
|
||||||
|
private setCsrfToken: (csrfToken: CsrfToken) => void
|
||||||
|
) {}
|
||||||
private sessions: Session[] = [];
|
private sessions: Session[] = [];
|
||||||
private currentContext: Context | null = null;
|
private currentContext: Context | null = null;
|
||||||
private csrfToken: CsrfToken | null = null;
|
private csrfToken: CsrfToken | null = null;
|
||||||
@@ -132,7 +136,10 @@ export class SessionManager {
|
|||||||
return await makeRequest<T>(
|
return await makeRequest<T>(
|
||||||
url,
|
url,
|
||||||
options,
|
options,
|
||||||
(token) => (this.csrfToken = token),
|
(token) => {
|
||||||
|
this.csrfToken = token;
|
||||||
|
this.setCsrfToken(token);
|
||||||
|
},
|
||||||
contentType
|
contentType
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user