mirror of
https://github.com/sasjs/adapter.git
synced 2026-01-05 03:30:05 +00:00
Compare commits
58 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
33ce592379 | ||
|
|
f764f1f22f | ||
|
|
978af5037e | ||
|
|
39e88052c7 | ||
|
|
889351caf1 | ||
|
|
e6476dc230 | ||
|
|
e7de45c94f | ||
|
|
2f822aba71 | ||
|
|
ba687bf8e2 | ||
|
|
618cbe5a21 | ||
|
|
d723150b6d | ||
|
|
b1ad983ca5 | ||
|
|
4711d0510e | ||
|
|
93854c287f | ||
|
|
687a3047fd | ||
|
|
c067c6e74d | ||
|
|
04b44f40ba | ||
|
|
ce2126bd34 | ||
|
|
638efe8899 | ||
|
|
23353355e4 | ||
|
|
1be64798c5 | ||
|
|
a92a458cf1 | ||
|
|
703fdf9c02 | ||
|
|
bc239cf5d6 | ||
|
|
86780db478 | ||
|
|
5d5afa20c7 | ||
|
|
d662c1a981 | ||
|
|
927bb8c78c | ||
|
|
509171c484 | ||
|
|
ae98b50a21 | ||
|
|
f3abafd5ed | ||
|
|
939e6803e1 | ||
|
|
6a055a4fc6 | ||
|
|
5076ea696c | ||
|
|
3a60e6422c | ||
|
|
b90b5d5c03 | ||
|
|
6fb9d11712 | ||
|
|
d61728e52a | ||
|
|
a9339b52ed | ||
|
|
970e14b2e1 | ||
|
|
d5a8140d4f | ||
|
|
dcc5a1efdd | ||
|
|
d517897615 | ||
|
|
5f5d84da87 | ||
|
|
8650d91672 | ||
|
|
4c9e48550e | ||
|
|
8504ec6c4d | ||
|
|
a0ad8b3f34 | ||
|
|
4ed150aff9 | ||
|
|
81be11f3b9 | ||
|
|
e7e238e20b | ||
|
|
53990a9ba3 | ||
|
|
afec560952 | ||
|
|
17d8ea8b17 | ||
|
|
9af45799b9 | ||
|
|
fdbb87ed7b | ||
|
|
5e7ffc1f58 | ||
|
|
3369b28933 |
File diff suppressed because one or more lines are too long
231
docs/classes/reflection-717.reflection-180.fileuploader.html
Normal file
231
docs/classes/reflection-717.reflection-180.fileuploader.html
Normal file
File diff suppressed because one or more lines are too long
312
docs/classes/reflection-717.reflection-180.sas9apiclient.html
Normal file
312
docs/classes/reflection-717.reflection-180.sas9apiclient.html
Normal file
File diff suppressed because one or more lines are too long
1336
docs/classes/reflection-717.reflection-180.sasjs.html
Normal file
1336
docs/classes/reflection-717.reflection-180.sasjs.html
Normal file
File diff suppressed because one or more lines are too long
1264
docs/classes/reflection-717.reflection-180.sasviyaapiclient.html
Normal file
1264
docs/classes/reflection-717.reflection-180.sasviyaapiclient.html
Normal file
File diff suppressed because one or more lines are too long
271
docs/classes/reflection-717.reflection-180.sessionmanager.html
Normal file
271
docs/classes/reflection-717.reflection-180.sessionmanager.html
Normal file
File diff suppressed because one or more lines are too long
231
docs/classes/reflection-724.reflection-187.fileuploader.html
Normal file
231
docs/classes/reflection-724.reflection-187.fileuploader.html
Normal file
@@ -0,0 +1,231 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html class="default no-js">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<title>FileUploader | @sasjs/adapter</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="../assets/css/main.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div class="tsd-page-toolbar">
|
||||||
|
<div class="container">
|
||||||
|
<div class="table-wrap">
|
||||||
|
<div class="table-cell" id="tsd-search" data-index="../assets/js/search.json" data-base="..">
|
||||||
|
<div class="field">
|
||||||
|
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label>
|
||||||
|
<input id="tsd-search-field" type="text" />
|
||||||
|
</div>
|
||||||
|
<ul class="results">
|
||||||
|
<li class="state loading">Preparing search index...</li>
|
||||||
|
<li class="state failure">The search index is not available</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="results-priority" style="display:none">
|
||||||
|
</ul>
|
||||||
|
<a href="../index.html" class="title">@sasjs/adapter</a>
|
||||||
|
 <a href="https://github.com/sasjs/adapter" class="title">SASjs on Github</a>
|
||||||
|
 <a href="https://sasjs.io" class="title">SASjs.io</a>
|
||||||
|
 <a href="https://github.com/sasjs/cli" class="title">SASjs CLI</a>
|
||||||
|
 <a href="https://github.com/sasjs/react-seed-app" class="title">React Seed App</a>
|
||||||
|
</div>
|
||||||
|
<div class="table-cell" id="tsd-widgets">
|
||||||
|
<div id="tsd-filter">
|
||||||
|
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||||
|
<div class="tsd-filter-group">
|
||||||
|
<div class="tsd-select" id="tsd-filter-visibility">
|
||||||
|
<span class="tsd-select-label">All</span>
|
||||||
|
<ul class="tsd-select-list">
|
||||||
|
<li data-value="public">Public</li>
|
||||||
|
<li data-value="protected">Public/Protected</li>
|
||||||
|
<li data-value="private" class="selected">All</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" id="tsd-filter-inherited" checked />
|
||||||
|
<label class="tsd-widget" for="tsd-filter-inherited">Inherited</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tsd-page-title">
|
||||||
|
<div class="container">
|
||||||
|
<ul class="tsd-breadcrumb">
|
||||||
|
<li>
|
||||||
|
<a href="../modules/reflection-724.html"></a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="../modules/reflection-724.reflection-187.html"></a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="reflection-724.reflection-187.fileuploader.html">FileUploader</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="container container-main">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-3 col-menu menu-sticky-wrap menu-highlight">
|
||||||
|
<nav class="tsd-navigation outline primary">
|
||||||
|
<a style="margin-left:0em" href="../globals.html">Globals</a>
|
||||||
|
<ul style="display:none">
|
||||||
|
{"SAS Adapter":{"SASjs":"classes/reflection-717.reflection-180.sasjs","Types":"modules/types"},"SAS Viya API Client":"classes/reflection-717.reflection-180.sasviyaapiclient","SAS 9 API Client":"classes/reflection-717.reflection-180.sas9apiclient"}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
<div class="col-7 offset-3 col-content">
|
||||||
|
<h1>Class FileUploader</h1>
|
||||||
|
<section class="tsd-panel tsd-hierarchy">
|
||||||
|
<h3>Hierarchy</h3>
|
||||||
|
<ul class="tsd-hierarchy">
|
||||||
|
<li>
|
||||||
|
<span class="target">FileUploader</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel-group tsd-index-group">
|
||||||
|
<section class="tsd-panel tsd-index-panel">
|
||||||
|
<div class="tsd-index-content">
|
||||||
|
<section class="tsd-index-section ">
|
||||||
|
<h3>Constructors</h3>
|
||||||
|
<ul class="tsd-index-list">
|
||||||
|
<li class="tsd-kind-constructor tsd-parent-kind-class"><a href="reflection-724.reflection-187.fileuploader.html#constructor" class="tsd-kind-icon">constructor</a></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-index-section ">
|
||||||
|
<h3>Methods</h3>
|
||||||
|
<ul class="tsd-index-list">
|
||||||
|
<li class="tsd-kind-method tsd-parent-kind-class"><a href="reflection-724.reflection-187.fileuploader.html#uploadfile" class="tsd-kind-icon">uploadFile</a></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel-group tsd-member-group ">
|
||||||
|
<h2>Constructors</h2>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class">
|
||||||
|
<a name="constructor" class="tsd-anchor"></a>
|
||||||
|
<h3>constructor</h3>
|
||||||
|
<ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class">
|
||||||
|
<li class="tsd-signature tsd-kind-icon">new <wbr>File<wbr>Uploader<span class="tsd-signature-symbol">(</span>appLoc<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, serverUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, jobsPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, setCsrfTokenWeb<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, csrfToken<span class="tsd-signature-symbol">?: </span><a href="../interfaces/types.csrftoken.html" class="tsd-signature-type">CsrfToken</a><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="reflection-724.reflection-187.fileuploader.html" class="tsd-signature-type">FileUploader</a></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="tsd-descriptions">
|
||||||
|
<li class="tsd-description">
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
<ul>
|
||||||
|
<li>Defined in
|
||||||
|
<a href="https://github.com/sasjs/adapter/blob/master/src/FileUploader.ts#L7">
|
||||||
|
FileUploader.ts:7
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li>
|
||||||
|
<h5>appLoc: <span class="tsd-signature-type">string</span></h5>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>serverUrl: <span class="tsd-signature-type">string</span></h5>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>jobsPath: <span class="tsd-signature-type">string</span></h5>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>setCsrfTokenWeb: <span class="tsd-signature-type">any</span></h5>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5><span class="tsd-flag ts-flagDefault value">Default value</span> csrfToken: <a href="../interfaces/types.csrftoken.html" class="tsd-signature-type">CsrfToken</a><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> = null</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h4 class="tsd-returns-title">Returns <a href="reflection-724.reflection-187.fileuploader.html" class="tsd-signature-type">FileUploader</a></h4>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel-group tsd-member-group ">
|
||||||
|
<h2>Methods</h2>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<a name="uploadfile" class="tsd-anchor"></a>
|
||||||
|
<h3>upload<wbr>File</h3>
|
||||||
|
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<li class="tsd-signature tsd-kind-icon">upload<wbr>File<span class="tsd-signature-symbol">(</span>sasJob<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, files<span class="tsd-signature-symbol">: </span><a href="../interfaces/types.uploadfile.html" class="tsd-signature-type">UploadFile</a><span class="tsd-signature-symbol">[]</span>, params<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">unknown</span><span class="tsd-signature-symbol">></span></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="tsd-descriptions">
|
||||||
|
<li class="tsd-description">
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
<ul>
|
||||||
|
<li>Defined in
|
||||||
|
<a href="https://github.com/sasjs/adapter/blob/master/src/FileUploader.ts#L20">
|
||||||
|
FileUploader.ts:20
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li>
|
||||||
|
<h5>sasJob: <span class="tsd-signature-type">string</span></h5>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>files: <a href="../interfaces/types.uploadfile.html" class="tsd-signature-type">UploadFile</a><span class="tsd-signature-symbol">[]</span></h5>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>params: <span class="tsd-signature-type">any</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">unknown</span><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<!--{"options":"/Users/allan/git/adapter","tsconfig":"/Users/allan/git/adapter","inputFiles":["/Users/allan/git/adapter/src/FileUploader.ts","/Users/allan/git/adapter/src/SAS9ApiClient.ts","/Users/allan/git/adapter/src/SASViyaApiClient.ts","/Users/allan/git/adapter/src/SASjs.ts","/Users/allan/git/adapter/src/SessionManager.ts","/Users/allan/git/adapter/src/index.ts","/Users/allan/git/adapter/src/types/Context.ts","/Users/allan/git/adapter/src/types/CsrfToken.ts","/Users/allan/git/adapter/src/types/ErrorResponse.ts","/Users/allan/git/adapter/src/types/Folder.ts","/Users/allan/git/adapter/src/types/Job.ts","/Users/allan/git/adapter/src/types/JobDefinition.ts","/Users/allan/git/adapter/src/types/JobResult.ts","/Users/allan/git/adapter/src/types/Link.ts","/Users/allan/git/adapter/src/types/SASjsConfig.ts","/Users/allan/git/adapter/src/types/SASjsRequest.ts","/Users/allan/git/adapter/src/types/SASjsWaitingRequest.ts","/Users/allan/git/adapter/src/types/ServerType.ts","/Users/allan/git/adapter/src/types/Session.ts","/Users/allan/git/adapter/src/types/UploadFile.ts","/Users/allan/git/adapter/src/types/index.ts","/Users/allan/git/adapter/src/utils/asyncForEach.ts","/Users/allan/git/adapter/src/utils/compareTimestamps.ts","/Users/allan/git/adapter/src/utils/convertToCsv.ts","/Users/allan/git/adapter/src/utils/formatDataForRequest.ts","/Users/allan/git/adapter/src/utils/index.ts","/Users/allan/git/adapter/src/utils/isAuthorizeFormRequired.ts","/Users/allan/git/adapter/src/utils/isIeOrEdge.ts","/Users/allan/git/adapter/src/utils/isLoginRequired.ts","/Users/allan/git/adapter/src/utils/isLoginSuccess.ts","/Users/allan/git/adapter/src/utils/isUri.ts","/Users/allan/git/adapter/src/utils/isUrl.ts","/Users/allan/git/adapter/src/utils/makeRequest.ts","/Users/allan/git/adapter/src/utils/needsRetry.ts","/Users/allan/git/adapter/src/utils/parseAndSubmitAuthorizeForm.ts","/Users/allan/git/adapter/src/utils/parseGeneratedCode.ts","/Users/allan/git/adapter/src/utils/parseSasViyaLog.ts","/Users/allan/git/adapter/src/utils/parseSourceCode.ts","/Users/allan/git/adapter/src/utils/parseWeboutResponse.ts","/Users/allan/git/adapter/src/utils/serialize.ts","/Users/allan/git/adapter/src/utils/splitChunks.ts"],"mode":1,"includeDeclarations":true,"entryPoint":"","exclude":["**/*+(index|.spec|.e2e).ts"],"externalPattern":[],"excludeExternals":true,"excludeNotExported":true,"excludeNotDocumented":false,"excludePrivate":true,"excludeProtected":false,"ignoreCompilerErrors":true,"disableSources":false,"includes":"","media":"","out":"docs","json":"","theme":"./node_modules/typedoc-neo-theme/bin/default","name":"","includeVersion":false,"excludeTags":[],"readme":"","defaultCategory":"Other","categoryOrder":[],"categorizeByGroup":true,"gitRevision":"","gitRemote":"origin","gaID":"","gaSite":"auto","hideGenerator":false,"toc":[],"disableOutputCheck":true,"help":false,"version":false,"plugin":[],"logger":"console","listInvalidSymbolLinks":false,"links":[{"label":"SASjs on Github","url":"https://github.com/sasjs/adapter"},{"label":"SASjs.io","url":"https://sasjs.io"},{"label":"SASjs CLI","url":"https://github.com/sasjs/cli"},{"label":"React Seed App","url":"https://github.com/sasjs/react-seed-app"}],"outline":[{"SAS Adapter":{"SASjs":"classes/reflection-717.reflection-180.sasjs","Types":"modules/types"},"SAS Viya API Client":"classes/reflection-717.reflection-180.sasviyaapiclient","SAS 9 API Client":"classes/reflection-717.reflection-180.sas9apiclient"}],"source":[{"path":"https://github.com/sasjs/adapter/blob/master/src/","line":"L"}],"disableAutoModuleName":"false"}-->
|
||||||
|
</div>
|
||||||
|
<div class="col-2 col-menu secondary-menu">
|
||||||
|
<nav class="tsd-navigation secondary menu-sticky">
|
||||||
|
<ul class="before-current">
|
||||||
|
</ul>
|
||||||
|
<ul class="current">
|
||||||
|
<li class="current tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.fileuploader.html" class="tsd-kind-icon">File<wbr>Uploader</a>
|
||||||
|
<ul>
|
||||||
|
<li class=" tsd-kind-constructor tsd-parent-kind-class">
|
||||||
|
<a href="reflection-724.reflection-187.fileuploader.html#constructor" class="tsd-kind-icon">constructor</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<a href="reflection-724.reflection-187.fileuploader.html#uploadfile" class="tsd-kind-icon">upload<wbr>File</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="after-current">
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.sas9apiclient.html" class="tsd-kind-icon">SAS9<wbr>Api<wbr>Client</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.sasviyaapiclient.html" class="tsd-kind-icon">SASViya<wbr>Api<wbr>Client</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.sasjs.html" class="tsd-kind-icon">SASjs</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.sessionmanager.html" class="tsd-kind-icon">Session<wbr>Manager</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<footer class="with-border-bottom">
|
||||||
|
</footer>
|
||||||
|
<div class="container tsd-generator">
|
||||||
|
<p>Generated using <a href="http://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||||
|
</div>
|
||||||
|
<div class="overlay"></div>
|
||||||
|
<script src="../assets/js/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
312
docs/classes/reflection-724.reflection-187.sas9apiclient.html
Normal file
312
docs/classes/reflection-724.reflection-187.sas9apiclient.html
Normal file
@@ -0,0 +1,312 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html class="default no-js">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<title>SAS9ApiClient | @sasjs/adapter</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="../assets/css/main.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div class="tsd-page-toolbar">
|
||||||
|
<div class="container">
|
||||||
|
<div class="table-wrap">
|
||||||
|
<div class="table-cell" id="tsd-search" data-index="../assets/js/search.json" data-base="..">
|
||||||
|
<div class="field">
|
||||||
|
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label>
|
||||||
|
<input id="tsd-search-field" type="text" />
|
||||||
|
</div>
|
||||||
|
<ul class="results">
|
||||||
|
<li class="state loading">Preparing search index...</li>
|
||||||
|
<li class="state failure">The search index is not available</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="results-priority" style="display:none">
|
||||||
|
</ul>
|
||||||
|
<a href="../index.html" class="title">@sasjs/adapter</a>
|
||||||
|
 <a href="https://github.com/sasjs/adapter" class="title">SASjs on Github</a>
|
||||||
|
 <a href="https://sasjs.io" class="title">SASjs.io</a>
|
||||||
|
 <a href="https://github.com/sasjs/cli" class="title">SASjs CLI</a>
|
||||||
|
 <a href="https://github.com/sasjs/react-seed-app" class="title">React Seed App</a>
|
||||||
|
</div>
|
||||||
|
<div class="table-cell" id="tsd-widgets">
|
||||||
|
<div id="tsd-filter">
|
||||||
|
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||||
|
<div class="tsd-filter-group">
|
||||||
|
<div class="tsd-select" id="tsd-filter-visibility">
|
||||||
|
<span class="tsd-select-label">All</span>
|
||||||
|
<ul class="tsd-select-list">
|
||||||
|
<li data-value="public">Public</li>
|
||||||
|
<li data-value="protected">Public/Protected</li>
|
||||||
|
<li data-value="private" class="selected">All</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" id="tsd-filter-inherited" checked />
|
||||||
|
<label class="tsd-widget" for="tsd-filter-inherited">Inherited</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tsd-page-title">
|
||||||
|
<div class="container">
|
||||||
|
<ul class="tsd-breadcrumb">
|
||||||
|
<li>
|
||||||
|
<a href="../modules/reflection-724.html"></a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="../modules/reflection-724.reflection-187.html"></a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="reflection-724.reflection-187.sas9apiclient.html">SAS9ApiClient</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="container container-main">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-3 col-menu menu-sticky-wrap menu-highlight">
|
||||||
|
<nav class="tsd-navigation outline primary">
|
||||||
|
<a style="margin-left:0em" href="../globals.html">Globals</a>
|
||||||
|
<ul style="display:none">
|
||||||
|
{"SAS Adapter":{"SASjs":"classes/reflection-717.reflection-180.sasjs","Types":"modules/types"},"SAS Viya API Client":"classes/reflection-717.reflection-180.sasviyaapiclient","SAS 9 API Client":"classes/reflection-717.reflection-180.sas9apiclient"}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
<div class="col-7 offset-3 col-content">
|
||||||
|
<h1>Class SAS9ApiClient</h1>
|
||||||
|
<section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography tsd-comment-shorttext">
|
||||||
|
<div class="lead">
|
||||||
|
<p>A client for interfacing with the SAS9 REST API.</p>
|
||||||
|
</div>
|
||||||
|
</div></section>
|
||||||
|
<section class="tsd-panel tsd-hierarchy">
|
||||||
|
<h3>Hierarchy</h3>
|
||||||
|
<ul class="tsd-hierarchy">
|
||||||
|
<li>
|
||||||
|
<span class="target">SAS9ApiClient</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel-group tsd-index-group">
|
||||||
|
<section class="tsd-panel tsd-index-panel">
|
||||||
|
<div class="tsd-index-content">
|
||||||
|
<section class="tsd-index-section ">
|
||||||
|
<h3>Constructors</h3>
|
||||||
|
<ul class="tsd-index-list">
|
||||||
|
<li class="tsd-kind-constructor tsd-parent-kind-class"><a href="reflection-724.reflection-187.sas9apiclient.html#constructor" class="tsd-kind-icon">constructor</a></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-index-section ">
|
||||||
|
<h3>Methods</h3>
|
||||||
|
<ul class="tsd-index-list">
|
||||||
|
<li class="tsd-kind-method tsd-parent-kind-class"><a href="reflection-724.reflection-187.sas9apiclient.html#executescript" class="tsd-kind-icon">executeScript</a></li>
|
||||||
|
<li class="tsd-kind-method tsd-parent-kind-class"><a href="reflection-724.reflection-187.sas9apiclient.html#getconfig" class="tsd-kind-icon">getConfig</a></li>
|
||||||
|
<li class="tsd-kind-method tsd-parent-kind-class"><a href="reflection-724.reflection-187.sas9apiclient.html#setconfig" class="tsd-kind-icon">setConfig</a></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel-group tsd-member-group ">
|
||||||
|
<h2>Constructors</h2>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class">
|
||||||
|
<a name="constructor" class="tsd-anchor"></a>
|
||||||
|
<h3>constructor</h3>
|
||||||
|
<ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class">
|
||||||
|
<li class="tsd-signature tsd-kind-icon">new SAS9<wbr>Api<wbr>Client<span class="tsd-signature-symbol">(</span>serverUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="reflection-724.reflection-187.sas9apiclient.html" class="tsd-signature-type">SAS9ApiClient</a></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="tsd-descriptions">
|
||||||
|
<li class="tsd-description">
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
<ul>
|
||||||
|
<li>Defined in
|
||||||
|
<a href="https://github.com/sasjs/adapter/blob/master/src/SAS9ApiClient.ts#L7">
|
||||||
|
SAS9ApiClient.ts:7
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li>
|
||||||
|
<h5>serverUrl: <span class="tsd-signature-type">string</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h4 class="tsd-returns-title">Returns <a href="reflection-724.reflection-187.sas9apiclient.html" class="tsd-signature-type">SAS9ApiClient</a></h4>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel-group tsd-member-group ">
|
||||||
|
<h2>Methods</h2>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<a name="executescript" class="tsd-anchor"></a>
|
||||||
|
<h3>execute<wbr>Script</h3>
|
||||||
|
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<li class="tsd-signature tsd-kind-icon">execute<wbr>Script<span class="tsd-signature-symbol">(</span>linesOfCode<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span>, serverName<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, repositoryName<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">></span></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="tsd-descriptions">
|
||||||
|
<li class="tsd-description">
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
<ul>
|
||||||
|
<li>Defined in
|
||||||
|
<a href="https://github.com/sasjs/adapter/blob/master/src/SAS9ApiClient.ts#L35">
|
||||||
|
SAS9ApiClient.ts:35
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
<div class="tsd-comment tsd-typography tsd-comment-shorttext">
|
||||||
|
<div class="lead">
|
||||||
|
<p>Executes code on a SAS9 server.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li>
|
||||||
|
<h5>linesOfCode: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span></h5>
|
||||||
|
<div class="tsd-comment tsd-typography tsd-comment-text">
|
||||||
|
<p>an array of code lines to execute.</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>serverName: <span class="tsd-signature-type">string</span></h5>
|
||||||
|
<div class="tsd-comment tsd-typography tsd-comment-text">
|
||||||
|
<p>the server to execute the code on.</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>repositoryName: <span class="tsd-signature-type">string</span></h5>
|
||||||
|
<div class="tsd-comment tsd-typography tsd-comment-text">
|
||||||
|
<p>the repository to execute the code in.</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<a name="getconfig" class="tsd-anchor"></a>
|
||||||
|
<h3>get<wbr>Config</h3>
|
||||||
|
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<li class="tsd-signature tsd-kind-icon">get<wbr>Config<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">object</span></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="tsd-descriptions">
|
||||||
|
<li class="tsd-description">
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
<ul>
|
||||||
|
<li>Defined in
|
||||||
|
<a href="https://github.com/sasjs/adapter/blob/master/src/SAS9ApiClient.ts#L15">
|
||||||
|
SAS9ApiClient.ts:15
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
<div class="tsd-comment tsd-typography tsd-comment-shorttext">
|
||||||
|
<div class="lead">
|
||||||
|
<p>Returns an object containing server URL.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">object</span></h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>server<wbr>Url<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<a name="setconfig" class="tsd-anchor"></a>
|
||||||
|
<h3>set<wbr>Config</h3>
|
||||||
|
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<li class="tsd-signature tsd-kind-icon">set<wbr>Config<span class="tsd-signature-symbol">(</span>serverUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="tsd-descriptions">
|
||||||
|
<li class="tsd-description">
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
<ul>
|
||||||
|
<li>Defined in
|
||||||
|
<a href="https://github.com/sasjs/adapter/blob/master/src/SAS9ApiClient.ts#L25">
|
||||||
|
SAS9ApiClient.ts:25
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
<div class="tsd-comment tsd-typography tsd-comment-shorttext">
|
||||||
|
<div class="lead">
|
||||||
|
<p>Updates server URL which is not null.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li>
|
||||||
|
<h5>serverUrl: <span class="tsd-signature-type">string</span></h5>
|
||||||
|
<div class="tsd-comment tsd-typography tsd-comment-text">
|
||||||
|
<p>URL of the server to be set.</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<!--{"options":"/Users/allan/git/adapter","tsconfig":"/Users/allan/git/adapter","inputFiles":["/Users/allan/git/adapter/src/FileUploader.ts","/Users/allan/git/adapter/src/SAS9ApiClient.ts","/Users/allan/git/adapter/src/SASViyaApiClient.ts","/Users/allan/git/adapter/src/SASjs.ts","/Users/allan/git/adapter/src/SessionManager.ts","/Users/allan/git/adapter/src/index.ts","/Users/allan/git/adapter/src/types/Context.ts","/Users/allan/git/adapter/src/types/CsrfToken.ts","/Users/allan/git/adapter/src/types/ErrorResponse.ts","/Users/allan/git/adapter/src/types/Folder.ts","/Users/allan/git/adapter/src/types/Job.ts","/Users/allan/git/adapter/src/types/JobDefinition.ts","/Users/allan/git/adapter/src/types/JobResult.ts","/Users/allan/git/adapter/src/types/Link.ts","/Users/allan/git/adapter/src/types/SASjsConfig.ts","/Users/allan/git/adapter/src/types/SASjsRequest.ts","/Users/allan/git/adapter/src/types/SASjsWaitingRequest.ts","/Users/allan/git/adapter/src/types/ServerType.ts","/Users/allan/git/adapter/src/types/Session.ts","/Users/allan/git/adapter/src/types/UploadFile.ts","/Users/allan/git/adapter/src/types/index.ts","/Users/allan/git/adapter/src/utils/asyncForEach.ts","/Users/allan/git/adapter/src/utils/compareTimestamps.ts","/Users/allan/git/adapter/src/utils/convertToCsv.ts","/Users/allan/git/adapter/src/utils/formatDataForRequest.ts","/Users/allan/git/adapter/src/utils/index.ts","/Users/allan/git/adapter/src/utils/isAuthorizeFormRequired.ts","/Users/allan/git/adapter/src/utils/isIeOrEdge.ts","/Users/allan/git/adapter/src/utils/isLoginRequired.ts","/Users/allan/git/adapter/src/utils/isLoginSuccess.ts","/Users/allan/git/adapter/src/utils/isUri.ts","/Users/allan/git/adapter/src/utils/isUrl.ts","/Users/allan/git/adapter/src/utils/makeRequest.ts","/Users/allan/git/adapter/src/utils/needsRetry.ts","/Users/allan/git/adapter/src/utils/parseAndSubmitAuthorizeForm.ts","/Users/allan/git/adapter/src/utils/parseGeneratedCode.ts","/Users/allan/git/adapter/src/utils/parseSasViyaLog.ts","/Users/allan/git/adapter/src/utils/parseSourceCode.ts","/Users/allan/git/adapter/src/utils/parseWeboutResponse.ts","/Users/allan/git/adapter/src/utils/serialize.ts","/Users/allan/git/adapter/src/utils/splitChunks.ts"],"mode":1,"includeDeclarations":true,"entryPoint":"","exclude":["**/*+(index|.spec|.e2e).ts"],"externalPattern":[],"excludeExternals":true,"excludeNotExported":true,"excludeNotDocumented":false,"excludePrivate":true,"excludeProtected":false,"ignoreCompilerErrors":true,"disableSources":false,"includes":"","media":"","out":"docs","json":"","theme":"./node_modules/typedoc-neo-theme/bin/default","name":"","includeVersion":false,"excludeTags":[],"readme":"","defaultCategory":"Other","categoryOrder":[],"categorizeByGroup":true,"gitRevision":"","gitRemote":"origin","gaID":"","gaSite":"auto","hideGenerator":false,"toc":[],"disableOutputCheck":true,"help":false,"version":false,"plugin":[],"logger":"console","listInvalidSymbolLinks":false,"links":[{"label":"SASjs on Github","url":"https://github.com/sasjs/adapter"},{"label":"SASjs.io","url":"https://sasjs.io"},{"label":"SASjs CLI","url":"https://github.com/sasjs/cli"},{"label":"React Seed App","url":"https://github.com/sasjs/react-seed-app"}],"outline":[{"SAS Adapter":{"SASjs":"classes/reflection-717.reflection-180.sasjs","Types":"modules/types"},"SAS Viya API Client":"classes/reflection-717.reflection-180.sasviyaapiclient","SAS 9 API Client":"classes/reflection-717.reflection-180.sas9apiclient"}],"source":[{"path":"https://github.com/sasjs/adapter/blob/master/src/","line":"L"}],"disableAutoModuleName":"false"}-->
|
||||||
|
</div>
|
||||||
|
<div class="col-2 col-menu secondary-menu">
|
||||||
|
<nav class="tsd-navigation secondary menu-sticky">
|
||||||
|
<ul class="before-current">
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.fileuploader.html" class="tsd-kind-icon">File<wbr>Uploader</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="current">
|
||||||
|
<li class="current tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.sas9apiclient.html" class="tsd-kind-icon">SAS9<wbr>Api<wbr>Client</a>
|
||||||
|
<ul>
|
||||||
|
<li class=" tsd-kind-constructor tsd-parent-kind-class">
|
||||||
|
<a href="reflection-724.reflection-187.sas9apiclient.html#constructor" class="tsd-kind-icon">constructor</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<a href="reflection-724.reflection-187.sas9apiclient.html#executescript" class="tsd-kind-icon">execute<wbr>Script</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<a href="reflection-724.reflection-187.sas9apiclient.html#getconfig" class="tsd-kind-icon">get<wbr>Config</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<a href="reflection-724.reflection-187.sas9apiclient.html#setconfig" class="tsd-kind-icon">set<wbr>Config</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="after-current">
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.sasviyaapiclient.html" class="tsd-kind-icon">SASViya<wbr>Api<wbr>Client</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.sasjs.html" class="tsd-kind-icon">SASjs</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.sessionmanager.html" class="tsd-kind-icon">Session<wbr>Manager</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<footer class="with-border-bottom">
|
||||||
|
</footer>
|
||||||
|
<div class="container tsd-generator">
|
||||||
|
<p>Generated using <a href="http://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||||
|
</div>
|
||||||
|
<div class="overlay"></div>
|
||||||
|
<script src="../assets/js/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
1336
docs/classes/reflection-724.reflection-187.sasjs.html
Normal file
1336
docs/classes/reflection-724.reflection-187.sasjs.html
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
271
docs/classes/reflection-724.reflection-187.sessionmanager.html
Normal file
271
docs/classes/reflection-724.reflection-187.sessionmanager.html
Normal file
@@ -0,0 +1,271 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html class="default no-js">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<title>SessionManager | @sasjs/adapter</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="../assets/css/main.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div class="tsd-page-toolbar">
|
||||||
|
<div class="container">
|
||||||
|
<div class="table-wrap">
|
||||||
|
<div class="table-cell" id="tsd-search" data-index="../assets/js/search.json" data-base="..">
|
||||||
|
<div class="field">
|
||||||
|
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label>
|
||||||
|
<input id="tsd-search-field" type="text" />
|
||||||
|
</div>
|
||||||
|
<ul class="results">
|
||||||
|
<li class="state loading">Preparing search index...</li>
|
||||||
|
<li class="state failure">The search index is not available</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="results-priority" style="display:none">
|
||||||
|
</ul>
|
||||||
|
<a href="../index.html" class="title">@sasjs/adapter</a>
|
||||||
|
 <a href="https://github.com/sasjs/adapter" class="title">SASjs on Github</a>
|
||||||
|
 <a href="https://sasjs.io" class="title">SASjs.io</a>
|
||||||
|
 <a href="https://github.com/sasjs/cli" class="title">SASjs CLI</a>
|
||||||
|
 <a href="https://github.com/sasjs/react-seed-app" class="title">React Seed App</a>
|
||||||
|
</div>
|
||||||
|
<div class="table-cell" id="tsd-widgets">
|
||||||
|
<div id="tsd-filter">
|
||||||
|
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||||
|
<div class="tsd-filter-group">
|
||||||
|
<div class="tsd-select" id="tsd-filter-visibility">
|
||||||
|
<span class="tsd-select-label">All</span>
|
||||||
|
<ul class="tsd-select-list">
|
||||||
|
<li data-value="public">Public</li>
|
||||||
|
<li data-value="protected">Public/Protected</li>
|
||||||
|
<li data-value="private" class="selected">All</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" id="tsd-filter-inherited" checked />
|
||||||
|
<label class="tsd-widget" for="tsd-filter-inherited">Inherited</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tsd-page-title">
|
||||||
|
<div class="container">
|
||||||
|
<ul class="tsd-breadcrumb">
|
||||||
|
<li>
|
||||||
|
<a href="../modules/reflection-724.html"></a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="../modules/reflection-724.reflection-187.html"></a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="reflection-724.reflection-187.sessionmanager.html">SessionManager</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="container container-main">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-3 col-menu menu-sticky-wrap menu-highlight">
|
||||||
|
<nav class="tsd-navigation outline primary">
|
||||||
|
<a style="margin-left:0em" href="../globals.html">Globals</a>
|
||||||
|
<ul style="display:none">
|
||||||
|
{"SAS Adapter":{"SASjs":"classes/reflection-717.reflection-180.sasjs","Types":"modules/types"},"SAS Viya API Client":"classes/reflection-717.reflection-180.sasviyaapiclient","SAS 9 API Client":"classes/reflection-717.reflection-180.sas9apiclient"}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
<div class="col-7 offset-3 col-content">
|
||||||
|
<h1>Class SessionManager</h1>
|
||||||
|
<section class="tsd-panel tsd-hierarchy">
|
||||||
|
<h3>Hierarchy</h3>
|
||||||
|
<ul class="tsd-hierarchy">
|
||||||
|
<li>
|
||||||
|
<span class="target">SessionManager</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel-group tsd-index-group">
|
||||||
|
<section class="tsd-panel tsd-index-panel">
|
||||||
|
<div class="tsd-index-content">
|
||||||
|
<section class="tsd-index-section ">
|
||||||
|
<h3>Constructors</h3>
|
||||||
|
<ul class="tsd-index-list">
|
||||||
|
<li class="tsd-kind-constructor tsd-parent-kind-class"><a href="reflection-724.reflection-187.sessionmanager.html#constructor" class="tsd-kind-icon">constructor</a></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-index-section ">
|
||||||
|
<h3>Methods</h3>
|
||||||
|
<ul class="tsd-index-list">
|
||||||
|
<li class="tsd-kind-method tsd-parent-kind-class"><a href="reflection-724.reflection-187.sessionmanager.html#clearsession" class="tsd-kind-icon">clearSession</a></li>
|
||||||
|
<li class="tsd-kind-method tsd-parent-kind-class"><a href="reflection-724.reflection-187.sessionmanager.html#getsession" class="tsd-kind-icon">getSession</a></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel-group tsd-member-group ">
|
||||||
|
<h2>Constructors</h2>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class">
|
||||||
|
<a name="constructor" class="tsd-anchor"></a>
|
||||||
|
<h3>constructor</h3>
|
||||||
|
<ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class">
|
||||||
|
<li class="tsd-signature tsd-kind-icon">new <wbr>Session<wbr>Manager<span class="tsd-signature-symbol">(</span>serverUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, contextName<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, setCsrfToken<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">function</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="reflection-724.reflection-187.sessionmanager.html" class="tsd-signature-type">SessionManager</a></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="tsd-descriptions">
|
||||||
|
<li class="tsd-description">
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
<ul>
|
||||||
|
<li>Defined in
|
||||||
|
<a href="https://github.com/sasjs/adapter/blob/master/src/SessionManager.ts#L6">
|
||||||
|
SessionManager.ts:6
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li>
|
||||||
|
<h5>serverUrl: <span class="tsd-signature-type">string</span></h5>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>contextName: <span class="tsd-signature-type">string</span></h5>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>setCsrfToken: <span class="tsd-signature-type">function</span></h5>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter-siganture">
|
||||||
|
<ul class="tsd-signatures tsd-kind-type-literal">
|
||||||
|
<li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>csrfToken<span class="tsd-signature-symbol">: </span><a href="../interfaces/types.csrftoken.html" class="tsd-signature-type">CsrfToken</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="tsd-descriptions">
|
||||||
|
<li class="tsd-description">
|
||||||
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li>
|
||||||
|
<h5>csrfToken: <a href="../interfaces/types.csrftoken.html" class="tsd-signature-type">CsrfToken</a></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h4 class="tsd-returns-title">Returns <a href="reflection-724.reflection-187.sessionmanager.html" class="tsd-signature-type">SessionManager</a></h4>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel-group tsd-member-group ">
|
||||||
|
<h2>Methods</h2>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<a name="clearsession" class="tsd-anchor"></a>
|
||||||
|
<h3>clear<wbr>Session</h3>
|
||||||
|
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<li class="tsd-signature tsd-kind-icon">clear<wbr>Session<span class="tsd-signature-symbol">(</span>id<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, accessToken<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="tsd-descriptions">
|
||||||
|
<li class="tsd-description">
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
<ul>
|
||||||
|
<li>Defined in
|
||||||
|
<a href="https://github.com/sasjs/adapter/blob/master/src/SessionManager.ts#L37">
|
||||||
|
SessionManager.ts:37
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li>
|
||||||
|
<h5>id: <span class="tsd-signature-type">string</span></h5>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5><span class="tsd-flag ts-flagOptional">Optional</span> accessToken: <span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<a name="getsession" class="tsd-anchor"></a>
|
||||||
|
<h3>get<wbr>Session</h3>
|
||||||
|
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<li class="tsd-signature tsd-kind-icon">get<wbr>Session<span class="tsd-signature-symbol">(</span>accessToken<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><a href="../interfaces/types.session.html" class="tsd-signature-type">Session</a><span class="tsd-signature-symbol">></span></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="tsd-descriptions">
|
||||||
|
<li class="tsd-description">
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
<ul>
|
||||||
|
<li>Defined in
|
||||||
|
<a href="https://github.com/sasjs/adapter/blob/master/src/SessionManager.ts#L19">
|
||||||
|
SessionManager.ts:19
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li>
|
||||||
|
<h5><span class="tsd-flag ts-flagOptional">Optional</span> accessToken: <span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><a href="../interfaces/types.session.html" class="tsd-signature-type">Session</a><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<!--{"options":"/Users/allan/git/adapter","tsconfig":"/Users/allan/git/adapter","inputFiles":["/Users/allan/git/adapter/src/FileUploader.ts","/Users/allan/git/adapter/src/SAS9ApiClient.ts","/Users/allan/git/adapter/src/SASViyaApiClient.ts","/Users/allan/git/adapter/src/SASjs.ts","/Users/allan/git/adapter/src/SessionManager.ts","/Users/allan/git/adapter/src/index.ts","/Users/allan/git/adapter/src/types/Context.ts","/Users/allan/git/adapter/src/types/CsrfToken.ts","/Users/allan/git/adapter/src/types/ErrorResponse.ts","/Users/allan/git/adapter/src/types/Folder.ts","/Users/allan/git/adapter/src/types/Job.ts","/Users/allan/git/adapter/src/types/JobDefinition.ts","/Users/allan/git/adapter/src/types/JobResult.ts","/Users/allan/git/adapter/src/types/Link.ts","/Users/allan/git/adapter/src/types/SASjsConfig.ts","/Users/allan/git/adapter/src/types/SASjsRequest.ts","/Users/allan/git/adapter/src/types/SASjsWaitingRequest.ts","/Users/allan/git/adapter/src/types/ServerType.ts","/Users/allan/git/adapter/src/types/Session.ts","/Users/allan/git/adapter/src/types/UploadFile.ts","/Users/allan/git/adapter/src/types/index.ts","/Users/allan/git/adapter/src/utils/asyncForEach.ts","/Users/allan/git/adapter/src/utils/compareTimestamps.ts","/Users/allan/git/adapter/src/utils/convertToCsv.ts","/Users/allan/git/adapter/src/utils/formatDataForRequest.ts","/Users/allan/git/adapter/src/utils/index.ts","/Users/allan/git/adapter/src/utils/isAuthorizeFormRequired.ts","/Users/allan/git/adapter/src/utils/isIeOrEdge.ts","/Users/allan/git/adapter/src/utils/isLoginRequired.ts","/Users/allan/git/adapter/src/utils/isLoginSuccess.ts","/Users/allan/git/adapter/src/utils/isUri.ts","/Users/allan/git/adapter/src/utils/isUrl.ts","/Users/allan/git/adapter/src/utils/makeRequest.ts","/Users/allan/git/adapter/src/utils/needsRetry.ts","/Users/allan/git/adapter/src/utils/parseAndSubmitAuthorizeForm.ts","/Users/allan/git/adapter/src/utils/parseGeneratedCode.ts","/Users/allan/git/adapter/src/utils/parseSasViyaLog.ts","/Users/allan/git/adapter/src/utils/parseSourceCode.ts","/Users/allan/git/adapter/src/utils/parseWeboutResponse.ts","/Users/allan/git/adapter/src/utils/serialize.ts","/Users/allan/git/adapter/src/utils/splitChunks.ts"],"mode":1,"includeDeclarations":true,"entryPoint":"","exclude":["**/*+(index|.spec|.e2e).ts"],"externalPattern":[],"excludeExternals":true,"excludeNotExported":true,"excludeNotDocumented":false,"excludePrivate":true,"excludeProtected":false,"ignoreCompilerErrors":true,"disableSources":false,"includes":"","media":"","out":"docs","json":"","theme":"./node_modules/typedoc-neo-theme/bin/default","name":"","includeVersion":false,"excludeTags":[],"readme":"","defaultCategory":"Other","categoryOrder":[],"categorizeByGroup":true,"gitRevision":"","gitRemote":"origin","gaID":"","gaSite":"auto","hideGenerator":false,"toc":[],"disableOutputCheck":true,"help":false,"version":false,"plugin":[],"logger":"console","listInvalidSymbolLinks":false,"links":[{"label":"SASjs on Github","url":"https://github.com/sasjs/adapter"},{"label":"SASjs.io","url":"https://sasjs.io"},{"label":"SASjs CLI","url":"https://github.com/sasjs/cli"},{"label":"React Seed App","url":"https://github.com/sasjs/react-seed-app"}],"outline":[{"SAS Adapter":{"SASjs":"classes/reflection-717.reflection-180.sasjs","Types":"modules/types"},"SAS Viya API Client":"classes/reflection-717.reflection-180.sasviyaapiclient","SAS 9 API Client":"classes/reflection-717.reflection-180.sas9apiclient"}],"source":[{"path":"https://github.com/sasjs/adapter/blob/master/src/","line":"L"}],"disableAutoModuleName":"false"}-->
|
||||||
|
</div>
|
||||||
|
<div class="col-2 col-menu secondary-menu">
|
||||||
|
<nav class="tsd-navigation secondary menu-sticky">
|
||||||
|
<ul class="before-current">
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.fileuploader.html" class="tsd-kind-icon">File<wbr>Uploader</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.sas9apiclient.html" class="tsd-kind-icon">SAS9<wbr>Api<wbr>Client</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.sasviyaapiclient.html" class="tsd-kind-icon">SASViya<wbr>Api<wbr>Client</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.sasjs.html" class="tsd-kind-icon">SASjs</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="current">
|
||||||
|
<li class="current tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="reflection-724.reflection-187.sessionmanager.html" class="tsd-kind-icon">Session<wbr>Manager</a>
|
||||||
|
<ul>
|
||||||
|
<li class=" tsd-kind-constructor tsd-parent-kind-class">
|
||||||
|
<a href="reflection-724.reflection-187.sessionmanager.html#constructor" class="tsd-kind-icon">constructor</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<a href="reflection-724.reflection-187.sessionmanager.html#clearsession" class="tsd-kind-icon">clear<wbr>Session</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-method tsd-parent-kind-class">
|
||||||
|
<a href="reflection-724.reflection-187.sessionmanager.html#getsession" class="tsd-kind-icon">get<wbr>Session</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="after-current">
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<footer class="with-border-bottom">
|
||||||
|
</footer>
|
||||||
|
<div class="container tsd-generator">
|
||||||
|
<p>Generated using <a href="http://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||||
|
</div>
|
||||||
|
<div class="overlay"></div>
|
||||||
|
<script src="../assets/js/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1336
docs/classes/reflection-725.reflection-191.sasjs.html
Normal file
1336
docs/classes/reflection-725.reflection-191.sasjs.html
Normal file
File diff suppressed because one or more lines are too long
1267
docs/classes/reflection-725.reflection-191.sasviyaapiclient.html
Normal file
1267
docs/classes/reflection-725.reflection-191.sasviyaapiclient.html
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
231
docs/classes/reflection-725.reflection-194.fileuploader.html
Normal file
231
docs/classes/reflection-725.reflection-194.fileuploader.html
Normal file
File diff suppressed because one or more lines are too long
312
docs/classes/reflection-725.reflection-194.sas9apiclient.html
Normal file
312
docs/classes/reflection-725.reflection-194.sas9apiclient.html
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1270
docs/classes/reflection-725.reflection-194.sasviyaapiclient.html
Normal file
1270
docs/classes/reflection-725.reflection-194.sasviyaapiclient.html
Normal file
File diff suppressed because one or more lines are too long
271
docs/classes/reflection-725.reflection-194.sessionmanager.html
Normal file
271
docs/classes/reflection-725.reflection-194.sessionmanager.html
Normal file
File diff suppressed because one or more lines are too long
230
docs/classes/types.errorresponse.html
Normal file
230
docs/classes/types.errorresponse.html
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
106
docs/modules/reflection-717.html
Normal file
106
docs/modules/reflection-717.html
Normal file
File diff suppressed because one or more lines are too long
128
docs/modules/reflection-717.reflection-180.html
Normal file
128
docs/modules/reflection-717.reflection-180.html
Normal file
File diff suppressed because one or more lines are too long
106
docs/modules/reflection-724.html
Normal file
106
docs/modules/reflection-724.html
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html class="default no-js">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<title> | @sasjs/adapter</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="../assets/css/main.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div class="tsd-page-toolbar">
|
||||||
|
<div class="container">
|
||||||
|
<div class="table-wrap">
|
||||||
|
<div class="table-cell" id="tsd-search" data-index="../assets/js/search.json" data-base="..">
|
||||||
|
<div class="field">
|
||||||
|
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label>
|
||||||
|
<input id="tsd-search-field" type="text" />
|
||||||
|
</div>
|
||||||
|
<ul class="results">
|
||||||
|
<li class="state loading">Preparing search index...</li>
|
||||||
|
<li class="state failure">The search index is not available</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="results-priority" style="display:none">
|
||||||
|
</ul>
|
||||||
|
<a href="../index.html" class="title">@sasjs/adapter</a>
|
||||||
|
 <a href="https://github.com/sasjs/adapter" class="title">SASjs on Github</a>
|
||||||
|
 <a href="https://sasjs.io" class="title">SASjs.io</a>
|
||||||
|
 <a href="https://github.com/sasjs/cli" class="title">SASjs CLI</a>
|
||||||
|
 <a href="https://github.com/sasjs/react-seed-app" class="title">React Seed App</a>
|
||||||
|
</div>
|
||||||
|
<div class="table-cell" id="tsd-widgets">
|
||||||
|
<div id="tsd-filter">
|
||||||
|
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||||
|
<div class="tsd-filter-group">
|
||||||
|
<div class="tsd-select" id="tsd-filter-visibility">
|
||||||
|
<span class="tsd-select-label">All</span>
|
||||||
|
<ul class="tsd-select-list">
|
||||||
|
<li data-value="public">Public</li>
|
||||||
|
<li data-value="protected">Public/Protected</li>
|
||||||
|
<li data-value="private" class="selected">All</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" id="tsd-filter-inherited" checked />
|
||||||
|
<label class="tsd-widget" for="tsd-filter-inherited">Inherited</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tsd-page-title">
|
||||||
|
<div class="container">
|
||||||
|
<ul class="tsd-breadcrumb">
|
||||||
|
<li>
|
||||||
|
<a href="reflection-724.html"></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="container container-main">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-3 col-menu menu-sticky-wrap menu-highlight">
|
||||||
|
<nav class="tsd-navigation outline primary">
|
||||||
|
<a style="margin-left:0em" href="../globals.html">Globals</a>
|
||||||
|
<ul style="display:none">
|
||||||
|
{"SAS Adapter":{"SASjs":"classes/reflection-717.reflection-180.sasjs","Types":"modules/types"},"SAS Viya API Client":"classes/reflection-717.reflection-180.sasviyaapiclient","SAS 9 API Client":"classes/reflection-717.reflection-180.sas9apiclient"}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
<div class="col-7 offset-3 col-content">
|
||||||
|
<h1>Module</h1>
|
||||||
|
<section class="tsd-panel-group tsd-index-group">
|
||||||
|
<section class="tsd-panel tsd-index-panel">
|
||||||
|
<div class="tsd-index-content">
|
||||||
|
<section class="tsd-index-section ">
|
||||||
|
<h3>Modules</h3>
|
||||||
|
<ul class="tsd-index-list">
|
||||||
|
<li class="tsd-kind-module tsd-parent-kind-module"><a href="reflection-724.reflection-187.html" class="tsd-kind-icon"><em>Module</em></a></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<!--{"options":"/Users/allan/git/adapter","tsconfig":"/Users/allan/git/adapter","inputFiles":["/Users/allan/git/adapter/src/FileUploader.ts","/Users/allan/git/adapter/src/SAS9ApiClient.ts","/Users/allan/git/adapter/src/SASViyaApiClient.ts","/Users/allan/git/adapter/src/SASjs.ts","/Users/allan/git/adapter/src/SessionManager.ts","/Users/allan/git/adapter/src/index.ts","/Users/allan/git/adapter/src/types/Context.ts","/Users/allan/git/adapter/src/types/CsrfToken.ts","/Users/allan/git/adapter/src/types/ErrorResponse.ts","/Users/allan/git/adapter/src/types/Folder.ts","/Users/allan/git/adapter/src/types/Job.ts","/Users/allan/git/adapter/src/types/JobDefinition.ts","/Users/allan/git/adapter/src/types/JobResult.ts","/Users/allan/git/adapter/src/types/Link.ts","/Users/allan/git/adapter/src/types/SASjsConfig.ts","/Users/allan/git/adapter/src/types/SASjsRequest.ts","/Users/allan/git/adapter/src/types/SASjsWaitingRequest.ts","/Users/allan/git/adapter/src/types/ServerType.ts","/Users/allan/git/adapter/src/types/Session.ts","/Users/allan/git/adapter/src/types/UploadFile.ts","/Users/allan/git/adapter/src/types/index.ts","/Users/allan/git/adapter/src/utils/asyncForEach.ts","/Users/allan/git/adapter/src/utils/compareTimestamps.ts","/Users/allan/git/adapter/src/utils/convertToCsv.ts","/Users/allan/git/adapter/src/utils/formatDataForRequest.ts","/Users/allan/git/adapter/src/utils/index.ts","/Users/allan/git/adapter/src/utils/isAuthorizeFormRequired.ts","/Users/allan/git/adapter/src/utils/isIeOrEdge.ts","/Users/allan/git/adapter/src/utils/isLoginRequired.ts","/Users/allan/git/adapter/src/utils/isLoginSuccess.ts","/Users/allan/git/adapter/src/utils/isUri.ts","/Users/allan/git/adapter/src/utils/isUrl.ts","/Users/allan/git/adapter/src/utils/makeRequest.ts","/Users/allan/git/adapter/src/utils/needsRetry.ts","/Users/allan/git/adapter/src/utils/parseAndSubmitAuthorizeForm.ts","/Users/allan/git/adapter/src/utils/parseGeneratedCode.ts","/Users/allan/git/adapter/src/utils/parseSasViyaLog.ts","/Users/allan/git/adapter/src/utils/parseSourceCode.ts","/Users/allan/git/adapter/src/utils/parseWeboutResponse.ts","/Users/allan/git/adapter/src/utils/serialize.ts","/Users/allan/git/adapter/src/utils/splitChunks.ts"],"mode":1,"includeDeclarations":true,"entryPoint":"","exclude":["**/*+(index|.spec|.e2e).ts"],"externalPattern":[],"excludeExternals":true,"excludeNotExported":true,"excludeNotDocumented":false,"excludePrivate":true,"excludeProtected":false,"ignoreCompilerErrors":true,"disableSources":false,"includes":"","media":"","out":"docs","json":"","theme":"./node_modules/typedoc-neo-theme/bin/default","name":"","includeVersion":false,"excludeTags":[],"readme":"","defaultCategory":"Other","categoryOrder":[],"categorizeByGroup":true,"gitRevision":"","gitRemote":"origin","gaID":"","gaSite":"auto","hideGenerator":false,"toc":[],"disableOutputCheck":true,"help":false,"version":false,"plugin":[],"logger":"console","listInvalidSymbolLinks":false,"links":[{"label":"SASjs on Github","url":"https://github.com/sasjs/adapter"},{"label":"SASjs.io","url":"https://sasjs.io"},{"label":"SASjs CLI","url":"https://github.com/sasjs/cli"},{"label":"React Seed App","url":"https://github.com/sasjs/react-seed-app"}],"outline":[{"SAS Adapter":{"SASjs":"classes/reflection-717.reflection-180.sasjs","Types":"modules/types"},"SAS Viya API Client":"classes/reflection-717.reflection-180.sasviyaapiclient","SAS 9 API Client":"classes/reflection-717.reflection-180.sas9apiclient"}],"source":[{"path":"https://github.com/sasjs/adapter/blob/master/src/","line":"L"}],"disableAutoModuleName":"false"}-->
|
||||||
|
</div>
|
||||||
|
<div class="col-2 col-menu secondary-menu">
|
||||||
|
<nav class="tsd-navigation secondary menu-sticky">
|
||||||
|
<ul class="before-current">
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<footer class="with-border-bottom">
|
||||||
|
</footer>
|
||||||
|
<div class="container tsd-generator">
|
||||||
|
<p>Generated using <a href="http://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||||
|
</div>
|
||||||
|
<div class="overlay"></div>
|
||||||
|
<script src="../assets/js/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
128
docs/modules/reflection-724.reflection-187.html
Normal file
128
docs/modules/reflection-724.reflection-187.html
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html class="default no-js">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<title> | @sasjs/adapter</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="../assets/css/main.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div class="tsd-page-toolbar">
|
||||||
|
<div class="container">
|
||||||
|
<div class="table-wrap">
|
||||||
|
<div class="table-cell" id="tsd-search" data-index="../assets/js/search.json" data-base="..">
|
||||||
|
<div class="field">
|
||||||
|
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label>
|
||||||
|
<input id="tsd-search-field" type="text" />
|
||||||
|
</div>
|
||||||
|
<ul class="results">
|
||||||
|
<li class="state loading">Preparing search index...</li>
|
||||||
|
<li class="state failure">The search index is not available</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="results-priority" style="display:none">
|
||||||
|
</ul>
|
||||||
|
<a href="../index.html" class="title">@sasjs/adapter</a>
|
||||||
|
 <a href="https://github.com/sasjs/adapter" class="title">SASjs on Github</a>
|
||||||
|
 <a href="https://sasjs.io" class="title">SASjs.io</a>
|
||||||
|
 <a href="https://github.com/sasjs/cli" class="title">SASjs CLI</a>
|
||||||
|
 <a href="https://github.com/sasjs/react-seed-app" class="title">React Seed App</a>
|
||||||
|
</div>
|
||||||
|
<div class="table-cell" id="tsd-widgets">
|
||||||
|
<div id="tsd-filter">
|
||||||
|
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||||
|
<div class="tsd-filter-group">
|
||||||
|
<div class="tsd-select" id="tsd-filter-visibility">
|
||||||
|
<span class="tsd-select-label">All</span>
|
||||||
|
<ul class="tsd-select-list">
|
||||||
|
<li data-value="public">Public</li>
|
||||||
|
<li data-value="protected">Public/Protected</li>
|
||||||
|
<li data-value="private" class="selected">All</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" id="tsd-filter-inherited" checked />
|
||||||
|
<label class="tsd-widget" for="tsd-filter-inherited">Inherited</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tsd-page-title">
|
||||||
|
<div class="container">
|
||||||
|
<ul class="tsd-breadcrumb">
|
||||||
|
<li>
|
||||||
|
<a href="reflection-724.html"></a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="reflection-724.reflection-187.html"></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="container container-main">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-3 col-menu menu-sticky-wrap menu-highlight">
|
||||||
|
<nav class="tsd-navigation outline primary">
|
||||||
|
<a style="margin-left:0em" href="../globals.html">Globals</a>
|
||||||
|
<ul style="display:none">
|
||||||
|
{"SAS Adapter":{"SASjs":"classes/reflection-717.reflection-180.sasjs","Types":"modules/types"},"SAS Viya API Client":"classes/reflection-717.reflection-180.sasviyaapiclient","SAS 9 API Client":"classes/reflection-717.reflection-180.sas9apiclient"}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
<div class="col-7 offset-3 col-content">
|
||||||
|
<h1>Module</h1>
|
||||||
|
<section class="tsd-panel-group tsd-index-group">
|
||||||
|
<section class="tsd-panel tsd-index-panel">
|
||||||
|
<div class="tsd-index-content">
|
||||||
|
<section class="tsd-index-section ">
|
||||||
|
<h3>Classes</h3>
|
||||||
|
<ul class="tsd-index-list">
|
||||||
|
<li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/reflection-724.reflection-187.fileuploader.html" class="tsd-kind-icon">FileUploader</a></li>
|
||||||
|
<li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/reflection-724.reflection-187.sas9apiclient.html" class="tsd-kind-icon">SAS9ApiClient</a></li>
|
||||||
|
<li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/reflection-724.reflection-187.sasviyaapiclient.html" class="tsd-kind-icon">SASViyaApiClient</a></li>
|
||||||
|
<li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/reflection-724.reflection-187.sasjs.html" class="tsd-kind-icon">SASjs</a></li>
|
||||||
|
<li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/reflection-724.reflection-187.sessionmanager.html" class="tsd-kind-icon">SessionManager</a></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<!--{"options":"/Users/allan/git/adapter","tsconfig":"/Users/allan/git/adapter","inputFiles":["/Users/allan/git/adapter/src/FileUploader.ts","/Users/allan/git/adapter/src/SAS9ApiClient.ts","/Users/allan/git/adapter/src/SASViyaApiClient.ts","/Users/allan/git/adapter/src/SASjs.ts","/Users/allan/git/adapter/src/SessionManager.ts","/Users/allan/git/adapter/src/index.ts","/Users/allan/git/adapter/src/types/Context.ts","/Users/allan/git/adapter/src/types/CsrfToken.ts","/Users/allan/git/adapter/src/types/ErrorResponse.ts","/Users/allan/git/adapter/src/types/Folder.ts","/Users/allan/git/adapter/src/types/Job.ts","/Users/allan/git/adapter/src/types/JobDefinition.ts","/Users/allan/git/adapter/src/types/JobResult.ts","/Users/allan/git/adapter/src/types/Link.ts","/Users/allan/git/adapter/src/types/SASjsConfig.ts","/Users/allan/git/adapter/src/types/SASjsRequest.ts","/Users/allan/git/adapter/src/types/SASjsWaitingRequest.ts","/Users/allan/git/adapter/src/types/ServerType.ts","/Users/allan/git/adapter/src/types/Session.ts","/Users/allan/git/adapter/src/types/UploadFile.ts","/Users/allan/git/adapter/src/types/index.ts","/Users/allan/git/adapter/src/utils/asyncForEach.ts","/Users/allan/git/adapter/src/utils/compareTimestamps.ts","/Users/allan/git/adapter/src/utils/convertToCsv.ts","/Users/allan/git/adapter/src/utils/formatDataForRequest.ts","/Users/allan/git/adapter/src/utils/index.ts","/Users/allan/git/adapter/src/utils/isAuthorizeFormRequired.ts","/Users/allan/git/adapter/src/utils/isIeOrEdge.ts","/Users/allan/git/adapter/src/utils/isLoginRequired.ts","/Users/allan/git/adapter/src/utils/isLoginSuccess.ts","/Users/allan/git/adapter/src/utils/isUri.ts","/Users/allan/git/adapter/src/utils/isUrl.ts","/Users/allan/git/adapter/src/utils/makeRequest.ts","/Users/allan/git/adapter/src/utils/needsRetry.ts","/Users/allan/git/adapter/src/utils/parseAndSubmitAuthorizeForm.ts","/Users/allan/git/adapter/src/utils/parseGeneratedCode.ts","/Users/allan/git/adapter/src/utils/parseSasViyaLog.ts","/Users/allan/git/adapter/src/utils/parseSourceCode.ts","/Users/allan/git/adapter/src/utils/parseWeboutResponse.ts","/Users/allan/git/adapter/src/utils/serialize.ts","/Users/allan/git/adapter/src/utils/splitChunks.ts"],"mode":1,"includeDeclarations":true,"entryPoint":"","exclude":["**/*+(index|.spec|.e2e).ts"],"externalPattern":[],"excludeExternals":true,"excludeNotExported":true,"excludeNotDocumented":false,"excludePrivate":true,"excludeProtected":false,"ignoreCompilerErrors":true,"disableSources":false,"includes":"","media":"","out":"docs","json":"","theme":"./node_modules/typedoc-neo-theme/bin/default","name":"","includeVersion":false,"excludeTags":[],"readme":"","defaultCategory":"Other","categoryOrder":[],"categorizeByGroup":true,"gitRevision":"","gitRemote":"origin","gaID":"","gaSite":"auto","hideGenerator":false,"toc":[],"disableOutputCheck":true,"help":false,"version":false,"plugin":[],"logger":"console","listInvalidSymbolLinks":false,"links":[{"label":"SASjs on Github","url":"https://github.com/sasjs/adapter"},{"label":"SASjs.io","url":"https://sasjs.io"},{"label":"SASjs CLI","url":"https://github.com/sasjs/cli"},{"label":"React Seed App","url":"https://github.com/sasjs/react-seed-app"}],"outline":[{"SAS Adapter":{"SASjs":"classes/reflection-717.reflection-180.sasjs","Types":"modules/types"},"SAS Viya API Client":"classes/reflection-717.reflection-180.sasviyaapiclient","SAS 9 API Client":"classes/reflection-717.reflection-180.sas9apiclient"}],"source":[{"path":"https://github.com/sasjs/adapter/blob/master/src/","line":"L"}],"disableAutoModuleName":"false"}-->
|
||||||
|
</div>
|
||||||
|
<div class="col-2 col-menu secondary-menu">
|
||||||
|
<nav class="tsd-navigation secondary menu-sticky">
|
||||||
|
<ul class="before-current">
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="../classes/reflection-724.reflection-187.fileuploader.html" class="tsd-kind-icon">File<wbr>Uploader</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="../classes/reflection-724.reflection-187.sas9apiclient.html" class="tsd-kind-icon">SAS9<wbr>Api<wbr>Client</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="../classes/reflection-724.reflection-187.sasviyaapiclient.html" class="tsd-kind-icon">SASViya<wbr>Api<wbr>Client</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="../classes/reflection-724.reflection-187.sasjs.html" class="tsd-kind-icon">SASjs</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class tsd-parent-kind-module root">
|
||||||
|
<a href="../classes/reflection-724.reflection-187.sessionmanager.html" class="tsd-kind-icon">Session<wbr>Manager</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<footer class="with-border-bottom">
|
||||||
|
</footer>
|
||||||
|
<div class="container tsd-generator">
|
||||||
|
<p>Generated using <a href="http://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||||
|
</div>
|
||||||
|
<div class="overlay"></div>
|
||||||
|
<script src="../assets/js/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
106
docs/modules/reflection-725.html
Normal file
106
docs/modules/reflection-725.html
Normal file
File diff suppressed because one or more lines are too long
128
docs/modules/reflection-725.reflection-191.html
Normal file
128
docs/modules/reflection-725.reflection-191.html
Normal file
File diff suppressed because one or more lines are too long
128
docs/modules/reflection-725.reflection-194.html
Normal file
128
docs/modules/reflection-725.reflection-194.html
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2221
package-lock.json
generated
2221
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
10
package.json
10
package.json
@@ -37,22 +37,22 @@
|
|||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/isomorphic-fetch": "0.0.35",
|
"@types/isomorphic-fetch": "0.0.35",
|
||||||
"@types/jest": "^26.0.13",
|
"@types/jest": "^26.0.14",
|
||||||
"cp": "^0.2.0",
|
"cp": "^0.2.0",
|
||||||
"jest": "^25.5.4",
|
"jest": "^25.5.4",
|
||||||
"path": "^0.12.7",
|
"path": "^0.12.7",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"semantic-release": "^17.1.1",
|
"semantic-release": "^17.1.2",
|
||||||
|
"terser-webpack-plugin": "^4.2.2",
|
||||||
"ts-jest": "^25.5.1",
|
"ts-jest": "^25.5.1",
|
||||||
"ts-loader": "^8.0.3",
|
"ts-loader": "^8.0.4",
|
||||||
"tslint": "^6.1.3",
|
"tslint": "^6.1.3",
|
||||||
"tslint-config-prettier": "^1.18.0",
|
"tslint-config-prettier": "^1.18.0",
|
||||||
"typedoc": "^0.17.8",
|
"typedoc": "^0.17.8",
|
||||||
"typedoc-neo-theme": "^1.0.10",
|
"typedoc-neo-theme": "^1.0.10",
|
||||||
"typedoc-plugin-external-module-name": "^4.0.3",
|
"typedoc-plugin-external-module-name": "^4.0.3",
|
||||||
"typescript": "^3.9.7",
|
"typescript": "^3.9.7",
|
||||||
"uglifyjs-webpack-plugin": "^2.2.0",
|
"webpack": "^4.44.2",
|
||||||
"webpack": "^4.44.1",
|
|
||||||
"webpack-cli": "^3.3.12"
|
"webpack-cli": "^3.3.12"
|
||||||
},
|
},
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ const defaultConfig: SASjsConfig = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const customConfig = {
|
const customConfig = {
|
||||||
serverUrl: "url",
|
serverUrl: "http://url.com",
|
||||||
pathSAS9: "sas9",
|
pathSAS9: "sas9",
|
||||||
pathSASViya: "viya",
|
pathSASViya: "viya",
|
||||||
appLoc: "/Public/seedapp",
|
appLoc: "/Public/seedapp",
|
||||||
|
|||||||
@@ -47,6 +47,16 @@ const getLargeObjectData = () => {
|
|||||||
export const sendArrTests = (adapter: SASjs): TestSuite => ({
|
export const sendArrTests = (adapter: SASjs): TestSuite => ({
|
||||||
name: "sendArr",
|
name: "sendArr",
|
||||||
tests: [
|
tests: [
|
||||||
|
{
|
||||||
|
title: "Absolute paths",
|
||||||
|
description: "Should work with absolute paths to SAS jobs",
|
||||||
|
test: () => {
|
||||||
|
return adapter.request("/Public/app/common/sendArr", stringData);
|
||||||
|
},
|
||||||
|
assertion: (res: any) => {
|
||||||
|
return res.table1[0][0] === stringData.table1[0].col1;
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "Single string value",
|
title: "Single string value",
|
||||||
description: "Should send an array with a single string value",
|
description: "Should send an array with a single string value",
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ export class FileUploader {
|
|||||||
private retryCount = 0
|
private retryCount = 0
|
||||||
|
|
||||||
public uploadFile(sasJob: string, files: UploadFile[], params: any) {
|
public uploadFile(sasJob: string, files: UploadFile[], params: any) {
|
||||||
if (files?.length < 1) throw new Error('Atleast one file must be provided')
|
if (files?.length < 1)
|
||||||
|
throw new Error('At least one file must be provided.')
|
||||||
|
|
||||||
let paramsString = ''
|
let paramsString = ''
|
||||||
|
|
||||||
@@ -75,7 +76,7 @@ export class FileUploader {
|
|||||||
})
|
})
|
||||||
.then((responseText) => {
|
.then((responseText) => {
|
||||||
if (isLogInRequired(responseText))
|
if (isLogInRequired(responseText))
|
||||||
reject('You must be logged in to upload a fle')
|
reject('You must be logged in to upload a file')
|
||||||
|
|
||||||
if (needsRetry(responseText)) {
|
if (needsRetry(responseText)) {
|
||||||
if (this.retryCount < requestRetryLimit) {
|
if (this.retryCount < requestRetryLimit) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { isUrl } from './utils'
|
import { isUrl } from './utils'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A client for interfacing with the SAS9 REST API
|
* A client for interfacing with the SAS9 REST API.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
export class SAS9ApiClient {
|
export class SAS9ApiClient {
|
||||||
@@ -10,7 +10,7 @@ export class SAS9ApiClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns on object containing the server URL
|
* Returns an object containing server URL.
|
||||||
*/
|
*/
|
||||||
public getConfig() {
|
public getConfig() {
|
||||||
return {
|
return {
|
||||||
@@ -19,8 +19,8 @@ export class SAS9ApiClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates serverurl which is not null
|
* Updates server URL which is not null.
|
||||||
* @param serverUrl - the URL of the server.
|
* @param serverUrl - URL of the server to be set.
|
||||||
*/
|
*/
|
||||||
public setConfig(serverUrl: string) {
|
public setConfig(serverUrl: string) {
|
||||||
if (serverUrl) this.serverUrl = serverUrl
|
if (serverUrl) this.serverUrl = serverUrl
|
||||||
@@ -28,9 +28,9 @@ export class SAS9ApiClient {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes code on a SAS9 server.
|
* Executes code on a SAS9 server.
|
||||||
* @param linesOfCode - an array of lines of code to execute
|
* @param linesOfCode - an array of code lines to execute.
|
||||||
* @param serverName - the server to execute the code on
|
* @param serverName - the server to execute the code on.
|
||||||
* @param repositoryName - the repository to execute the code on
|
* @param repositoryName - the repository to execute the code in.
|
||||||
*/
|
*/
|
||||||
public async executeScript(
|
public async executeScript(
|
||||||
linesOfCode: string[],
|
linesOfCode: string[],
|
||||||
|
|||||||
@@ -3,25 +3,26 @@ import {
|
|||||||
parseAndSubmitAuthorizeForm,
|
parseAndSubmitAuthorizeForm,
|
||||||
convertToCSV,
|
convertToCSV,
|
||||||
makeRequest,
|
makeRequest,
|
||||||
|
isRelativePath,
|
||||||
isUri,
|
isUri,
|
||||||
isUrl
|
isUrl
|
||||||
} from './utils'
|
} from './utils'
|
||||||
import * as NodeFormData from 'form-data'
|
import * as NodeFormData from 'form-data'
|
||||||
import * as path from 'path'
|
|
||||||
import {
|
import {
|
||||||
Job,
|
Job,
|
||||||
Session,
|
Session,
|
||||||
Context,
|
Context,
|
||||||
Folder,
|
Folder,
|
||||||
CsrfToken,
|
CsrfToken,
|
||||||
EditContextInput
|
EditContextInput,
|
||||||
|
ErrorResponse,
|
||||||
|
JobDefinition
|
||||||
} from './types'
|
} from './types'
|
||||||
import { JobDefinition } from './types/JobDefinition'
|
|
||||||
import { formatDataForRequest } from './utils/formatDataForRequest'
|
import { formatDataForRequest } from './utils/formatDataForRequest'
|
||||||
import { SessionManager } from './SessionManager'
|
import { SessionManager } from './SessionManager'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A client for interfacing with the SAS Viya REST API
|
* A client for interfacing with the SAS Viya REST API.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
export class SASViyaApiClient {
|
export class SASViyaApiClient {
|
||||||
@@ -29,39 +30,37 @@ 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 setCsrfToken: (csrfToken: CsrfToken) => void
|
||||||
private rootFolderMap = new Map<string, Job[]>()
|
|
||||||
) {
|
) {
|
||||||
if (!rootFolderName) {
|
|
||||||
throw new Error('Root folder must be provided.')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (serverUrl) isUrl(serverUrl)
|
if (serverUrl) isUrl(serverUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
private csrfToken: CsrfToken | null = null
|
private csrfToken: CsrfToken | null = null
|
||||||
private rootFolder: Folder | null = null
|
|
||||||
private sessionManager = new SessionManager(
|
private sessionManager = new SessionManager(
|
||||||
this.serverUrl,
|
this.serverUrl,
|
||||||
this.contextName,
|
this.contextName,
|
||||||
this.setCsrfToken
|
this.setCsrfToken
|
||||||
)
|
)
|
||||||
private isForceDeploy: boolean = false
|
private isForceDeploy: boolean = false
|
||||||
|
private folderMap = new Map<string, Job[]>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a map containing the directory structure in the currently set root folder.
|
* Returns a list of jobs in the currently set root folder.
|
||||||
*/
|
*/
|
||||||
public async getAppLocMap() {
|
public async getJobsInFolder(folderPath: string) {
|
||||||
if (this.rootFolderMap.size) {
|
const path = isRelativePath(folderPath)
|
||||||
return this.rootFolderMap
|
? `${this.rootFolderName}/${folderPath}`
|
||||||
|
: folderPath
|
||||||
|
if (this.folderMap.get(path)) {
|
||||||
|
return this.folderMap.get(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.populateRootFolderMap()
|
await this.populateFolderMap(path)
|
||||||
return this.rootFolderMap
|
return this.folderMap.get(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns an object containing the Server URL and root folder name
|
* Returns an object containing the server URL and root folder name.
|
||||||
*/
|
*/
|
||||||
public getConfig() {
|
public getConfig() {
|
||||||
return {
|
return {
|
||||||
@@ -71,9 +70,9 @@ export class SASViyaApiClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates server URL or root folder name when not null
|
* Updates server URL and root folder name, if it was not set.
|
||||||
* @param serverUrl - the URL of the server.
|
* @param serverUrl - the URL of the server.
|
||||||
* @param rootFolderName - the name for rootFolderName.
|
* @param rootFolderName - the name for root folder.
|
||||||
*/
|
*/
|
||||||
public setConfig(serverUrl: string, rootFolderName: string) {
|
public setConfig(serverUrl: string, rootFolderName: string) {
|
||||||
if (serverUrl) this.serverUrl = serverUrl
|
if (serverUrl) this.serverUrl = serverUrl
|
||||||
@@ -88,14 +87,18 @@ export class SASViyaApiClient {
|
|||||||
const headers: any = {
|
const headers: any = {
|
||||||
'Content-Type': 'application/json'
|
'Content-Type': 'application/json'
|
||||||
}
|
}
|
||||||
|
|
||||||
if (accessToken) {
|
if (accessToken) {
|
||||||
headers.Authorization = `Bearer ${accessToken}`
|
headers.Authorization = `Bearer ${accessToken}`
|
||||||
}
|
}
|
||||||
|
|
||||||
const { result: contexts } = await this.request<{ items: Context[] }>(
|
const { result: contexts } = await this.request<{ items: Context[] }>(
|
||||||
`${this.serverUrl}/compute/contexts`,
|
`${this.serverUrl}/compute/contexts?limit=10000`,
|
||||||
{ headers }
|
{ headers }
|
||||||
)
|
)
|
||||||
|
|
||||||
const contextsList = contexts && contexts.items ? contexts.items : []
|
const contextsList = contexts && contexts.items ? contexts.items : []
|
||||||
|
|
||||||
return contextsList.map((context: any) => ({
|
return contextsList.map((context: any) => ({
|
||||||
createdBy: context.createdBy,
|
createdBy: context.createdBy,
|
||||||
id: context.id,
|
id: context.id,
|
||||||
@@ -113,36 +116,48 @@ export class SASViyaApiClient {
|
|||||||
const headers: any = {
|
const headers: any = {
|
||||||
'Content-Type': 'application/json'
|
'Content-Type': 'application/json'
|
||||||
}
|
}
|
||||||
|
|
||||||
if (accessToken) {
|
if (accessToken) {
|
||||||
headers.Authorization = `Bearer ${accessToken}`
|
headers.Authorization = `Bearer ${accessToken}`
|
||||||
}
|
}
|
||||||
|
|
||||||
const { result: contexts } = await this.request<{ items: Context[] }>(
|
const { result: contexts } = await this.request<{ items: Context[] }>(
|
||||||
`${this.serverUrl}/compute/contexts`,
|
`${this.serverUrl}/compute/contexts?limit=10000`,
|
||||||
{ headers }
|
{ headers }
|
||||||
)
|
).catch((err) => {
|
||||||
const contextsList = contexts && contexts.items ? contexts.items : []
|
throw err
|
||||||
|
})
|
||||||
|
|
||||||
|
const contextsList = contexts.items || []
|
||||||
const executableContexts: any[] = []
|
const executableContexts: any[] = []
|
||||||
|
|
||||||
const promises = contextsList.map((context: any) => {
|
const promises = contextsList.map((context: any) => {
|
||||||
const linesOfCode = ['%put &=sysuserid;']
|
const linesOfCode = ['%put &=sysuserid;']
|
||||||
|
|
||||||
return this.executeScript(
|
return this.executeScript(
|
||||||
`test-${context.name}`,
|
`test-${context.name}`,
|
||||||
linesOfCode,
|
linesOfCode,
|
||||||
context.name,
|
context.name,
|
||||||
accessToken
|
accessToken,
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
true
|
||||||
).catch(() => null)
|
).catch(() => null)
|
||||||
})
|
})
|
||||||
|
|
||||||
const results = await Promise.all(promises)
|
const results = await Promise.all(promises)
|
||||||
|
|
||||||
results.forEach((result: any, index: number) => {
|
results.forEach((result: any, index: number) => {
|
||||||
if (result && result.jobStatus === 'completed') {
|
if (result) {
|
||||||
let sysUserId = ''
|
let sysUserId = ''
|
||||||
if (result && result.log && result.log.items) {
|
|
||||||
const sysUserIdLog = result.log.items.find((i: any) =>
|
if (result.log) {
|
||||||
i.line.startsWith('SYSUSERID=')
|
const sysUserIdLog = result.log
|
||||||
)
|
.split('\n')
|
||||||
|
.find((line: string) => line.startsWith('SYSUSERID='))
|
||||||
|
|
||||||
if (sysUserIdLog) {
|
if (sysUserIdLog) {
|
||||||
sysUserId = sysUserIdLog.line.replace('SYSUSERID=', '')
|
sysUserId = sysUserIdLog.replace('SYSUSERID=', '')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,7 +191,7 @@ export class SASViyaApiClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const { result: contexts } = await this.request<{ items: Context[] }>(
|
const { result: contexts } = await this.request<{ items: Context[] }>(
|
||||||
`${this.serverUrl}/compute/contexts`,
|
`${this.serverUrl}/compute/contexts?limit=10000`,
|
||||||
{ headers }
|
{ headers }
|
||||||
)
|
)
|
||||||
const executionContext =
|
const executionContext =
|
||||||
@@ -206,7 +221,7 @@ export class SASViyaApiClient {
|
|||||||
* Creates a compute context on the given server.
|
* Creates a compute context on the given server.
|
||||||
* @param contextName - the name of the context to be created.
|
* @param contextName - the name of the context to be created.
|
||||||
* @param launchContextName - the name of the launcher context used by the compute service.
|
* @param launchContextName - the name of the launcher context used by the compute service.
|
||||||
* @param sharedAccountId - the ID of the account to run the servers for this context as.
|
* @param sharedAccountId - the ID of the account to run the servers for this context.
|
||||||
* @param autoExecLines - the lines of code to execute during session initialization.
|
* @param autoExecLines - the lines of code to execute during session initialization.
|
||||||
* @param authorizedUsers - an optional list of authorized user IDs.
|
* @param authorizedUsers - an optional list of authorized user IDs.
|
||||||
* @param accessToken - an access token for an authorized user.
|
* @param accessToken - an access token for an authorized user.
|
||||||
@@ -220,15 +235,15 @@ export class SASViyaApiClient {
|
|||||||
accessToken?: string
|
accessToken?: string
|
||||||
) {
|
) {
|
||||||
if (!contextName) {
|
if (!contextName) {
|
||||||
throw new Error('Missing context name.')
|
throw new Error('Context name is required.')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!launchContextName) {
|
if (!launchContextName) {
|
||||||
throw new Error('Missing launch context name.')
|
throw new Error('Launch context name is required.')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sharedAccountId) {
|
if (!sharedAccountId) {
|
||||||
throw new Error('Missing shared account ID.')
|
throw new Error('Shared account ID is required.')
|
||||||
}
|
}
|
||||||
|
|
||||||
const headers: any = {
|
const headers: any = {
|
||||||
@@ -307,17 +322,14 @@ export class SASViyaApiClient {
|
|||||||
{
|
{
|
||||||
headers
|
headers
|
||||||
}
|
}
|
||||||
).catch((e) => {
|
).catch((err) => {
|
||||||
console.error(e)
|
if (err && err.status === 404) {
|
||||||
|
|
||||||
if (e && e.status === 404) {
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`The context ${contextName} was not found on this server.`
|
`The context '${contextName}' was not found on this server.`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
throw new Error(
|
|
||||||
`An error occurred when fetching the context ${contextName}`
|
throw err
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
// An If-Match header with the value of the last ETag for the context
|
// An If-Match header with the value of the last ETag for the context
|
||||||
@@ -348,7 +360,7 @@ export class SASViyaApiClient {
|
|||||||
*/
|
*/
|
||||||
public async deleteContext(contextName: string, accessToken?: string) {
|
public async deleteContext(contextName: string, accessToken?: string) {
|
||||||
if (!contextName) {
|
if (!contextName) {
|
||||||
throw new Error('Invalid context Name.')
|
throw new Error('Invalid context name.')
|
||||||
}
|
}
|
||||||
|
|
||||||
const headers: any = {
|
const headers: any = {
|
||||||
@@ -374,21 +386,25 @@ export class SASViyaApiClient {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes code on the current SAS Viya server.
|
* Executes code on the current SAS Viya server.
|
||||||
* @param fileName - a name for the file being submitted for execution.
|
* @param jobPath - the path to the file being submitted for execution.
|
||||||
* @param linesOfCode - an array of lines of code to execute.
|
* @param linesOfCode - an array of code lines to execute.
|
||||||
* @param contextName - the context to execute the code in.
|
* @param contextName - the context to execute the code in.
|
||||||
* @param accessToken - an access token for an authorized user.
|
* @param accessToken - an access token for an authorized user.
|
||||||
* @param sessionId - optional session ID to reuse.
|
* @param sessionId - optional session ID to reuse.
|
||||||
* @param silent - optional flag to turn of logging.
|
* @param silent - optional flag to disable logging.
|
||||||
|
* @param data - execution data.
|
||||||
|
* @param debug - when set to true, the log will be returned.
|
||||||
|
* @param expectWebout - when set to true, the automatic _webout fileref will be checked for content, and that content returned. This fileref is used when the Job contains a SASjs web request (as opposed to executing arbitrary SAS code).
|
||||||
*/
|
*/
|
||||||
public async executeScript(
|
public async executeScript(
|
||||||
jobName: string,
|
jobPath: string,
|
||||||
linesOfCode: string[],
|
linesOfCode: string[],
|
||||||
contextName: string,
|
contextName: string,
|
||||||
accessToken?: string,
|
accessToken?: string,
|
||||||
silent = false,
|
silent = false,
|
||||||
data = null,
|
data = null,
|
||||||
debug = false
|
debug = false,
|
||||||
|
expectWebout = false
|
||||||
): Promise<any> {
|
): Promise<any> {
|
||||||
silent = !debug
|
silent = !debug
|
||||||
try {
|
try {
|
||||||
@@ -419,13 +435,21 @@ export class SASViyaApiClient {
|
|||||||
jobArguments['_DEBUG'] = 131
|
jobArguments['_DEBUG'] = 131
|
||||||
}
|
}
|
||||||
|
|
||||||
const fileName = `exec-${
|
let fileName
|
||||||
jobName.includes('/') ? jobName.split('/')[1] : jobName
|
if (isRelativePath(jobPath)) {
|
||||||
}`
|
fileName = `exec-${
|
||||||
|
jobPath.includes('/') ? jobPath.split('/')[1] : jobPath
|
||||||
|
}`
|
||||||
|
} else {
|
||||||
|
const jobPathParts = jobPath.split('/')
|
||||||
|
fileName = jobPathParts.pop()
|
||||||
|
}
|
||||||
|
|
||||||
let jobVariables: any = {
|
let jobVariables: any = {
|
||||||
SYS_JES_JOB_URI: '',
|
SYS_JES_JOB_URI: '',
|
||||||
_program: this.rootFolderName + '/' + jobName
|
_program: isRelativePath(jobPath)
|
||||||
|
? this.rootFolderName + '/' + jobPath
|
||||||
|
: jobPath
|
||||||
}
|
}
|
||||||
|
|
||||||
let files: any[] = []
|
let files: any[] = []
|
||||||
@@ -433,7 +457,9 @@ export class SASViyaApiClient {
|
|||||||
if (data) {
|
if (data) {
|
||||||
if (JSON.stringify(data).includes(';')) {
|
if (JSON.stringify(data).includes(';')) {
|
||||||
files = await this.uploadTables(data, accessToken)
|
files = await this.uploadTables(data, accessToken)
|
||||||
|
|
||||||
jobVariables['_webin_file_count'] = files.length
|
jobVariables['_webin_file_count'] = files.length
|
||||||
|
|
||||||
files.forEach((fileInfo, index) => {
|
files.forEach((fileInfo, index) => {
|
||||||
jobVariables[
|
jobVariables[
|
||||||
`_webin_fileuri${index + 1}`
|
`_webin_fileuri${index + 1}`
|
||||||
@@ -464,11 +490,11 @@ export class SASViyaApiClient {
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
console.log(`Job has been submitted for ${fileName}`)
|
console.log(`Job has been submitted for '${fileName}'.`)
|
||||||
console.log(
|
console.log(
|
||||||
`You can monitor the job progress at ${this.serverUrl}${
|
`You can monitor the job progress at '${this.serverUrl}${
|
||||||
postedJob.links.find((l: any) => l.rel === 'state')!.href
|
postedJob.links.find((l: any) => l.rel === 'state')!.href
|
||||||
}`
|
}'.`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -503,16 +529,42 @@ export class SASViyaApiClient {
|
|||||||
if (jobStatus === 'failed' || jobStatus === 'error') {
|
if (jobStatus === 'failed' || jobStatus === 'error') {
|
||||||
return Promise.reject({ error: currentJob.error, log })
|
return Promise.reject({ error: currentJob.error, log })
|
||||||
}
|
}
|
||||||
const resultLink = `/compute/sessions/${executionSessionId}/filerefs/_webout/content`
|
|
||||||
|
let resultLink
|
||||||
|
|
||||||
|
if (expectWebout) {
|
||||||
|
resultLink = `/compute/sessions/${executionSessionId}/filerefs/_webout/content`
|
||||||
|
}
|
||||||
|
|
||||||
if (resultLink) {
|
if (resultLink) {
|
||||||
jobResult = await this.request<any>(
|
jobResult = await this.request<any>(
|
||||||
`${this.serverUrl}${resultLink}`,
|
`${this.serverUrl}${resultLink}`,
|
||||||
{ headers },
|
{ headers },
|
||||||
'text'
|
'text'
|
||||||
).catch((e) => ({
|
).catch(async (e) => {
|
||||||
result: JSON.stringify(e)
|
if (e && e.status === 404) {
|
||||||
}))
|
if (logLink) {
|
||||||
|
log = await this.request<any>(
|
||||||
|
`${this.serverUrl}${logLink.href}/content?limit=10000`,
|
||||||
|
{
|
||||||
|
headers
|
||||||
|
}
|
||||||
|
).then((res: any) =>
|
||||||
|
res.result.items.map((i: any) => i.line).join('\n')
|
||||||
|
)
|
||||||
|
|
||||||
|
return Promise.reject(
|
||||||
|
new ErrorResponse('Job execution failed', {
|
||||||
|
status: 500,
|
||||||
|
body: log
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
result: JSON.stringify(e)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.sessionManager.clearSession(executionSessionId, accessToken)
|
await this.sessionManager.clearSession(executionSessionId, accessToken)
|
||||||
@@ -521,7 +573,7 @@ export class SASViyaApiClient {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e && e.status === 404) {
|
if (e && e.status === 404) {
|
||||||
return this.executeScript(
|
return this.executeScript(
|
||||||
jobName,
|
jobPath,
|
||||||
linesOfCode,
|
linesOfCode,
|
||||||
contextName,
|
contextName,
|
||||||
accessToken,
|
accessToken,
|
||||||
@@ -536,13 +588,12 @@ export class SASViyaApiClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a folder in the specified location. Either parentFolderPath or
|
* Creates a folder. Path to or URI of the parent folder is required.
|
||||||
* parentFolderUri must be provided.
|
|
||||||
* @param folderName - the name of the new folder.
|
* @param folderName - the name of the new folder.
|
||||||
* @param parentFolderPath - the full path to the parent folder. If not
|
* @param parentFolderPath - the full path to the parent folder. If not
|
||||||
* provided, the parentFolderUri must be provided.
|
* provided, the parentFolderUri must be provided.
|
||||||
* @param parentFolderUri - the URI (eg /folders/folders/UUID) of the parent
|
* @param parentFolderUri - the URI (eg /folders/folders/UUID) of the parent
|
||||||
* folder. If not provided, the parentFolderPath must be provided.
|
* folder. If not provided, the parentFolderPath must be provided.
|
||||||
* @param accessToken - an access token for authorizing the request.
|
* @param accessToken - an access token for authorizing the request.
|
||||||
* @param isForced - flag that indicates if target folder already exists, it and all subfolders have to be deleted.
|
* @param isForced - flag that indicates if target folder already exists, it and all subfolders have to be deleted.
|
||||||
*/
|
*/
|
||||||
@@ -554,7 +605,7 @@ export class SASViyaApiClient {
|
|||||||
isForced?: boolean
|
isForced?: boolean
|
||||||
): Promise<Folder> {
|
): Promise<Folder> {
|
||||||
if (!parentFolderPath && !parentFolderUri) {
|
if (!parentFolderPath && !parentFolderUri) {
|
||||||
throw new Error('Parent folder path or uri is required')
|
throw new Error('Path or URI of the parent folder is required.')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!parentFolderUri && parentFolderPath) {
|
if (!parentFolderUri && parentFolderPath) {
|
||||||
@@ -562,7 +613,9 @@ export class SASViyaApiClient {
|
|||||||
if (!parentFolderUri) {
|
if (!parentFolderUri) {
|
||||||
if (isForced) this.isForceDeploy = true
|
if (isForced) this.isForceDeploy = true
|
||||||
|
|
||||||
console.log(`Parent folder is not present: ${parentFolderPath}`)
|
console.log(
|
||||||
|
`Parent folder at path '${parentFolderPath}' is not present.`
|
||||||
|
)
|
||||||
|
|
||||||
const newParentFolderPath = parentFolderPath.substring(
|
const newParentFolderPath = parentFolderPath.substring(
|
||||||
0,
|
0,
|
||||||
@@ -570,10 +623,10 @@ export class SASViyaApiClient {
|
|||||||
)
|
)
|
||||||
const newFolderName = `${parentFolderPath.split('/').pop()}`
|
const newFolderName = `${parentFolderPath.split('/').pop()}`
|
||||||
if (newParentFolderPath === '') {
|
if (newParentFolderPath === '') {
|
||||||
throw new Error('Root Folder should have been present on server')
|
throw new Error('Root folder has to be present on the server.')
|
||||||
}
|
}
|
||||||
console.log(
|
console.log(
|
||||||
`Creating Parent Folder:\n${newFolderName} in ${newParentFolderPath}`
|
`Creating parent folder:\n'${newFolderName}' in '${newParentFolderPath}'`
|
||||||
)
|
)
|
||||||
const parentFolder = await this.createFolder(
|
const parentFolder = await this.createFolder(
|
||||||
newFolderName,
|
newFolderName,
|
||||||
@@ -581,7 +634,9 @@ export class SASViyaApiClient {
|
|||||||
undefined,
|
undefined,
|
||||||
accessToken
|
accessToken
|
||||||
)
|
)
|
||||||
console.log(`Parent Folder "${newFolderName}" successfully created.`)
|
console.log(
|
||||||
|
`Parent folder '${newFolderName}' has been successfully created.`
|
||||||
|
)
|
||||||
parentFolderUri = `/folders/folders/${parentFolder.id}`
|
parentFolderUri = `/folders/folders/${parentFolder.id}`
|
||||||
} else if (isForced && accessToken && !this.isForceDeploy) {
|
} else if (isForced && accessToken && !this.isForceDeploy) {
|
||||||
this.isForceDeploy = true
|
this.isForceDeploy = true
|
||||||
@@ -595,11 +650,11 @@ export class SASViyaApiClient {
|
|||||||
const newFolderName = `${parentFolderPath.split('/').pop()}`
|
const newFolderName = `${parentFolderPath.split('/').pop()}`
|
||||||
|
|
||||||
if (newParentFolderPath === '') {
|
if (newParentFolderPath === '') {
|
||||||
throw new Error('Root Folder should have been present on server')
|
throw new Error(`Root folder has to be present on the server.`)
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
`Creating Parent Folder:\n${newFolderName} in ${newParentFolderPath}`
|
`Creating parent folder:\n'${newFolderName}' in '${newParentFolderPath}'`
|
||||||
)
|
)
|
||||||
|
|
||||||
const parentFolder = await this.createFolder(
|
const parentFolder = await this.createFolder(
|
||||||
@@ -609,7 +664,9 @@ export class SASViyaApiClient {
|
|||||||
accessToken
|
accessToken
|
||||||
)
|
)
|
||||||
|
|
||||||
console.log(`Parent Folder "${newFolderName}" successfully created.`)
|
console.log(
|
||||||
|
`Parent folder '${newFolderName}' has been successfully created.`
|
||||||
|
)
|
||||||
|
|
||||||
parentFolderUri = `/folders/folders/${parentFolder.id}`
|
parentFolderUri = `/folders/folders/${parentFolder.id}`
|
||||||
}
|
}
|
||||||
@@ -633,8 +690,11 @@ export class SASViyaApiClient {
|
|||||||
createFolderRequest
|
createFolderRequest
|
||||||
)
|
)
|
||||||
|
|
||||||
// update rootFolderMap with newly created folder.
|
// update folder map with newly created folder.
|
||||||
await this.populateRootFolderMap(accessToken)
|
await this.populateFolderMap(
|
||||||
|
`${parentFolderPath}/${folderName}`,
|
||||||
|
accessToken
|
||||||
|
)
|
||||||
return createFolderResponse
|
return createFolderResponse
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -654,9 +714,7 @@ export class SASViyaApiClient {
|
|||||||
accessToken?: string
|
accessToken?: string
|
||||||
) {
|
) {
|
||||||
if (!parentFolderPath && !parentFolderUri) {
|
if (!parentFolderPath && !parentFolderUri) {
|
||||||
throw new Error(
|
throw new Error(`Path to or URI of the parent folder is required.`)
|
||||||
'Either parentFolderPath or parentFolderUri must be provided'
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!parentFolderUri && parentFolderPath) {
|
if (!parentFolderUri && parentFolderPath) {
|
||||||
@@ -697,7 +755,7 @@ export class SASViyaApiClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs a login redirect and returns an auth code for the given client
|
* Performs a login redirect and returns an auth code for the given client.
|
||||||
* @param clientId - the client ID to authenticate with.
|
* @param clientId - the client ID to authenticate with.
|
||||||
*/
|
*/
|
||||||
public async getAuthCode(clientId: string) {
|
public async getAuthCode(clientId: string) {
|
||||||
@@ -851,7 +909,7 @@ export class SASViyaApiClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes a job via the SAS Viya Compute API
|
* Executes a job via the SAS Viya Compute API.
|
||||||
* @param sasJob - the relative path to the job.
|
* @param sasJob - the relative path to the job.
|
||||||
* @param contextName - the name of the context where the job is to be executed.
|
* @param contextName - the name of the context where the job is to be executed.
|
||||||
* @param debug - sets the _debug flag in the job arguments.
|
* @param debug - sets the _debug flag in the job arguments.
|
||||||
@@ -865,35 +923,51 @@ export class SASViyaApiClient {
|
|||||||
data?: any,
|
data?: any,
|
||||||
accessToken?: string
|
accessToken?: string
|
||||||
) {
|
) {
|
||||||
if (!this.rootFolder) {
|
if (isRelativePath(sasJob) && !this.rootFolderName) {
|
||||||
await this.populateRootFolder(accessToken)
|
|
||||||
}
|
|
||||||
if (!this.rootFolder) {
|
|
||||||
console.error('Root folder was not found')
|
|
||||||
throw new Error('Root folder was not found')
|
|
||||||
}
|
|
||||||
if (!this.rootFolderMap.size) {
|
|
||||||
await this.populateRootFolderMap(accessToken)
|
|
||||||
}
|
|
||||||
if (!this.rootFolderMap.size) {
|
|
||||||
console.error(`The job ${sasJob} was not found in ${this.rootFolderName}`)
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`The job ${sasJob} was not found in ${this.rootFolderName}`
|
'Relative paths cannot be used without specifying a root folder name'
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isRelativePath(sasJob)) {
|
||||||
|
const folderName = sasJob.split('/')[0]
|
||||||
|
await this.populateFolderMap(`${this.rootFolderName}/${folderName}`)
|
||||||
|
|
||||||
|
if (!this.folderMap.get(`${this.rootFolderName}/${folderName}`)) {
|
||||||
|
throw new Error(
|
||||||
|
`The folder '${folderName}' was not found at '${this.serverUrl}/${this.rootFolderName}'`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const folderPathParts = sasJob.split('/')
|
||||||
|
folderPathParts.pop()
|
||||||
|
const folderPath = folderPathParts.join('/')
|
||||||
|
await this.populateFolderMap(folderPath, accessToken)
|
||||||
|
}
|
||||||
|
|
||||||
const headers: any = { 'Content-Type': 'application/json' }
|
const headers: any = { 'Content-Type': 'application/json' }
|
||||||
if (!!accessToken) {
|
if (!!accessToken) {
|
||||||
headers.Authorization = `Bearer ${accessToken}`
|
headers.Authorization = `Bearer ${accessToken}`
|
||||||
}
|
}
|
||||||
|
|
||||||
const folderName = sasJob.split('/')[0]
|
let jobToExecute
|
||||||
const jobName = sasJob.split('/')[1]
|
if (isRelativePath(sasJob)) {
|
||||||
const jobFolder = this.rootFolderMap.get(folderName)
|
const folderName = sasJob.split('/')[0]
|
||||||
const jobToExecute = jobFolder?.find((item) => item.name === jobName)
|
const jobName = sasJob.split('/')[1]
|
||||||
|
const jobFolder = this.folderMap.get(
|
||||||
|
`${this.rootFolderName}/${folderName}`
|
||||||
|
)
|
||||||
|
jobToExecute = jobFolder?.find((item) => item.name === jobName)
|
||||||
|
} else {
|
||||||
|
const folderPathParts = sasJob.split('/')
|
||||||
|
const jobName = folderPathParts.pop()
|
||||||
|
const folderPath = folderPathParts.join('/')
|
||||||
|
const jobFolder = this.folderMap.get(folderPath)
|
||||||
|
jobToExecute = jobFolder?.find((item) => item.name === jobName)
|
||||||
|
}
|
||||||
|
|
||||||
if (!jobToExecute) {
|
if (!jobToExecute) {
|
||||||
throw new Error('Job was not found.')
|
throw new Error(`Job was not found.`)
|
||||||
}
|
}
|
||||||
|
|
||||||
let code = jobToExecute?.code
|
let code = jobToExecute?.code
|
||||||
@@ -904,8 +978,7 @@ export class SASViyaApiClient {
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (!jobDefinitionLink) {
|
if (!jobDefinitionLink) {
|
||||||
console.error('Job definition URI was not found.')
|
throw new Error(`URI of job definition was not found.`)
|
||||||
throw new Error('Job definition URI was not found.')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const { result: jobDefinition } = await this.request<JobDefinition>(
|
const { result: jobDefinition } = await this.request<JobDefinition>(
|
||||||
@@ -915,7 +988,7 @@ export class SASViyaApiClient {
|
|||||||
|
|
||||||
code = jobDefinition.code
|
code = jobDefinition.code
|
||||||
|
|
||||||
// Add code to existing job definition
|
// Adds code to existing job definition
|
||||||
jobToExecute.code = code
|
jobToExecute.code = code
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -927,13 +1000,14 @@ export class SASViyaApiClient {
|
|||||||
accessToken,
|
accessToken,
|
||||||
true,
|
true,
|
||||||
data,
|
data,
|
||||||
debug
|
debug,
|
||||||
|
true
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes a job via the SAS Viya Job Execution API
|
* Executes a job via the SAS Viya Job Execution API
|
||||||
* @param sasJob - the relative path to the job.
|
* @param sasJob - the relative or absolute path to the job.
|
||||||
* @param contextName - the name of the context where the job is to be executed.
|
* @param contextName - the name of the context where the job is to be executed.
|
||||||
* @param debug - sets the _debug flag in the job arguments.
|
* @param debug - sets the _debug flag in the job arguments.
|
||||||
* @param data - any data to be passed in as input to the job.
|
* @param data - any data to be passed in as input to the job.
|
||||||
@@ -946,20 +1020,31 @@ export class SASViyaApiClient {
|
|||||||
data?: any,
|
data?: any,
|
||||||
accessToken?: string
|
accessToken?: string
|
||||||
) {
|
) {
|
||||||
if (!this.rootFolder) {
|
if (isRelativePath(sasJob) && !this.rootFolderName) {
|
||||||
await this.populateRootFolder(accessToken)
|
throw new Error(
|
||||||
|
'Relative paths cannot be used without specifying a root folder name.'
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.rootFolder) {
|
if (isRelativePath(sasJob)) {
|
||||||
throw new Error('Root folder was not found')
|
const folderName = sasJob.split('/')[0]
|
||||||
}
|
await this.populateFolderMap(`${this.rootFolderName}/${folderName}`)
|
||||||
if (!this.rootFolderMap.size) {
|
|
||||||
await this.populateRootFolderMap(accessToken)
|
if (!this.folderMap.get(`${this.rootFolderName}/${folderName}`)) {
|
||||||
}
|
throw new Error(
|
||||||
if (!this.rootFolderMap.size) {
|
`The folder '${folderName}' was not found at '${this.serverUrl}/${this.rootFolderName}'.`
|
||||||
throw new Error(
|
)
|
||||||
`The job ${sasJob} was not found in ${this.rootFolderName}`
|
}
|
||||||
)
|
} else {
|
||||||
|
const folderPathParts = sasJob.split('/')
|
||||||
|
folderPathParts.pop()
|
||||||
|
const folderPath = folderPathParts.join('/')
|
||||||
|
await this.populateFolderMap(folderPath, accessToken)
|
||||||
|
if (!this.folderMap.get(folderPath)) {
|
||||||
|
throw new Error(
|
||||||
|
`The folder '${folderPath}' was not found at '${this.serverUrl}'.`
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let files: any[] = []
|
let files: any[] = []
|
||||||
@@ -967,114 +1052,128 @@ export class SASViyaApiClient {
|
|||||||
files = await this.uploadTables(data, accessToken)
|
files = await this.uploadTables(data, accessToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
const jobName = path.basename(sasJob)
|
let jobToExecute: Job | undefined
|
||||||
const jobFolder = sasJob.replace(`/${jobName}`, '')
|
let jobName: string | undefined
|
||||||
const allJobsInFolder = this.rootFolderMap.get(jobFolder.replace('/', ''))
|
let jobPath: string | undefined
|
||||||
|
if (isRelativePath(sasJob)) {
|
||||||
if (allJobsInFolder) {
|
const folderName = sasJob.split('/')[0]
|
||||||
const jobSpec = allJobsInFolder.find((j: Job) => j.name === jobName)
|
jobName = sasJob.split('/')[1]
|
||||||
const jobDefinitionLink = jobSpec?.links.find(
|
jobPath = `${this.rootFolderName}/${folderName}`
|
||||||
(l) => l.rel === 'getResource'
|
const jobFolder = this.folderMap.get(jobPath)
|
||||||
)?.href
|
jobToExecute = jobFolder?.find((item) => item.name === jobName)
|
||||||
const requestInfo: any = {
|
|
||||||
method: 'GET'
|
|
||||||
}
|
|
||||||
const headers: any = { 'Content-Type': 'application/json' }
|
|
||||||
|
|
||||||
if (!!accessToken) {
|
|
||||||
headers.Authorization = `Bearer ${accessToken}`
|
|
||||||
}
|
|
||||||
|
|
||||||
requestInfo.headers = headers
|
|
||||||
|
|
||||||
const { result: jobDefinition } = await this.request<Job>(
|
|
||||||
`${this.serverUrl}${jobDefinitionLink}`,
|
|
||||||
requestInfo
|
|
||||||
)
|
|
||||||
|
|
||||||
const jobArguments: { [key: string]: any } = {
|
|
||||||
_contextName: contextName,
|
|
||||||
_program: `${this.rootFolderName}/${sasJob}`,
|
|
||||||
_webin_file_count: files.length,
|
|
||||||
_OMITJSONLISTING: true,
|
|
||||||
_OMITJSONLOG: true,
|
|
||||||
_OMITSESSIONRESULTS: true,
|
|
||||||
_OMITTEXTLISTING: true,
|
|
||||||
_OMITTEXTLOG: true
|
|
||||||
}
|
|
||||||
|
|
||||||
if (debug) {
|
|
||||||
jobArguments['_OMITTEXTLOG'] = 'false'
|
|
||||||
jobArguments['_OMITSESSIONRESULTS'] = 'false'
|
|
||||||
jobArguments['_DEBUG'] = 131
|
|
||||||
}
|
|
||||||
|
|
||||||
files.forEach((fileInfo, index) => {
|
|
||||||
jobArguments[
|
|
||||||
`_webin_fileuri${index + 1}`
|
|
||||||
] = `/files/files/${fileInfo.file.id}`
|
|
||||||
jobArguments[`_webin_name${index + 1}`] = fileInfo.tableName
|
|
||||||
})
|
|
||||||
|
|
||||||
const postJobRequest = {
|
|
||||||
method: 'POST',
|
|
||||||
headers,
|
|
||||||
body: JSON.stringify({
|
|
||||||
name: `exec-${jobName}`,
|
|
||||||
description: 'Powered by SASjs',
|
|
||||||
jobDefinition,
|
|
||||||
arguments: jobArguments
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const { result: postedJob, etag } = await this.request<Job>(
|
|
||||||
`${this.serverUrl}/jobExecution/jobs?_action=wait`,
|
|
||||||
postJobRequest
|
|
||||||
)
|
|
||||||
const jobStatus = await this.pollJobState(
|
|
||||||
postedJob,
|
|
||||||
etag,
|
|
||||||
accessToken,
|
|
||||||
true
|
|
||||||
)
|
|
||||||
const { result: currentJob } = await this.request<Job>(
|
|
||||||
`${this.serverUrl}/jobExecution/jobs/${postedJob.id}`,
|
|
||||||
{ headers }
|
|
||||||
)
|
|
||||||
|
|
||||||
let jobResult, log
|
|
||||||
if (jobStatus === 'failed') {
|
|
||||||
return Promise.reject(currentJob.error)
|
|
||||||
}
|
|
||||||
const resultLink = currentJob.results['_webout.json']
|
|
||||||
const logLink = currentJob.links.find((l) => l.rel === 'log')
|
|
||||||
if (resultLink) {
|
|
||||||
jobResult = await this.request<any>(
|
|
||||||
`${this.serverUrl}${resultLink}/content`,
|
|
||||||
{ headers },
|
|
||||||
'text'
|
|
||||||
)
|
|
||||||
}
|
|
||||||
if (debug && logLink) {
|
|
||||||
log = await this.request<any>(
|
|
||||||
`${this.serverUrl}${logLink.href}/content`,
|
|
||||||
{
|
|
||||||
headers
|
|
||||||
}
|
|
||||||
).then((res: any) =>
|
|
||||||
res.result.items.map((i: any) => i.line).join('\n')
|
|
||||||
)
|
|
||||||
}
|
|
||||||
return { result: jobResult?.result, log }
|
|
||||||
} else {
|
} else {
|
||||||
throw new Error(
|
const folderPathParts = sasJob.split('/')
|
||||||
`The job ${sasJob} was not found at the location ${this.rootFolderName}`
|
jobName = folderPathParts.pop()
|
||||||
|
jobPath = folderPathParts.join('/')
|
||||||
|
const jobFolder = this.folderMap.get(jobPath)
|
||||||
|
jobToExecute = jobFolder?.find((item) => item.name === jobName)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!jobToExecute) {
|
||||||
|
throw new Error(`The job ${sasJob} was not found.`)
|
||||||
|
}
|
||||||
|
const jobDefinitionLink = jobToExecute?.links.find(
|
||||||
|
(l) => l.rel === 'getResource'
|
||||||
|
)?.href
|
||||||
|
const requestInfo: any = {
|
||||||
|
method: 'GET'
|
||||||
|
}
|
||||||
|
const headers: any = { 'Content-Type': 'application/json' }
|
||||||
|
|
||||||
|
if (!!accessToken) {
|
||||||
|
headers.Authorization = `Bearer ${accessToken}`
|
||||||
|
}
|
||||||
|
|
||||||
|
requestInfo.headers = headers
|
||||||
|
|
||||||
|
const { result: jobDefinition } = await this.request<Job>(
|
||||||
|
`${this.serverUrl}${jobDefinitionLink}`,
|
||||||
|
requestInfo
|
||||||
|
)
|
||||||
|
|
||||||
|
const jobArguments: { [key: string]: any } = {
|
||||||
|
_contextName: contextName,
|
||||||
|
_program: `${jobPath}/${jobName}`,
|
||||||
|
_webin_file_count: files.length,
|
||||||
|
_OMITJSONLISTING: true,
|
||||||
|
_OMITJSONLOG: true,
|
||||||
|
_OMITSESSIONRESULTS: true,
|
||||||
|
_OMITTEXTLISTING: true,
|
||||||
|
_OMITTEXTLOG: true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug) {
|
||||||
|
jobArguments['_OMITTEXTLOG'] = 'false'
|
||||||
|
jobArguments['_OMITSESSIONRESULTS'] = 'false'
|
||||||
|
jobArguments['_DEBUG'] = 131
|
||||||
|
}
|
||||||
|
|
||||||
|
files.forEach((fileInfo, index) => {
|
||||||
|
jobArguments[
|
||||||
|
`_webin_fileuri${index + 1}`
|
||||||
|
] = `/files/files/${fileInfo.file.id}`
|
||||||
|
jobArguments[`_webin_name${index + 1}`] = fileInfo.tableName
|
||||||
|
})
|
||||||
|
|
||||||
|
const postJobRequest = {
|
||||||
|
method: 'POST',
|
||||||
|
headers,
|
||||||
|
body: JSON.stringify({
|
||||||
|
name: `exec-${jobName}`,
|
||||||
|
description: 'Powered by SASjs',
|
||||||
|
jobDefinition,
|
||||||
|
arguments: jobArguments
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const { result: postedJob, etag } = await this.request<Job>(
|
||||||
|
`${this.serverUrl}/jobExecution/jobs?_action=wait`,
|
||||||
|
postJobRequest
|
||||||
|
)
|
||||||
|
const jobStatus = await this.pollJobState(
|
||||||
|
postedJob,
|
||||||
|
etag,
|
||||||
|
accessToken,
|
||||||
|
true
|
||||||
|
)
|
||||||
|
const { result: currentJob } = await this.request<Job>(
|
||||||
|
`${this.serverUrl}/jobExecution/jobs/${postedJob.id}`,
|
||||||
|
{ headers }
|
||||||
|
)
|
||||||
|
|
||||||
|
let jobResult
|
||||||
|
let log
|
||||||
|
if (jobStatus === 'failed') {
|
||||||
|
return Promise.reject(currentJob.error)
|
||||||
|
}
|
||||||
|
const resultLink = currentJob.results['_webout.json']
|
||||||
|
const logLink = currentJob.links.find((l) => l.rel === 'log')
|
||||||
|
if (resultLink) {
|
||||||
|
jobResult = await this.request<any>(
|
||||||
|
`${this.serverUrl}${resultLink}/content`,
|
||||||
|
{ headers },
|
||||||
|
'text'
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
if (debug && logLink) {
|
||||||
|
log = await this.request<any>(
|
||||||
|
`${this.serverUrl}${logLink.href}/content`,
|
||||||
|
{
|
||||||
|
headers
|
||||||
|
}
|
||||||
|
).then((res: any) => res.result.items.map((i: any) => i.line).join('\n'))
|
||||||
|
}
|
||||||
|
return { result: jobResult?.result, log }
|
||||||
}
|
}
|
||||||
|
|
||||||
private async populateRootFolderMap(accessToken?: string) {
|
private async populateFolderMap(folderPath: string, accessToken?: string) {
|
||||||
const allItems = new Map<string, Job[]>()
|
const path = isRelativePath(folderPath)
|
||||||
const url = '/folders/folders/@item?path=' + this.rootFolderName
|
? `${this.rootFolderName}/${folderPath}`
|
||||||
|
: folderPath
|
||||||
|
if (this.folderMap.get(path)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const url = '/folders/folders/@item?path=' + path
|
||||||
const requestInfo: any = {
|
const requestInfo: any = {
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
}
|
}
|
||||||
@@ -1086,7 +1185,7 @@ export class SASViyaApiClient {
|
|||||||
requestInfo
|
requestInfo
|
||||||
)
|
)
|
||||||
if (!folder) {
|
if (!folder) {
|
||||||
throw new Error('Cannot populate RootFolderMap unless rootFolder exists')
|
throw new Error(`The path ${path} does not exist on ${this.serverUrl}`)
|
||||||
}
|
}
|
||||||
const { result: members } = await this.request<{ items: any[] }>(
|
const { result: members } = await this.request<{ items: any[] }>(
|
||||||
`${this.serverUrl}/folders/folders/${folder.id}/members`,
|
`${this.serverUrl}/folders/folders/${folder.id}/members`,
|
||||||
@@ -1094,55 +1193,7 @@ export class SASViyaApiClient {
|
|||||||
)
|
)
|
||||||
|
|
||||||
const itemsAtRoot = members.items
|
const itemsAtRoot = members.items
|
||||||
allItems.set('', itemsAtRoot)
|
this.folderMap.set(path, itemsAtRoot)
|
||||||
const subfolderRequests = members.items
|
|
||||||
.filter((i: any) => i.contentType === 'folder')
|
|
||||||
.map(async (member: any) => {
|
|
||||||
const subFolderUrl =
|
|
||||||
'/folders/folders/@item?path=' +
|
|
||||||
this.rootFolderName +
|
|
||||||
'/' +
|
|
||||||
member.name
|
|
||||||
const { result: memberDetail } = await this.request<Folder>(
|
|
||||||
`${this.serverUrl}${subFolderUrl}`,
|
|
||||||
requestInfo
|
|
||||||
)
|
|
||||||
|
|
||||||
const membersLink = memberDetail.links.find(
|
|
||||||
(l: any) => l.rel === 'members'
|
|
||||||
)
|
|
||||||
|
|
||||||
const { result: memberContents } = await this.request<{ items: any[] }>(
|
|
||||||
`${this.serverUrl}${membersLink!.href}`,
|
|
||||||
requestInfo
|
|
||||||
)
|
|
||||||
const itemsInFolder = memberContents.items as any[]
|
|
||||||
allItems.set(member.name, itemsInFolder)
|
|
||||||
return itemsInFolder
|
|
||||||
})
|
|
||||||
await Promise.all(subfolderRequests)
|
|
||||||
|
|
||||||
this.rootFolderMap = allItems
|
|
||||||
}
|
|
||||||
|
|
||||||
private async populateRootFolder(accessToken?: string) {
|
|
||||||
const url = '/folders/folders/@item?path=' + this.rootFolderName
|
|
||||||
const requestInfo: RequestInit = {
|
|
||||||
method: 'GET'
|
|
||||||
}
|
|
||||||
if (accessToken) {
|
|
||||||
requestInfo.headers = { Authorization: `Bearer ${accessToken}` }
|
|
||||||
}
|
|
||||||
let error
|
|
||||||
const rootFolder = await this.request<Folder>(
|
|
||||||
`${this.serverUrl}${url}`,
|
|
||||||
requestInfo
|
|
||||||
)
|
|
||||||
|
|
||||||
this.rootFolder = rootFolder?.result || null
|
|
||||||
if (error) {
|
|
||||||
throw new Error(JSON.stringify(error))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async pollJobState(
|
private async pollJobState(
|
||||||
@@ -1164,7 +1215,7 @@ export class SASViyaApiClient {
|
|||||||
}
|
}
|
||||||
const stateLink = postedJob.links.find((l: any) => l.rel === 'state')
|
const stateLink = postedJob.links.find((l: any) => l.rel === 'state')
|
||||||
if (!stateLink) {
|
if (!stateLink) {
|
||||||
Promise.reject('Job state link was not found.')
|
Promise.reject(`Job state link was not found.`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const { result: state } = await this.request<string>(
|
const { result: state } = await this.request<string>(
|
||||||
@@ -1348,17 +1399,13 @@ export class SASViyaApiClient {
|
|||||||
const { result: contexts } = await this.request<{ items: Context[] }>(
|
const { result: contexts } = await this.request<{ items: Context[] }>(
|
||||||
`${this.serverUrl}/compute/contexts?filter=eq(name, "${contextName}")`,
|
`${this.serverUrl}/compute/contexts?filter=eq(name, "${contextName}")`,
|
||||||
{ headers }
|
{ headers }
|
||||||
).catch((e) => {
|
).catch((err) => {
|
||||||
console.error(e)
|
throw err
|
||||||
|
|
||||||
throw new Error(
|
|
||||||
`An error occurred when fetching the context with ID ${contextName}`
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!contexts || !(contexts.items && contexts.items.length)) {
|
if (!contexts || !(contexts.items && contexts.items.length)) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`The context ${contextName} was not found on ${this.serverUrl}.`
|
`The context '${contextName}' was not found at '${this.serverUrl}'.`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1417,7 +1464,7 @@ export class SASViyaApiClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For performance (and in case of accidental error) the `deleteFolder` function does not actually delete the folder (and all it's content and subfolder content). Instead the folder is simply moved to the recycle bin. Deletion time will be added to the folder name.
|
* For performance (and in case of accidental error) the `deleteFolder` function does not actually delete the folder (and all its content and subfolder content). Instead the folder is simply moved to the recycle bin. Deletion time will be added to the folder name.
|
||||||
* @param folderPath - the full path (eg `/Public/example/deleteThis`) of the folder to be deleted.
|
* @param folderPath - the full path (eg `/Public/example/deleteThis`) of the folder to be deleted.
|
||||||
* @param accessToken - an access token for authorizing the request.
|
* @param accessToken - an access token for authorizing the request.
|
||||||
*/
|
*/
|
||||||
|
|||||||
242
src/SASjs.ts
242
src/SASjs.ts
@@ -21,7 +21,8 @@ import {
|
|||||||
parseGeneratedCode,
|
parseGeneratedCode,
|
||||||
parseWeboutResponse,
|
parseWeboutResponse,
|
||||||
needsRetry,
|
needsRetry,
|
||||||
asyncForEach
|
asyncForEach,
|
||||||
|
isRelativePath
|
||||||
} from './utils'
|
} from './utils'
|
||||||
import {
|
import {
|
||||||
SASjsConfig,
|
SASjsConfig,
|
||||||
@@ -30,7 +31,8 @@ import {
|
|||||||
ServerType,
|
ServerType,
|
||||||
CsrfToken,
|
CsrfToken,
|
||||||
UploadFile,
|
UploadFile,
|
||||||
EditContextInput
|
EditContextInput,
|
||||||
|
ErrorResponse
|
||||||
} from './types'
|
} from './types'
|
||||||
import { SASViyaApiClient } from './SASViyaApiClient'
|
import { SASViyaApiClient } from './SASViyaApiClient'
|
||||||
import { SAS9ApiClient } from './SAS9ApiClient'
|
import { SAS9ApiClient } from './SAS9ApiClient'
|
||||||
@@ -84,9 +86,8 @@ export default class SASjs {
|
|||||||
serverName: string,
|
serverName: string,
|
||||||
repositoryName: string
|
repositoryName: string
|
||||||
) {
|
) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SAS9) {
|
this.isMethodSupported('executeScriptSAS9', ServerType.SAS9)
|
||||||
throw new Error('This operation is only supported on SAS9 servers.')
|
|
||||||
}
|
|
||||||
return await this.sas9ApiClient?.executeScript(
|
return await this.sas9ApiClient?.executeScript(
|
||||||
linesOfCode,
|
linesOfCode,
|
||||||
serverName,
|
serverName,
|
||||||
@@ -95,16 +96,14 @@ export default class SASjs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async getAllContexts(accessToken: string) {
|
public async getAllContexts(accessToken: string) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('getAllContexts', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
return await this.sasViyaApiClient!.getAllContexts(accessToken)
|
return await this.sasViyaApiClient!.getAllContexts(accessToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
public async getExecutableContexts(accessToken: string) {
|
public async getExecutableContexts(accessToken: string) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('getExecutableContexts', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
return await this.sasViyaApiClient!.getExecutableContexts(accessToken)
|
return await this.sasViyaApiClient!.getExecutableContexts(accessToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,9 +124,8 @@ export default class SASjs {
|
|||||||
authorizedUsers: string[],
|
authorizedUsers: string[],
|
||||||
accessToken: string
|
accessToken: string
|
||||||
) {
|
) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('createContext', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
return await this.sasViyaApiClient!.createContext(
|
return await this.sasViyaApiClient!.createContext(
|
||||||
contextName,
|
contextName,
|
||||||
launchContextName,
|
launchContextName,
|
||||||
@@ -149,9 +147,8 @@ export default class SASjs {
|
|||||||
editedContext: EditContextInput,
|
editedContext: EditContextInput,
|
||||||
accessToken?: string
|
accessToken?: string
|
||||||
) {
|
) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('editContext', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
return await this.sasViyaApiClient!.editContext(
|
return await this.sasViyaApiClient!.editContext(
|
||||||
contextName,
|
contextName,
|
||||||
editedContext,
|
editedContext,
|
||||||
@@ -165,16 +162,14 @@ export default class SASjs {
|
|||||||
* @param accessToken - an access token for an authorized user.
|
* @param accessToken - an access token for an authorized user.
|
||||||
*/
|
*/
|
||||||
public async deleteContext(contextName: string, accessToken?: string) {
|
public async deleteContext(contextName: string, accessToken?: string) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('deleteContext', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
return await this.sasViyaApiClient!.deleteContext(contextName, accessToken)
|
return await this.sasViyaApiClient!.deleteContext(contextName, accessToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
public async createSession(contextName: string, accessToken: string) {
|
public async createSession(contextName: string, accessToken: string) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('createSession', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
return await this.sasViyaApiClient!.createSession(contextName, accessToken)
|
return await this.sasViyaApiClient!.createSession(contextName, accessToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,9 +181,8 @@ export default class SASjs {
|
|||||||
sessionId = '',
|
sessionId = '',
|
||||||
silent = false
|
silent = false
|
||||||
) {
|
) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('executeScriptSASViya', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
return await this.sasViyaApiClient!.executeScript(
|
return await this.sasViyaApiClient!.executeScript(
|
||||||
fileName,
|
fileName,
|
||||||
linesOfCode,
|
linesOfCode,
|
||||||
@@ -201,7 +195,7 @@ export default class SASjs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a folder at SAS file system
|
* Creates a folder at SAS file system.
|
||||||
* @param folderName - name of the folder to be created.
|
* @param folderName - name of the folder to be created.
|
||||||
* @param parentFolderPath - the full path (eg `/Public/example/myFolder`) of the parent folder.
|
* @param parentFolderPath - the full path (eg `/Public/example/myFolder`) of the parent folder.
|
||||||
* @param parentFolderUri - the URI of the parent folder.
|
* @param parentFolderUri - the URI of the parent folder.
|
||||||
@@ -217,9 +211,8 @@ export default class SASjs {
|
|||||||
sasApiClient?: SASViyaApiClient,
|
sasApiClient?: SASViyaApiClient,
|
||||||
isForced?: boolean
|
isForced?: boolean
|
||||||
) {
|
) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('createFolder', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
if (sasApiClient)
|
if (sasApiClient)
|
||||||
return await sasApiClient.createFolder(
|
return await sasApiClient.createFolder(
|
||||||
folderName,
|
folderName,
|
||||||
@@ -244,9 +237,8 @@ export default class SASjs {
|
|||||||
accessToken?: string,
|
accessToken?: string,
|
||||||
sasApiClient?: SASViyaApiClient
|
sasApiClient?: SASViyaApiClient
|
||||||
) {
|
) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('createJobDefinition', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
if (sasApiClient)
|
if (sasApiClient)
|
||||||
return await sasApiClient!.createJobDefinition(
|
return await sasApiClient!.createJobDefinition(
|
||||||
jobName,
|
jobName,
|
||||||
@@ -265,9 +257,8 @@ export default class SASjs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async getAuthCode(clientId: string) {
|
public async getAuthCode(clientId: string) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('getAuthCode', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
return await this.sasViyaApiClient!.getAuthCode(clientId)
|
return await this.sasViyaApiClient!.getAuthCode(clientId)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,9 +267,8 @@ export default class SASjs {
|
|||||||
clientSecret: string,
|
clientSecret: string,
|
||||||
authCode: string
|
authCode: string
|
||||||
) {
|
) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('getAccessToken', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
return await this.sasViyaApiClient!.getAccessToken(
|
return await this.sasViyaApiClient!.getAccessToken(
|
||||||
clientId,
|
clientId,
|
||||||
clientSecret,
|
clientSecret,
|
||||||
@@ -291,9 +281,8 @@ export default class SASjs {
|
|||||||
clientSecret: string,
|
clientSecret: string,
|
||||||
refreshToken: string
|
refreshToken: string
|
||||||
) {
|
) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('refreshTokens', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
return await this.sasViyaApiClient!.refreshTokens(
|
return await this.sasViyaApiClient!.refreshTokens(
|
||||||
clientId,
|
clientId,
|
||||||
clientSecret,
|
clientSecret,
|
||||||
@@ -302,9 +291,8 @@ export default class SASjs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async deleteClient(clientId: string, accessToken: string) {
|
public async deleteClient(clientId: string, accessToken: string) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('deleteClient', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
return await this.sasViyaApiClient!.deleteClient(clientId, accessToken)
|
return await this.sasViyaApiClient!.deleteClient(clientId, accessToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -325,7 +313,7 @@ export default class SASjs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the _csrf token of the current session for the API approach
|
* Returns the _csrf token of the current session for the API approach.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public getCsrfApi() {
|
public getCsrfApi() {
|
||||||
@@ -342,7 +330,7 @@ export default class SASjs {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the SASjs configuration.
|
* Sets the SASjs configuration.
|
||||||
* @param config - SASjsConfig indicating SASjs Configuration
|
* @param config - SASjs configuration.
|
||||||
*/
|
*/
|
||||||
public async setSASjsConfig(config: SASjsConfig) {
|
public async setSASjsConfig(config: SASjsConfig) {
|
||||||
this.sasjsConfig = {
|
this.sasjsConfig = {
|
||||||
@@ -353,17 +341,16 @@ export default class SASjs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the debug state. Turning this on will enable additional logging to
|
* Sets the debug state. Turning this on will enable additional logging in the adapter.
|
||||||
* be returned to the adapter.
|
* @param value - boolean indicating debug state (on/off).
|
||||||
* @param value - Boolean indicating debug state
|
|
||||||
*/
|
*/
|
||||||
public setDebugState(value: boolean) {
|
public setDebugState(value: boolean) {
|
||||||
this.sasjsConfig.debug = value
|
this.sasjsConfig.debug = value
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether a session is active, or login is required
|
* Checks whether a session is active, or login is required.
|
||||||
* @returns a promise which resolves with an object containing two values - a boolean `isLoggedIn`, and a string `userName`
|
* @returns - a promise which resolves with an object containing two values - a boolean `isLoggedIn`, and a string `userName`.
|
||||||
*/
|
*/
|
||||||
public async checkSession() {
|
public async checkSession() {
|
||||||
const loginResponse = await fetch(this.loginUrl.replace('.do', ''))
|
const loginResponse = await fetch(this.loginUrl.replace('.do', ''))
|
||||||
@@ -377,9 +364,9 @@ export default class SASjs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs into the SAS server with the supplied credentials
|
* Logs into the SAS server with the supplied credentials.
|
||||||
* @param username - a string representing the username
|
* @param username - a string representing the username.
|
||||||
* @param password - a string representing the password
|
* @param password - a string representing the password.
|
||||||
*/
|
*/
|
||||||
public async logIn(username: string, password: string) {
|
public async logIn(username: string, password: string) {
|
||||||
const loginParams: any = {
|
const loginParams: any = {
|
||||||
@@ -448,7 +435,7 @@ export default class SASjs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs out of the configured SAS server
|
* Logs out of the configured SAS server.
|
||||||
*/
|
*/
|
||||||
public logOut() {
|
public logOut() {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
@@ -462,12 +449,12 @@ export default class SASjs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Uploads a file to the given service
|
* Uploads a file to the given service.
|
||||||
* @param sasJob - The path to the SAS program (ultimately resolves to
|
* @param sasJob - the path to the SAS program (ultimately resolves to
|
||||||
* the SAS `_program` parameter to run a Job Definition or SAS 9 Stored
|
* the SAS `_program` parameter to run a Job Definition or SAS 9 Stored
|
||||||
* Process.) Is prepended at runtime with the value of `appLoc`.
|
* Process). Is prepended at runtime with the value of `appLoc`.
|
||||||
* @param file - Array of files to be uploaded, including File object and file name.
|
* @param files - array of files to be uploaded, including File object and file name.
|
||||||
* @param params - Request URL paramaters
|
* @param params - request URL parameters.
|
||||||
*/
|
*/
|
||||||
public uploadFile(sasJob: string, files: UploadFile[], params: any) {
|
public uploadFile(sasJob: string, files: UploadFile[], params: any) {
|
||||||
const fileUploader =
|
const fileUploader =
|
||||||
@@ -484,21 +471,21 @@ export default class SASjs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes a request to the SAS Service specified in `SASjob`. The response
|
* Makes a request to the SAS Service specified in `SASjob`. The response
|
||||||
* object will always contain table names in lowercase, and column names in
|
* object will always contain table names in lowercase, and column names in
|
||||||
* uppercase. Values are returned formatted by default, unformatted
|
* uppercase. Values are returned formatted by default, unformatted
|
||||||
* values can be configured as an option in the `%webout` macro.
|
* values can be configured as an option in the `%webout` macro.
|
||||||
*
|
*
|
||||||
* @param sasJob - The path to the SAS program (ultimately resolves to
|
* @param sasJob - the path to the SAS program (ultimately resolves to
|
||||||
* the SAS `_program` parameter to run a Job Definition or SAS 9 Stored
|
* the SAS `_program` parameter to run a Job Definition or SAS 9 Stored
|
||||||
* Process.) Is prepended at runtime with the value of `appLoc`.
|
* Process). Is prepended at runtime with the value of `appLoc`.
|
||||||
* @param data - A JSON object containing one or more tables to be sent to
|
* @param data - a JSON object containing one or more tables to be sent to
|
||||||
* SAS. Can be `null` if no inputs required.
|
* SAS. Can be `null` if no inputs required.
|
||||||
* @param config - Provide any changes to the config here, for instance to
|
* @param config - provide any changes to the config here, for instance to
|
||||||
* enable / disable `debug`. Any change provided will override the global config,
|
* enable/disable `debug`. Any change provided will override the global config,
|
||||||
* for that particular function call.
|
* for that particular function call.
|
||||||
* @param loginRequiredCallback - provide a function here to be called if the
|
* @param loginRequiredCallback - provide a function here to be called if the
|
||||||
* user is not logged in (eg to display a login form). The request will be
|
* user is not logged in (eg to display a login form). The request will be
|
||||||
* resubmitted after logon.
|
* resubmitted after logon.
|
||||||
*/
|
*/
|
||||||
public async request(
|
public async request(
|
||||||
@@ -515,8 +502,6 @@ export default class SASjs {
|
|||||||
...config
|
...config
|
||||||
}
|
}
|
||||||
|
|
||||||
sasJob = sasJob.startsWith('/') ? sasJob.replace('/', '') : sasJob
|
|
||||||
|
|
||||||
if (config.serverType === ServerType.SASViya && config.contextName) {
|
if (config.serverType === ServerType.SASViya && config.contextName) {
|
||||||
if (config.useComputeApi) {
|
if (config.useComputeApi) {
|
||||||
requestResponse = await this.executeJobViaComputeApi(
|
requestResponse = await this.executeJobViaComputeApi(
|
||||||
@@ -552,8 +537,7 @@ export default class SASjs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the folders and services in the provided JSON on the given location
|
* Creates the folders and services at the given location `appLoc` on the given server `serverUrl`.
|
||||||
* (appLoc) on the given server (serverUrl).
|
|
||||||
* @param serviceJson - the JSON specifying the folders and services to be created.
|
* @param serviceJson - the JSON specifying the folders and services to be created.
|
||||||
* @param appLoc - the base folder in which to create the new folders and
|
* @param appLoc - the base folder in which to create the new folders and
|
||||||
* services. If not provided, is taken from SASjsConfig.
|
* services. If not provided, is taken from SASjsConfig.
|
||||||
@@ -570,9 +554,7 @@ export default class SASjs {
|
|||||||
accessToken?: string,
|
accessToken?: string,
|
||||||
isForced = false
|
isForced = false
|
||||||
) {
|
) {
|
||||||
if (this.sasjsConfig.serverType !== ServerType.SASViya) {
|
this.isMethodSupported('deployServicePack', ServerType.SASViya)
|
||||||
throw new Error('This operation is only supported on SAS Viya servers.')
|
|
||||||
}
|
|
||||||
|
|
||||||
let sasApiClient: any = null
|
let sasApiClient: any = null
|
||||||
if (serverUrl || appLoc) {
|
if (serverUrl || appLoc) {
|
||||||
@@ -686,7 +668,9 @@ export default class SASjs {
|
|||||||
resolve(retryResponse)
|
resolve(retryResponse)
|
||||||
} else {
|
} else {
|
||||||
this.retryCountComputeApi = 0
|
this.retryCountComputeApi = 0
|
||||||
reject({ MESSAGE: 'Compute API retry requests limit reached' })
|
reject(
|
||||||
|
new ErrorResponse('Compute API retry requests limit reached')
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -697,7 +681,7 @@ export default class SASjs {
|
|||||||
sasjsWaitingRequest.config = config
|
sasjsWaitingRequest.config = config
|
||||||
this.sasjsWaitingRequests.push(sasjsWaitingRequest)
|
this.sasjsWaitingRequests.push(sasjsWaitingRequest)
|
||||||
} else {
|
} else {
|
||||||
reject({ MESSAGE: error || 'Job execution failed' })
|
reject(new ErrorResponse('Job execution failed', error))
|
||||||
}
|
}
|
||||||
|
|
||||||
this.appendSasjsRequest(response.log, sasJob, null)
|
this.appendSasjsRequest(response.log, sasJob, null)
|
||||||
@@ -779,11 +763,13 @@ export default class SASjs {
|
|||||||
resolve(retryResponse)
|
resolve(retryResponse)
|
||||||
} else {
|
} else {
|
||||||
this.retryCountJeseApi = 0
|
this.retryCountJeseApi = 0
|
||||||
reject({ MESSAGE: 'Jes API retry requests limit reached' })
|
reject(
|
||||||
|
new ErrorResponse('Jes API retry requests limit reached')
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reject({ MESSAGE: (e && e.message) || 'Job execution failed' })
|
reject(new ErrorResponse('Job execution failed', e))
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -807,11 +793,15 @@ export default class SASjs {
|
|||||||
SASjob: sasJob,
|
SASjob: sasJob,
|
||||||
data
|
data
|
||||||
}
|
}
|
||||||
const program = config.appLoc
|
const program = isRelativePath(sasJob)
|
||||||
? config.appLoc.replace(/\/?$/, '/') + sasJob.replace(/^\//, '')
|
? config.appLoc
|
||||||
|
? config.appLoc.replace(/\/?$/, '/') + sasJob.replace(/^\//, '')
|
||||||
|
: sasJob
|
||||||
: sasJob
|
: sasJob
|
||||||
const jobUri =
|
const jobUri =
|
||||||
config.serverType === 'SASVIYA' ? await this.getJobUri(sasJob) : ''
|
config.serverType === ServerType.SASViya
|
||||||
|
? await this.getJobUri(sasJob)
|
||||||
|
: ''
|
||||||
const apiUrl = `${config.serverUrl}${this.jobsPath}/?${
|
const apiUrl = `${config.serverUrl}${this.jobsPath}/?${
|
||||||
jobUri.length > 0
|
jobUri.length > 0
|
||||||
? '__program=' + program + '&_job=' + jobUri
|
? '__program=' + program + '&_job=' + jobUri
|
||||||
@@ -895,7 +885,7 @@ export default class SASjs {
|
|||||||
sasjsWaitingRequest.requestPromise.promise = new Promise(
|
sasjsWaitingRequest.requestPromise.promise = new Promise(
|
||||||
(resolve, reject) => {
|
(resolve, reject) => {
|
||||||
if (isError) {
|
if (isError) {
|
||||||
reject({ MESSAGE: errorMsg })
|
reject(new ErrorResponse(errorMsg))
|
||||||
}
|
}
|
||||||
const headers: any = {}
|
const headers: any = {}
|
||||||
if (this.csrfTokenWeb) {
|
if (this.csrfTokenWeb) {
|
||||||
@@ -961,9 +951,12 @@ export default class SASjs {
|
|||||||
if (jsonResponseText !== '') {
|
if (jsonResponseText !== '') {
|
||||||
resolve(JSON.parse(jsonResponseText))
|
resolve(JSON.parse(jsonResponseText))
|
||||||
} else {
|
} else {
|
||||||
reject({
|
reject(
|
||||||
MESSAGE: this.parseSAS9ErrorResponse(responseText)
|
new ErrorResponse(
|
||||||
})
|
'Job WEB execution failed',
|
||||||
|
this.parseSAS9ErrorResponse(responseText)
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} else if (
|
} else if (
|
||||||
config.serverType === ServerType.SASViya &&
|
config.serverType === ServerType.SASViya &&
|
||||||
@@ -976,15 +969,30 @@ export default class SASjs {
|
|||||||
try {
|
try {
|
||||||
resolve(JSON.parse(resText))
|
resolve(JSON.parse(resText))
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
reject({ MESSAGE: resText })
|
reject(
|
||||||
|
new ErrorResponse(
|
||||||
|
'Job WEB debug response parsing failed',
|
||||||
|
{ response: resText, exception: e }
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
(err: any) => {
|
(err: any) => {
|
||||||
reject({ MESSAGE: err })
|
reject(
|
||||||
|
new ErrorResponse(
|
||||||
|
'Job WEB debug response parsing failed',
|
||||||
|
err
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
reject({ MESSAGE: responseText })
|
reject(
|
||||||
|
new ErrorResponse(
|
||||||
|
'Job WEB debug response parsing failed',
|
||||||
|
{ response: responseText, exception: e }
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.updateUsername(responseText)
|
this.updateUsername(responseText)
|
||||||
@@ -992,14 +1000,19 @@ export default class SASjs {
|
|||||||
const parsedJson = JSON.parse(responseText)
|
const parsedJson = JSON.parse(responseText)
|
||||||
resolve(parsedJson)
|
resolve(parsedJson)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
reject({ MESSAGE: responseText })
|
reject(
|
||||||
|
new ErrorResponse('Job WEB response parsing failed', {
|
||||||
|
response: responseText,
|
||||||
|
exception: e
|
||||||
|
})
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((e: Error) => {
|
.catch((e: Error) => {
|
||||||
reject(e)
|
reject(new ErrorResponse('Job WEB request failed', e))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -1074,28 +1087,33 @@ export default class SASjs {
|
|||||||
resolve(resText)
|
resolve(resText)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
reject('No debug info in response')
|
reject('No debug info found in response.')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private async getJobUri(sasJob: string) {
|
private async getJobUri(sasJob: string) {
|
||||||
if (!this.sasViyaApiClient) return ''
|
if (!this.sasViyaApiClient) return ''
|
||||||
const jobMap: any = await this.sasViyaApiClient.getAppLocMap()
|
|
||||||
let uri = ''
|
let uri = ''
|
||||||
|
|
||||||
if (jobMap.size) {
|
let folderPath
|
||||||
const jobKey = sasJob.split('/')[0]
|
let jobName: string
|
||||||
const jobName = sasJob.split('/')[1]
|
if (isRelativePath(sasJob)) {
|
||||||
|
folderPath = sasJob.split('/')[0]
|
||||||
|
jobName = sasJob.split('/')[1]
|
||||||
|
} else {
|
||||||
|
const folderPathParts = sasJob.split('/')
|
||||||
|
jobName = folderPathParts.pop() || ''
|
||||||
|
folderPath = folderPathParts.join('/')
|
||||||
|
}
|
||||||
|
|
||||||
const locJobs = jobMap.get(jobKey)
|
const locJobs = await this.sasViyaApiClient.getJobsInFolder(folderPath)
|
||||||
if (locJobs) {
|
if (locJobs) {
|
||||||
const job = locJobs.find(
|
const job = locJobs.find(
|
||||||
(el: any) => el.name === jobName && el.contentType === 'jobDefinition'
|
(el: any) => el.name === jobName && el.contentType === 'jobDefinition'
|
||||||
)
|
)
|
||||||
if (job) {
|
if (job) {
|
||||||
uri = job.uri
|
uri = job.uri
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return uri
|
return uri
|
||||||
@@ -1353,7 +1371,7 @@ export default class SASjs {
|
|||||||
)
|
)
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unidenitied member present in Json: ${member.name}`)
|
throw new Error(`Unidentified member '${member.name}' provided.`)
|
||||||
}
|
}
|
||||||
if (member.type === 'folder' && member.members && member.members.length)
|
if (member.type === 'folder' && member.members && member.members.length)
|
||||||
await this.createFoldersAndServices(
|
await this.createFoldersAndServices(
|
||||||
@@ -1365,4 +1383,14 @@ export default class SASjs {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private isMethodSupported(method: string, serverType: string) {
|
||||||
|
if (this.sasjsConfig.serverType !== serverType) {
|
||||||
|
throw new Error(
|
||||||
|
`Method '${method}' is only supported on ${
|
||||||
|
serverType === ServerType.SAS9 ? 'SAS9' : 'SAS Viya'
|
||||||
|
} servers.`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ export class SessionManager {
|
|||||||
if (!this.currentContext) {
|
if (!this.currentContext) {
|
||||||
const { result: contexts } = await this.request<{
|
const { result: contexts } = await this.request<{
|
||||||
items: Context[]
|
items: Context[]
|
||||||
}>(`${this.serverUrl}/compute/contexts`, {
|
}>(`${this.serverUrl}/compute/contexts?limit=10000`, {
|
||||||
headers: this.getHeaders(accessToken)
|
headers: this.getHeaders(accessToken)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ export class SessionManager {
|
|||||||
|
|
||||||
if (!currentContext) {
|
if (!currentContext) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`The context ${this.contextName} was not found on the server ${this.serverUrl}`
|
`The context '${this.contextName}' was not found on the server ${this.serverUrl}.`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ export class SessionManager {
|
|||||||
if (sessionState === 'pending') {
|
if (sessionState === 'pending') {
|
||||||
if (stateLink) {
|
if (stateLink) {
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
console.log('Polling session status... \n')
|
console.log('Polling session status... \n') // ?
|
||||||
}
|
}
|
||||||
const { result: state } = await this.request<string>(
|
const { result: state } = await this.request<string>(
|
||||||
`${this.serverUrl}${stateLink.href}?wait=30`,
|
`${this.serverUrl}${stateLink.href}?wait=30`,
|
||||||
@@ -140,7 +140,7 @@ export class SessionManager {
|
|||||||
|
|
||||||
sessionState = state.trim()
|
sessionState = state.trim()
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
console.log(`Current state: ${sessionState}\n`)
|
console.log(`Current state is '${sessionState}'\n`)
|
||||||
}
|
}
|
||||||
resolve(sessionState)
|
resolve(sessionState)
|
||||||
}
|
}
|
||||||
|
|||||||
26
src/types/ErrorResponse.ts
Normal file
26
src/types/ErrorResponse.ts
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
export class ErrorResponse {
|
||||||
|
body: ErrorBody
|
||||||
|
|
||||||
|
constructor(message: string, details?: any) {
|
||||||
|
let detailsString = ''
|
||||||
|
let raw
|
||||||
|
|
||||||
|
try {
|
||||||
|
detailsString = JSON.stringify(details)
|
||||||
|
} catch {
|
||||||
|
raw = details
|
||||||
|
}
|
||||||
|
|
||||||
|
this.body = {
|
||||||
|
message,
|
||||||
|
details: detailsString,
|
||||||
|
raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ErrorBody {
|
||||||
|
message: string
|
||||||
|
details: string
|
||||||
|
raw: any
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import { ServerType } from './ServerType'
|
import { ServerType } from './ServerType'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifies the configuration for the SASjs instance.
|
* Specifies the configuration for the SASjs instance - eg where and how to
|
||||||
*
|
* connect to SAS.
|
||||||
*/
|
*/
|
||||||
export class SASjsConfig {
|
export class SASjsConfig {
|
||||||
/**
|
/**
|
||||||
@@ -11,21 +11,50 @@ export class SASjsConfig {
|
|||||||
* streamed.
|
* streamed.
|
||||||
*/
|
*/
|
||||||
serverUrl: string = ''
|
serverUrl: string = ''
|
||||||
|
/**
|
||||||
|
* The location of the Stored Process Web Application. By default the adapter
|
||||||
|
* will use '/SASStoredProcess/do' on SAS 9.
|
||||||
|
*/
|
||||||
pathSAS9: string = ''
|
pathSAS9: string = ''
|
||||||
|
/**
|
||||||
|
* The location of the Job Execution Web Application. By default the adapter
|
||||||
|
* will use '/SASJobExecution' on SAS Viya.
|
||||||
|
*/
|
||||||
pathSASViya: string = ''
|
pathSASViya: string = ''
|
||||||
/**
|
/**
|
||||||
* The appLoc is the parent folder under which the SAS services (STPs or Job
|
* The appLoc is the parent folder under which the SAS services (STPs or Job
|
||||||
* Execution Services) are stored.
|
* Execution Services) are stored. We recommend that each app is stored in
|
||||||
|
* a dedicated parent folder (the appLoc) and the services are grouped inside
|
||||||
|
* subfolders within the appLoc - allowing functionality to be restricted
|
||||||
|
* according to those groups at backend.
|
||||||
|
* When using appLoc, the paths provided in the `request` function should be
|
||||||
|
* _without_ a leading slash (/).
|
||||||
*/
|
*/
|
||||||
appLoc: string = ''
|
appLoc: string = ''
|
||||||
/**
|
/**
|
||||||
* Can be SAS9 or SASVIYA
|
* Can be `SAS9` or `SASVIYA`.
|
||||||
*/
|
*/
|
||||||
serverType: ServerType | null = null
|
serverType: ServerType | null = null
|
||||||
/**
|
/**
|
||||||
* Set to `true` to enable additional debugging.
|
* Set to `true` to enable additional debugging.
|
||||||
*/
|
*/
|
||||||
debug: boolean = true
|
debug: boolean = true
|
||||||
|
/**
|
||||||
|
* The name of the compute context to use when calling the Viya APIs directly.
|
||||||
|
* Example value: 'SAS Job Execution compute context'
|
||||||
|
* If set to missing or empty, and useComputeApi is true, the adapter will use
|
||||||
|
* the JES APIs. If provided, the Job Code will be executed in pooled
|
||||||
|
* compute sessions on this named context.
|
||||||
|
*/
|
||||||
contextName: string = ''
|
contextName: string = ''
|
||||||
|
/**
|
||||||
|
* Set to `false` to use the Job Execution Web Service. To enhance VIYA
|
||||||
|
* performance, set to `true` and provide a `contextName` on which to run
|
||||||
|
* the code. When running on a named context, the code executes under the
|
||||||
|
* user identity. When running as a Job Execution service, the code runs
|
||||||
|
* under the identity in the JES context. If no `contextName` is provided,
|
||||||
|
* and `useComputeApi` is `true`, then the service will run as a Job, except
|
||||||
|
* triggered using the APIs instead of the Job Execution Web Service broker.
|
||||||
|
*/
|
||||||
useComputeApi = false
|
useComputeApi = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Represents requests that are queued, pending a signon event
|
* Represents requests that are queued, pending a signon event.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
export interface SASjsWaitingRequest {
|
export interface SASjsWaitingRequest {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Server type - Viya or SAS9.
|
* Server type that can be `Viya` or `SAS9`.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
export enum ServerType {
|
export enum ServerType {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Represents a object that is passed to file uploader
|
* Represents an object that is passed to the file uploader.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
export interface UploadFile {
|
export interface UploadFile {
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
export * from './Context'
|
export * from './Context'
|
||||||
export * from './CsrfToken'
|
export * from './CsrfToken'
|
||||||
|
export * from './ErrorResponse'
|
||||||
export * from './Folder'
|
export * from './Folder'
|
||||||
export * from './Job'
|
export * from './Job'
|
||||||
|
export * from './JobDefinition'
|
||||||
|
export * from './JobResult'
|
||||||
export * from './Link'
|
export * from './Link'
|
||||||
export * from './SASjsConfig'
|
export * from './SASjsConfig'
|
||||||
export * from './SASjsRequest'
|
export * from './SASjsRequest'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { SASjsRequest } from '../types/SASjsRequest'
|
import { SASjsRequest } from '../types/SASjsRequest'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Comparator for SASjs request timestamps
|
* Comparator for SASjs request timestamps.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
export const compareTimestamps = (a: SASjsRequest, b: SASjsRequest) => {
|
export const compareTimestamps = (a: SASjsRequest, b: SASjsRequest) => {
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ export * from './convertToCsv'
|
|||||||
export * from './isAuthorizeFormRequired'
|
export * from './isAuthorizeFormRequired'
|
||||||
export * from './isLoginRequired'
|
export * from './isLoginRequired'
|
||||||
export * from './isLoginSuccess'
|
export * from './isLoginSuccess'
|
||||||
|
export * from './isRelativePath'
|
||||||
|
export * from './isUri'
|
||||||
|
export * from './isUrl'
|
||||||
export * from './makeRequest'
|
export * from './makeRequest'
|
||||||
export * from './needsRetry'
|
export * from './needsRetry'
|
||||||
export * from './parseAndSubmitAuthorizeForm'
|
export * from './parseAndSubmitAuthorizeForm'
|
||||||
@@ -13,5 +16,3 @@ export * from './parseSasViyaLog'
|
|||||||
export * from './serialize'
|
export * from './serialize'
|
||||||
export * from './splitChunks'
|
export * from './splitChunks'
|
||||||
export * from './parseWeboutResponse'
|
export * from './parseWeboutResponse'
|
||||||
export * from './isUri'
|
|
||||||
export * from './isUrl'
|
|
||||||
|
|||||||
2
src/utils/isRelativePath.ts
Normal file
2
src/utils/isRelativePath.ts
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export const isRelativePath = (uri: string): boolean =>
|
||||||
|
!!uri && !uri.startsWith('/')
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Checks if string is in URI format
|
* Checks if string is in URI format.
|
||||||
* @param str string to check
|
* @param str - string to check.
|
||||||
*/
|
*/
|
||||||
export const isUri = (str: string): boolean => /^\/folders\/folders\//.test(str)
|
export const isUri = (str: string): boolean => /^\/folders\/folders\//.test(str)
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
/**
|
||||||
|
* Checks if string is in URL format.
|
||||||
|
* @param url - string to check.
|
||||||
|
*/
|
||||||
export const isUrl = (url: string): boolean => {
|
export const isUrl = (url: string): boolean => {
|
||||||
const pattern = new RegExp(
|
const pattern = new RegExp(
|
||||||
'^(http://|https://)[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(/.*)?$',
|
'^(http://|https://)[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(/.*)?$',
|
||||||
|
|||||||
@@ -37,13 +37,28 @@ export async function makeRequest<T>(
|
|||||||
...request,
|
...request,
|
||||||
headers: { ...request.headers, [tokenHeader]: token }
|
headers: { ...request.headers, [tokenHeader]: token }
|
||||||
}
|
}
|
||||||
|
|
||||||
return fetch(url, retryRequest).then((res) => {
|
return fetch(url, retryRequest).then((res) => {
|
||||||
etag = res.headers.get('ETag')
|
etag = res.headers.get('ETag')
|
||||||
return responseTransform(res)
|
return responseTransform(res)
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
let body: any = await response.text()
|
||||||
|
|
||||||
|
try {
|
||||||
|
body = JSON.parse(body)
|
||||||
|
|
||||||
|
body.message = `Forbidden. Check your permissions and user groups. ${
|
||||||
|
body.message || ''
|
||||||
|
}`
|
||||||
|
|
||||||
|
body = JSON.stringify(body)
|
||||||
|
} catch (_) {}
|
||||||
|
|
||||||
|
return Promise.reject({ status: response.status, body })
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const body = await response.text()
|
let body: any = await response.text()
|
||||||
|
|
||||||
if (needsRetry(body)) {
|
if (needsRetry(body)) {
|
||||||
if (retryCount < retryLimit) {
|
if (retryCount < retryLimit) {
|
||||||
@@ -65,6 +80,18 @@ export async function makeRequest<T>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (response.status === 401) {
|
||||||
|
try {
|
||||||
|
body = JSON.parse(body)
|
||||||
|
|
||||||
|
body.message = `Unauthorized request. Check your credentials(client, secret, access token). ${
|
||||||
|
body.message || ''
|
||||||
|
}`
|
||||||
|
|
||||||
|
body = JSON.stringify(body)
|
||||||
|
} catch (_) {}
|
||||||
|
}
|
||||||
|
|
||||||
return Promise.reject({ status: response.status, body })
|
return Promise.reject({ status: response.status, body })
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -104,5 +131,6 @@ export async function makeRequest<T>(
|
|||||||
return responseTransformed
|
return responseTransformed
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return { result, etag }
|
return { result, etag }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,11 +11,11 @@
|
|||||||
"outline": [
|
"outline": [
|
||||||
{
|
{
|
||||||
"SAS Adapter": {
|
"SAS Adapter": {
|
||||||
"SASjs": "classes/reflection-708.reflection-180.sasjs",
|
"SASjs": "classes/reflection-717.reflection-180.sasjs",
|
||||||
"Types": "modules/types"
|
"Types": "modules/types"
|
||||||
},
|
},
|
||||||
"SAS Viya API Client": "classes/reflection-708.reflection-180.sasviyaapiclient",
|
"SAS Viya API Client": "classes/reflection-717.reflection-180.sasviyaapiclient",
|
||||||
"SAS 9 API Client": "classes/reflection-708.reflection-180.sas9apiclient"
|
"SAS 9 API Client": "classes/reflection-717.reflection-180.sas9apiclient"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [
|
||||||
|
|||||||
@@ -1,49 +1,56 @@
|
|||||||
const path = require("path");
|
const path = require('path')
|
||||||
const webpack = require("webpack");
|
const webpack = require('webpack')
|
||||||
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
|
const terserPlugin = require('terser-webpack-plugin')
|
||||||
|
|
||||||
const browserConfig = {
|
const browserConfig = {
|
||||||
entry: "./src/index.ts",
|
entry: './src/index.ts',
|
||||||
devtool: "inline-source-map",
|
devtool: 'inline-source-map',
|
||||||
mode: "development",
|
mode: 'production',
|
||||||
optimization: {
|
optimization: {
|
||||||
minimize: false,
|
minimizer: [
|
||||||
|
new terserPlugin({
|
||||||
|
cache: true,
|
||||||
|
parallel: true,
|
||||||
|
sourceMap: true,
|
||||||
|
terserOptions: {}
|
||||||
|
})
|
||||||
|
]
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
rules: [
|
rules: [
|
||||||
{
|
{
|
||||||
test: /\.ts?$/,
|
test: /\.ts?$/,
|
||||||
use: "ts-loader",
|
use: 'ts-loader',
|
||||||
exclude: /node_modules/,
|
exclude: /node_modules/
|
||||||
},
|
}
|
||||||
],
|
]
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
extensions: [".ts", ".js"],
|
extensions: ['.ts', '.js']
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
filename: "index.js",
|
filename: 'index.js',
|
||||||
path: path.resolve(__dirname, "build"),
|
path: path.resolve(__dirname, 'build'),
|
||||||
libraryTarget: "umd",
|
libraryTarget: 'umd',
|
||||||
library: "SASjs",
|
library: 'SASjs'
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/),
|
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/),
|
||||||
new webpack.SourceMapDevToolPlugin({
|
new webpack.SourceMapDevToolPlugin({
|
||||||
filename: null,
|
filename: null,
|
||||||
exclude: [/node_modules/],
|
exclude: [/node_modules/],
|
||||||
test: /\.ts($|\?)/i,
|
test: /\.ts($|\?)/i
|
||||||
}),
|
})
|
||||||
],
|
]
|
||||||
};
|
}
|
||||||
|
|
||||||
const nodeConfig = {
|
const nodeConfig = {
|
||||||
...browserConfig,
|
...browserConfig,
|
||||||
target: "node",
|
target: 'node',
|
||||||
output: {
|
output: {
|
||||||
...browserConfig.output,
|
...browserConfig.output,
|
||||||
path: path.resolve(__dirname, "build", "node"),
|
path: path.resolve(__dirname, 'build', 'node')
|
||||||
},
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
module.exports = [browserConfig, nodeConfig];
|
module.exports = [browserConfig, nodeConfig]
|
||||||
|
|||||||
Reference in New Issue
Block a user