cordova-plugin-unvired-universal-sdk 1.0.5 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/plugin.xml +1 -13
- package/www/kernel.js +38345 -1239
- package/aar/README.md +0 -3
- package/aar/Unvired_Kernel_Android.aar +0 -0
- package/aar/Unvired_Kernel_HTML5_Android.aar +0 -0
- package/src/android/build.gradle +0 -35
- package/src/android/xml/provider_paths.xml +0 -21
- package/src/browser/UnviredPluginProxy.js +0 -2430
- package/src/browser/bootstrap.min.js +0 -17
- package/src/browser/codemirror.js +0 -9755
- package/src/browser/jquery-3.2.1.js +0 -10253
- package/src/browser/sql-wasm.wasm +0 -0
- package/src/browser/sql.js +0 -203
- package/src/browser/src_index_worker_js.unvired-db-worker.js +0 -231
- package/src/browser/unvired-db-worker.js +0 -166
- package/src/browser/vendors-node_modules_comlink_dist_esm_comlink_mjs.unvired-db-worker.js +0 -22
- package/src/ios/AttachmentPlugin.h +0 -21
- package/src/ios/AttachmentPlugin.m +0 -180
- package/src/ios/DataStructureHelper.h +0 -28
- package/src/ios/DataStructureHelper.m +0 -188
- package/src/ios/IOSAuthPlugin.h +0 -14
- package/src/ios/IOSAuthPlugin.m +0 -13
- package/src/ios/IOSDatabasePlugin.h +0 -28
- package/src/ios/IOSDatabasePlugin.m +0 -253
- package/src/ios/IOSFWSettingsPlugin.h +0 -65
- package/src/ios/IOSFWSettingsPlugin.m +0 -363
- package/src/ios/IOSLoggerPlugin.h +0 -34
- package/src/ios/IOSLoggerPlugin.m +0 -198
- package/src/ios/IOSLoginPlugin.h +0 -29
- package/src/ios/IOSLoginPlugin.m +0 -480
- package/src/ios/IOSProxyPlugin.h +0 -21
- package/src/ios/IOSProxyPlugin.m +0 -172
- package/src/ios/IOSSyncEnginePlugin.h +0 -54
- package/src/ios/IOSSyncEnginePlugin.m +0 -847
- package/src/ios/PluginConstants.h +0 -195
- package/src/ios/PluginHelper.h +0 -29
- package/src/ios/PluginHelper.m +0 -74
- package/src/ios/SyncHTML5Response.h +0 -50
- package/src/ios/SyncHTML5Response.m +0 -68
- package/www/applicationMeta/applicationMetadataParser.ts +0 -285
- package/www/applicationMeta/fieldConstants.ts +0 -92
- package/www/attachment/attachmentHelper.ts +0 -326
- package/www/attachment/attachmentQHelper.ts +0 -158
- package/www/attachment/attachmentService.ts +0 -259
- package/www/authenticationService.ts +0 -751
- package/www/database/appDatabaseManager.ts +0 -54
- package/www/database/databaseManager.ts +0 -616
- package/www/helper/dbCreateTablesManager.ts +0 -354
- package/www/helper/frameworkHelper.ts +0 -127
- package/www/helper/frameworkSettingsManager.ts +0 -287
- package/www/helper/getMessageTimerManager.ts +0 -81
- package/www/helper/httpConnection.ts +0 -1051
- package/www/helper/logger.ts +0 -312
- package/www/helper/notificationListnerHelper.ts +0 -56
- package/www/helper/passcodeGenerator.ts +0 -61
- package/www/helper/reconciler.ts +0 -1062
- package/www/helper/serverResponseHandler.ts +0 -677
- package/www/helper/serviceConstants.ts +0 -254
- package/www/helper/settingsHelper.ts +0 -386
- package/www/helper/status.ts +0 -83
- package/www/helper/syncInputDataManager.ts +0 -205
- package/www/helper/unviredAccount.ts +0 -104
- package/www/helper/unviredAccountManager.ts +0 -120
- package/www/helper/urlService.ts +0 -43
- package/www/helper/userSettingsManager.ts +0 -172
- package/www/helper/utils.ts +0 -110
- package/www/inbox/downloadMessageService.ts +0 -270
- package/www/inbox/inboxHelper.ts +0 -132
- package/www/inbox/inboxService.ts +0 -223
- package/www/outbox/outboxAttachmentManager.ts +0 -152
- package/www/outbox/outboxHelper.ts +0 -67
- package/www/outbox/outboxService.ts +0 -519
- package/www/subtract.ts +0 -5
- package/www/sum.ts +0 -4
- package/www/syncEngine.ts +0 -687
|
@@ -1,1051 +0,0 @@
|
|
|
1
|
-
import { URLService } from './urlService';
|
|
2
|
-
import {isServerReachable, LoginParameters, LoginType} from './utils'
|
|
3
|
-
import * as ServiceConstants from './serviceConstants'
|
|
4
|
-
import PassCodeGenerator from './passcodeGenerator';
|
|
5
|
-
import FrameworkHelper from './frameworkHelper';
|
|
6
|
-
import { Logger } from './logger';
|
|
7
|
-
import { UserSettingsFields, UserSettingsManager } from './userSettingsManager';
|
|
8
|
-
import { FrameworkSettingsFields, FrameworkSettingsManager } from './frameworkSettingsManager';
|
|
9
|
-
import { Status } from './status';
|
|
10
|
-
import { AuthenticationService } from '../authenticationService';
|
|
11
|
-
import { UnviredAccountManager } from './unviredAccountManager';
|
|
12
|
-
import SettingsHelper from './settingsHelper';
|
|
13
|
-
import { Observable, throwError, catchError } from 'rxjs';
|
|
14
|
-
import { UnviredAccount } from './unviredAccount';
|
|
15
|
-
import { NotificationListenerHelper, NotificationListnerType } from './notificationListnerHelper';
|
|
16
|
-
import AttachmentHelper from '../attachment/attachmentHelper';
|
|
17
|
-
|
|
18
|
-
export class FetchAPIResponse {
|
|
19
|
-
header: string | null;
|
|
20
|
-
data: string | null;
|
|
21
|
-
percentage: number | null;
|
|
22
|
-
httpStatusCode: number;
|
|
23
|
-
constructor(httpStatusCode: number, percentage: number | null = null, header: string | null = null, data: string | null = null) {
|
|
24
|
-
this.header = header;
|
|
25
|
-
this.data = data;
|
|
26
|
-
this.percentage = percentage;
|
|
27
|
-
this.httpStatusCode = httpStatusCode;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const fileName = "HTTPConnection"
|
|
33
|
-
|
|
34
|
-
export let jwtAuthToken: string = "";
|
|
35
|
-
export const bearerAuth = (): string => jwtAuthToken.length === 0 ? "" : `Bearer ${jwtAuthToken}`;
|
|
36
|
-
|
|
37
|
-
export class HttpConnection {
|
|
38
|
-
public sessionId = ""
|
|
39
|
-
public async authenticateUser(loginParameters: LoginParameters): Promise<Response> {
|
|
40
|
-
if (!navigator.onLine) {
|
|
41
|
-
Logger.logDebug(fileName, "authenticateUser", "No Internet connection.");
|
|
42
|
-
throw ("No Internet connection. Make sure your device is connected to the network and try again.");
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (!(await isServerReachable(loginParameters.url))) {
|
|
46
|
-
Logger.logDebug(fileName, "authenticateUser", "Server not reachable.");
|
|
47
|
-
throw ("Server not reachable. Make sure your device is connected to the valid network and try again.");
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (loginParameters.url == null || loginParameters.url.length == 0) {
|
|
51
|
-
Logger.logError(fileName, "authenticateUser", "URL is empty.");
|
|
52
|
-
throw ("URL is empty.");
|
|
53
|
-
}
|
|
54
|
-
Logger.logDebug(fileName, "authenticateUser", "Session REST api is called.");
|
|
55
|
-
const authString = `${loginParameters.company}\\${loginParameters.username}:${loginParameters.password}`;
|
|
56
|
-
|
|
57
|
-
if (loginParameters.loginType == LoginType.saml2) {
|
|
58
|
-
jwtAuthToken = loginParameters["jwtToken"];
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
var basicAuth = (loginParameters.loginType == LoginType.saml2) ? bearerAuth() : 'Basic ' + btoa(authString);
|
|
62
|
-
|
|
63
|
-
var baseUrl = URLService.getSessionUrl(loginParameters.url);
|
|
64
|
-
if (loginParameters.loginType == LoginType.passwordless) {
|
|
65
|
-
baseUrl = URLService.getBaseUrl(loginParameters.url);
|
|
66
|
-
baseUrl += `${ServiceConstants.ServiceApplications}/${loginParameters.appName}/${ServiceConstants.ServicePasswordLess}`;
|
|
67
|
-
if (jwtAuthToken.length > 0) {
|
|
68
|
-
baseUrl += `/${jwtAuthToken}?startSession=true`;
|
|
69
|
-
const url = new URL(baseUrl);
|
|
70
|
-
const response = await fetch(url, {
|
|
71
|
-
method: 'GET', // Set the HTTP method to POST
|
|
72
|
-
headers: {
|
|
73
|
-
'Authorization': basicAuth,
|
|
74
|
-
'Access-Control-Allow-Origin': '*',
|
|
75
|
-
'Content-Type': 'application/json',
|
|
76
|
-
'Accept': 'application/json'
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
Logger.logDebug(fileName, "authenticateUser", `Session REST api response code: ${response.status}`);
|
|
80
|
-
return response
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
let body: any = {}
|
|
84
|
-
if (loginParameters.loginType == LoginType.ads || loginParameters.loginType == LoginType.sap) {
|
|
85
|
-
baseUrl += `/${ServiceConstants.ServiceApplications}/${loginParameters.appName}`;
|
|
86
|
-
const url = new URL(baseUrl);
|
|
87
|
-
body = {
|
|
88
|
-
"credentials": JSON.stringify([
|
|
89
|
-
{
|
|
90
|
-
"port": `${loginParameters.port}`,
|
|
91
|
-
"user": `${loginParameters.domain}\\${loginParameters.username}`,
|
|
92
|
-
"password": `${loginParameters.password}`
|
|
93
|
-
}
|
|
94
|
-
])
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
const url = new URL(baseUrl);
|
|
98
|
-
const response = await fetch(url, {
|
|
99
|
-
method: 'POST', // Set the HTTP method to POST
|
|
100
|
-
headers: {
|
|
101
|
-
'Authorization': basicAuth,
|
|
102
|
-
'Access-Control-Allow-Origin': '*',
|
|
103
|
-
'Content-Type': 'application/json',
|
|
104
|
-
'Accept': 'application/json'
|
|
105
|
-
},
|
|
106
|
-
body: JSON.stringify(body),
|
|
107
|
-
});
|
|
108
|
-
Logger.logDebug(fileName, "authenticateUser", `Session REST api response code: ${response.status}`);
|
|
109
|
-
return response
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
public async activateUser(loginParameters: any): Promise<any> {
|
|
113
|
-
if (!navigator.onLine) {
|
|
114
|
-
Logger.logDebug(fileName,"activateUser","No internet connection.");
|
|
115
|
-
throw new Error("No internet connection. Make sure your device is connected to the network and try again.");
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
if (!(await isServerReachable(loginParameters.url))) {
|
|
119
|
-
Logger.logDebug(fileName, "activateUser", "Server not reachable.");
|
|
120
|
-
throw ("Server not reachable. Make sure your device is connected to the valid network and try again.");
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (loginParameters.url == null || loginParameters.url.length == 0) {
|
|
124
|
-
Logger.logError(fileName, "activateUser", "URL is empty.");
|
|
125
|
-
throw new Error("URL is empty.");
|
|
126
|
-
}
|
|
127
|
-
if (loginParameters.loginType !== LoginType.saml2 && loginParameters.feUserId.length == 0) {
|
|
128
|
-
Logger.logError(fileName, "activateUser", "Frontend is not set.");
|
|
129
|
-
throw new Error("Frontend is not set.");
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Make activation call
|
|
133
|
-
Logger.logDebug(fileName,"activateUser","Activation REST api is called.");
|
|
134
|
-
let appUrl = URLService.getApplicationUrl(loginParameters.url);
|
|
135
|
-
appUrl += `/${loginParameters.appName}/${ServiceConstants.ServiceActivate}`;
|
|
136
|
-
if (loginParameters.loginType !== LoginType.saml2) {
|
|
137
|
-
appUrl += `/${loginParameters.feUserId}`;
|
|
138
|
-
} else {
|
|
139
|
-
appUrl += "/saml";
|
|
140
|
-
jwtAuthToken = loginParameters["jwtToken"];
|
|
141
|
-
}
|
|
142
|
-
let queryString = "";
|
|
143
|
-
const postParams = await HttpConnection.getActivatePostParameters(loginParameters);
|
|
144
|
-
Object.entries(postParams).forEach(([key, value]) => {
|
|
145
|
-
queryString += queryString.length === 0 ? "?" : "&";
|
|
146
|
-
queryString += `${key}=${value}`;
|
|
147
|
-
});
|
|
148
|
-
appUrl += queryString;
|
|
149
|
-
|
|
150
|
-
if (loginParameters.loginType !== LoginType.saml2 && !this.sessionId.length) {
|
|
151
|
-
Logger.logError(fileName, "activateUser", "Session is empty. User is not authenticated.");
|
|
152
|
-
throw new Error("User is not authenticated.");
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
const userName = (loginParameters.loginType === LoginType.sap || loginParameters.loginType === LoginType.ads) ? loginParameters.unviredUserName : loginParameters.username;
|
|
156
|
-
const authString = `${loginParameters.company}\\${userName}:${this.sessionId}`
|
|
157
|
-
const basicAuth = loginParameters.loginType !== LoginType.saml2 ? 'Basic ' + btoa(authString) : bearerAuth();
|
|
158
|
-
|
|
159
|
-
const url = new URL(appUrl);
|
|
160
|
-
const activationResponse = await fetch(url, {
|
|
161
|
-
method: "POST",
|
|
162
|
-
headers: { authorization: basicAuth },
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
Logger.logDebug(fileName, "activateUser", `Activation REST api response code: ${activationResponse.status}`)
|
|
166
|
-
return activationResponse;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
public async getJwtToken(loginParameters: any): Promise<any> {
|
|
170
|
-
if (!navigator.onLine) {
|
|
171
|
-
Logger.logDebug(fileName,"getJwtToken","No internet connection.");
|
|
172
|
-
throw new Error("No internet connection. Make sure your device is connected to the network and try again.");
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
if (!(await isServerReachable(loginParameters.url))) {
|
|
176
|
-
Logger.logDebug(fileName, "getJwtToken", "Server not reachable.");
|
|
177
|
-
throw ("Server not reachable. Make sure your device is connected to the valid network and try again.");
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
if (loginParameters.url == null || loginParameters.url.length == 0) {
|
|
181
|
-
Logger.logError(fileName, "getJwtToken", "URL is empty.");
|
|
182
|
-
throw new Error("URL is empty.");
|
|
183
|
-
}
|
|
184
|
-
if (loginParameters.feUserId == null || loginParameters.feUserId.length == 0) {
|
|
185
|
-
Logger.logError(fileName, "activateUser", "Frontend is not set.");
|
|
186
|
-
throw new Error("Frontend is not set.");
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// Make get JWT Token call
|
|
190
|
-
Logger.logDebug(fileName, "getJwtToken", "Get JWT Token REST api is called.");
|
|
191
|
-
|
|
192
|
-
let unviredAccountPassword = loginParameters.password;
|
|
193
|
-
if (!unviredAccountPassword) {
|
|
194
|
-
unviredAccountPassword = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.unviredPassword);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
const oneTimeToken = await this.getOnetimeTokenFromFWSettingsManager();
|
|
198
|
-
const oneTimeTokenString = oneTimeToken ? `&${oneTimeToken}` : "";
|
|
199
|
-
|
|
200
|
-
const appBaseUrl = URLService.getApplicationUrl(loginParameters.url);
|
|
201
|
-
const appName = loginParameters.appName;
|
|
202
|
-
const appUrl = `${appBaseUrl}/${appName}/${ServiceConstants.ServiceSession}?${ServiceConstants.QueryParamFrontendUser}=${loginParameters.feUserId}${oneTimeTokenString}`;
|
|
203
|
-
|
|
204
|
-
var userName = loginParameters.username;
|
|
205
|
-
if (loginParameters.loginType === LoginType.sap || loginParameters.loginType === LoginType.ads) {
|
|
206
|
-
if (loginParameters.unviredUserName == null || loginParameters.unviredUserName.length === 0) {
|
|
207
|
-
AuthenticationService.instance.loginParameters.unviredUserName = await FrameworkSettingsManager.getInstance().getFieldValue(FrameworkSettingsFields.unviredUser);
|
|
208
|
-
loginParameters.unviredUserName = AuthenticationService.instance.loginParameters.unviredUserName
|
|
209
|
-
}
|
|
210
|
-
userName = loginParameters.unviredUserName;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
let password: string;
|
|
214
|
-
switch (loginParameters.loginType) {
|
|
215
|
-
case LoginType.passwordless:
|
|
216
|
-
const md5UnviredPwd = await FrameworkSettingsManager.getInstance().getFieldValue(FrameworkSettingsFields.md5Pwd);
|
|
217
|
-
password = md5UnviredPwd != null && md5UnviredPwd.length > 0 ? md5UnviredPwd : unviredAccountPassword;
|
|
218
|
-
break;
|
|
219
|
-
default:
|
|
220
|
-
password = unviredAccountPassword;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
let basicAuth = "";
|
|
224
|
-
let body: any = {};
|
|
225
|
-
switch (loginParameters.loginType) {
|
|
226
|
-
case LoginType.ads:
|
|
227
|
-
case LoginType.sap:
|
|
228
|
-
{
|
|
229
|
-
const inp = `${loginParameters.company}\\${loginParameters.domain}\\${userName}:${password}`;
|
|
230
|
-
basicAuth = 'Basic ' + btoa(inp);
|
|
231
|
-
body = {
|
|
232
|
-
credentials: JSON.stringify([
|
|
233
|
-
{
|
|
234
|
-
port: `${loginParameters.port}`,
|
|
235
|
-
user: `${loginParameters.domain}\\${userName}`,
|
|
236
|
-
password: `${password}`,
|
|
237
|
-
},
|
|
238
|
-
]),
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
break;
|
|
242
|
-
case LoginType.saml2:
|
|
243
|
-
{
|
|
244
|
-
basicAuth = bearerAuth();
|
|
245
|
-
}
|
|
246
|
-
break;
|
|
247
|
-
default:
|
|
248
|
-
{
|
|
249
|
-
basicAuth = 'Basic ' + btoa(`${loginParameters.company}\\${userName}:${password}`);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
const url = new URL(appUrl);
|
|
254
|
-
const jwtResponse = await fetch(url, {
|
|
255
|
-
method: "POST",
|
|
256
|
-
headers: {
|
|
257
|
-
authorization: basicAuth,
|
|
258
|
-
Accept: "application/json",
|
|
259
|
-
},
|
|
260
|
-
body: JSON.stringify(body),
|
|
261
|
-
});
|
|
262
|
-
const tempJwtResponse = jwtResponse.clone();
|
|
263
|
-
Logger.logDebug(fileName, "getJwtToken", `Activation REST api response code: ${jwtResponse.status}`);
|
|
264
|
-
const jwtResponseObject = JSON.parse(await tempJwtResponse.text());
|
|
265
|
-
if (jwtResponse.status === Status.created) {
|
|
266
|
-
jwtAuthToken = jwtResponseObject[ServiceConstants.KeyToken];
|
|
267
|
-
NotificationListenerHelper.postDataSenderNotification(jwtAuthToken, NotificationListnerType.jwtTokenUpdated);
|
|
268
|
-
} else if (jwtResponse.status === Status.unauthorized) {
|
|
269
|
-
NotificationListenerHelper.postDataSenderNotification(null, NotificationListnerType.jwtTokenExpired);
|
|
270
|
-
// TODO: Need to check if the clear data is required.
|
|
271
|
-
AuthenticationService.instance.clearData();
|
|
272
|
-
}
|
|
273
|
-
return jwtResponse;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
public async getJSONFromFile(filePath: string): Promise<string> {
|
|
277
|
-
try {
|
|
278
|
-
const response = await fetch(filePath.replace("./assets/", "assets/"), {
|
|
279
|
-
method: 'GET', // Set the HTTP method to POST
|
|
280
|
-
headers: {
|
|
281
|
-
'Access-Control-Allow-Origin': '*',
|
|
282
|
-
'Content-Type': 'application/json',
|
|
283
|
-
'Accept': 'application/json'
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
const data = await response.json();
|
|
287
|
-
return JSON.stringify(data);
|
|
288
|
-
} catch (e) {
|
|
289
|
-
Logger.logError(fileName, "getJSONFromFile", `Error fetching file: ${e}`);
|
|
290
|
-
return "";
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
public makeSyncCallWithObservable(bodyData: string, paName: string): Observable<FetchAPIResponse> {
|
|
295
|
-
return new Observable(observer => {
|
|
296
|
-
async () => {
|
|
297
|
-
let account = UnviredAccountManager.getInstance().getLastLoggedInAccount();
|
|
298
|
-
let appName = AuthenticationService.instance.loginParameters.appName;
|
|
299
|
-
|
|
300
|
-
if (!jwtAuthToken) {
|
|
301
|
-
await Logger.logInfo(fileName, "makeSyncCallWithObservable", "Reading JWT token from database...");
|
|
302
|
-
jwtAuthToken = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.jwtToken);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// if (!jwtAuthToken) {
|
|
306
|
-
// await Logger.logError(fileName, "makeSyncCallWithObservable", "token not available. Refreshing token...");
|
|
307
|
-
// await this.getJwtToken(AuthenticationService.instance.loginParameters);
|
|
308
|
-
// }
|
|
309
|
-
|
|
310
|
-
if (!jwtAuthToken) {
|
|
311
|
-
await Logger.logError(fileName, "makeSyncCallWithObservable", "Token not available.");
|
|
312
|
-
observer.error("Token not available.");
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
if (!account) {
|
|
317
|
-
await Logger.logError(fileName, "makeSyncCallWithObservable", "Account data not available.");
|
|
318
|
-
observer.error("Account data not available.");
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
const appBaseUrl = URLService.getApplicationUrl(AuthenticationService.instance.loginParameters.url);
|
|
323
|
-
const appUrl = `${appBaseUrl}/${appName}/${ServiceConstants.ServiceExecute}/${paName}`;
|
|
324
|
-
const url = new URL(appUrl);
|
|
325
|
-
// const inputObj = JSON.parse(bodyData);
|
|
326
|
-
const headers: HeadersInit = {
|
|
327
|
-
'Authorization': bearerAuth(),
|
|
328
|
-
'Content-Type': "application/x-www-form-urlencoded",
|
|
329
|
-
"Accept": "text/event-stream"
|
|
330
|
-
};
|
|
331
|
-
this.downloadWithStream(url.toString(), bodyData, headers).subscribe(async(response: FetchAPIResponse) => {
|
|
332
|
-
if (response.httpStatusCode === Status.unauthorized) {
|
|
333
|
-
NotificationListenerHelper.postDataSenderNotification(null, NotificationListnerType.jwtTokenExpired);
|
|
334
|
-
// AuthenticationService.instance.loginParameters.password = await FrameworkSettingsManager.getInstance().getFieldValue(FrameworkSettingsFields.md5Pwd);
|
|
335
|
-
// await this.getJwtToken(AuthenticationService.instance.loginParameters);
|
|
336
|
-
// if (jwtAuthToken) {
|
|
337
|
-
// this.makeSyncCallWithObservable(bodyData, paName).subscribe(async(response: FetchAPIResponse) => {
|
|
338
|
-
// observer.next(response);
|
|
339
|
-
// observer.complete();
|
|
340
|
-
// });
|
|
341
|
-
// }
|
|
342
|
-
}
|
|
343
|
-
observer.next(response);
|
|
344
|
-
Logger.logInfo("HTTPConnection", "makeSyncCallWithObservable", `Event percentage: ${response.percentage}`);
|
|
345
|
-
if (response.percentage == null || response.percentage == 100) {
|
|
346
|
-
Logger.logDebug("HTTPConnection", "makeSyncCall", `Event header: ${response.header}`);
|
|
347
|
-
Logger.logDebug("HTTPConnection", "makeSyncCall", `Event data: ${response.data}`);
|
|
348
|
-
const headers = JSON.parse(response.header);
|
|
349
|
-
const jwtToken = headers[ServiceConstants.KeyJwtToken];
|
|
350
|
-
await this.updateJwtToken(jwtToken);
|
|
351
|
-
observer.complete();
|
|
352
|
-
}
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
})
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
public async makeSyncCall(bodyData: string, paName: string, account: UnviredAccount, loginParameters: any): Promise<FetchAPIResponse> {
|
|
359
|
-
return new Promise(async (resolve, reject) => {
|
|
360
|
-
let appName = loginParameters.appName;
|
|
361
|
-
|
|
362
|
-
if (!jwtAuthToken) {
|
|
363
|
-
await Logger.logInfo(fileName, "makeSyncCall", "Reading JWT token from database...");
|
|
364
|
-
jwtAuthToken = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.jwtToken);
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
// if (!jwtAuthToken) {
|
|
368
|
-
// await Logger.logError(fileName, "makeSyncCall", "token not available. Refreshing token...");
|
|
369
|
-
// await this.getJwtToken(AuthenticationService.instance.loginParameters);
|
|
370
|
-
// }
|
|
371
|
-
|
|
372
|
-
if (!jwtAuthToken) {
|
|
373
|
-
await Logger.logError(fileName, "makeSyncCall", "Token not available.");
|
|
374
|
-
reject("Token not available.");
|
|
375
|
-
return;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
if (!account) {
|
|
379
|
-
await Logger.logError(fileName, "makeSyncCall", "Account data not available.");
|
|
380
|
-
reject("Account data not available.");
|
|
381
|
-
return;
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
const appBaseUrl = URLService.getApplicationUrl(AuthenticationService.instance.loginParameters.url);
|
|
385
|
-
const appUrl = `${appBaseUrl}/${appName}/${ServiceConstants.ServiceExecute}/${paName}`;
|
|
386
|
-
const url = new URL(appUrl);
|
|
387
|
-
const inputObj = JSON.parse(bodyData);
|
|
388
|
-
|
|
389
|
-
const urlencodedBody = new URLSearchParams(inputObj).toString();
|
|
390
|
-
const headers: HeadersInit = {
|
|
391
|
-
'Authorization': bearerAuth(),
|
|
392
|
-
'Content-Type': "application/x-www-form-urlencoded",
|
|
393
|
-
"Accept": "application/json"
|
|
394
|
-
};
|
|
395
|
-
|
|
396
|
-
// GZip compression
|
|
397
|
-
// const frameworkSettingsManager = FrameworkSettingsManager.getInstance();
|
|
398
|
-
// const compressPostData = await frameworkSettingsManager.getFieldValue(FrameworkSettingsFields.compressPostData);
|
|
399
|
-
// if (compressPostData === 'yes') {
|
|
400
|
-
// headers['Content-Encoding'] = "gzip";
|
|
401
|
-
// }
|
|
402
|
-
|
|
403
|
-
// this.downloadWithStream(url.toString(), JSON.stringify(inputObj), headers).subscribe(async(response: FetchAPIResponse) => {
|
|
404
|
-
// if (response.httpStatusCode === Status.unauthorized) {
|
|
405
|
-
// NotificationListenerHelper.postDataSenderNotification(null, NotificationListnerType.jwtTokenExpired);
|
|
406
|
-
// AuthenticationService.instance.loginParameters.password = await FrameworkSettingsManager.getInstance().getFieldValue(FrameworkSettingsFields.md5Pwd);
|
|
407
|
-
// await this.getJwtToken(AuthenticationService.instance.loginParameters);
|
|
408
|
-
// if (jwtAuthToken) {
|
|
409
|
-
// const resp = await this.makeSyncCall(bodyData, paName);
|
|
410
|
-
// resolve(resp)
|
|
411
|
-
// return;
|
|
412
|
-
// }
|
|
413
|
-
// }
|
|
414
|
-
// Logger.logInfo("HTTPConnection", "makeSyncCall", `Event percentage: ${response.percentage}`);
|
|
415
|
-
// if (response.percentage == null || response.percentage == 100) {
|
|
416
|
-
// Logger.logDebug("HTTPConnection", "makeSyncCall", `Event header: ${response.header}`);
|
|
417
|
-
// Logger.logDebug("HTTPConnection", "makeSyncCall", `Event data: ${response.data}`);
|
|
418
|
-
// const headers = JSON.parse(response.header);
|
|
419
|
-
// const jwtToken = headers[ServiceConstants.KeyJwtToken];
|
|
420
|
-
// await this.updateJwtToken(jwtToken);
|
|
421
|
-
// resolve(response);
|
|
422
|
-
// return;
|
|
423
|
-
// }
|
|
424
|
-
// });
|
|
425
|
-
|
|
426
|
-
const timeoutInSeconds = (await SettingsHelper.getRequestTimeout()) * 60 || ServiceConstants.DefaultHttpTimeout;
|
|
427
|
-
const controller = new AbortController();
|
|
428
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutInSeconds * 1000);
|
|
429
|
-
|
|
430
|
-
try {
|
|
431
|
-
const syncResponse = await fetch(url.toString(), {
|
|
432
|
-
method: 'POST',
|
|
433
|
-
headers: headers,
|
|
434
|
-
body: urlencodedBody,
|
|
435
|
-
signal: controller.signal
|
|
436
|
-
});
|
|
437
|
-
clearTimeout(timeoutId);
|
|
438
|
-
const jwtToken = syncResponse.headers.get(ServiceConstants.KeyJwtToken);
|
|
439
|
-
await this.updateJwtToken(jwtToken);
|
|
440
|
-
if (syncResponse.status === Status.unauthorized) {
|
|
441
|
-
NotificationListenerHelper.postDataSenderNotification(null, NotificationListnerType.jwtTokenExpired);
|
|
442
|
-
// AuthenticationService.instance.loginParameters.password = await FrameworkSettingsManager.getInstance().getFieldValue(FrameworkSettingsFields.md5Pwd);
|
|
443
|
-
// await this.getJwtToken(AuthenticationService.instance.loginParameters);
|
|
444
|
-
// if (jwtAuthToken) {
|
|
445
|
-
// return await this.makeSyncCall(bodyData, paName, account, loginParameters);
|
|
446
|
-
// }
|
|
447
|
-
}
|
|
448
|
-
let dataObj = {}
|
|
449
|
-
if (syncResponse.status != Status.noContent) {
|
|
450
|
-
dataObj = await syncResponse.json()
|
|
451
|
-
}
|
|
452
|
-
const headerJson:any = {}
|
|
453
|
-
syncResponse.headers.forEach((value, key) => {
|
|
454
|
-
headerJson[key] = value;
|
|
455
|
-
});
|
|
456
|
-
const response = new FetchAPIResponse(syncResponse.status, 100, JSON.stringify(headerJson), JSON.stringify(dataObj));
|
|
457
|
-
resolve(response);
|
|
458
|
-
} catch (error) {
|
|
459
|
-
if (error.name === 'AbortError') {
|
|
460
|
-
await Logger.logError("HTTPConnection", "makeSyncCall", "Request timed out. Error: " + error);
|
|
461
|
-
} else {
|
|
462
|
-
await Logger.logError("HTTPConnection", "makeSyncCall", "Error while making sync call. Error: " + error);
|
|
463
|
-
}
|
|
464
|
-
reject(error);
|
|
465
|
-
}
|
|
466
|
-
});
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
public async uploadAttachment(attachmentItem: any): Promise<Response> {
|
|
470
|
-
const account = UnviredAccountManager.getInstance().getLastLoggedInAccount();
|
|
471
|
-
if (!account) {
|
|
472
|
-
Logger.logError("HTTPConnection", "uploadAttachment", "Account data not available.");
|
|
473
|
-
throw new Error("Account data not available.");
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
if (!jwtAuthToken) {
|
|
477
|
-
await Logger.logInfo(fileName, "uploadAttachment", "Reading JWT token from database...");
|
|
478
|
-
jwtAuthToken = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.jwtToken);
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
// if (!jwtAuthToken) {
|
|
482
|
-
// Logger.logError("HTTPConnection", "uploadAttachment", "Token not available. Refreshing token...");
|
|
483
|
-
// await this.getJwtToken(AuthenticationService.instance.loginParameters);
|
|
484
|
-
// }
|
|
485
|
-
|
|
486
|
-
if (!jwtAuthToken) {
|
|
487
|
-
Logger.logError("HTTPConnection", "uploadAttachment", "Token not available.");
|
|
488
|
-
throw new Error("Token not available.");
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
const gUid = attachmentItem[ServiceConstants.AttachmentItemFieldUid];
|
|
492
|
-
const filePath = `${attachmentItem[ServiceConstants.AttachmentItemFieldLocalPath]}`;
|
|
493
|
-
|
|
494
|
-
const appBaseUrl = URLService.getApplicationUrl(account.getServerURL());
|
|
495
|
-
const appUrl = `${appBaseUrl}/${AuthenticationService.instance.loginParameters.appName}/${ServiceConstants.ServiceAttachments}/${gUid}`;
|
|
496
|
-
const url = new URL(appUrl);
|
|
497
|
-
|
|
498
|
-
let attachmentFileName = attachmentItem[ServiceConstants.AttachmentItemFieldFileName];
|
|
499
|
-
if (!attachmentFileName) {
|
|
500
|
-
attachmentFileName = filePath.split("/").pop()!;
|
|
501
|
-
}
|
|
502
|
-
console.log("~~~attachmentFileName", attachmentFileName);
|
|
503
|
-
let attachmentData = null;
|
|
504
|
-
try {
|
|
505
|
-
attachmentData = await AttachmentHelper.getAttachment(attachmentFileName)
|
|
506
|
-
Logger.logDebug("HTTPConnection", "uploadAttachment", `Attachment data size: ${attachmentData?.byteLength || 0} bytes`);
|
|
507
|
-
} catch (error) {
|
|
508
|
-
Logger.logError("HTTPConnection", "uploadAttachment", `Error getting attachment: ${JSON.stringify(error)}`);
|
|
509
|
-
throw error;
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
// Create blob from attachment data
|
|
513
|
-
const blob = new Blob([attachmentData], { type: 'application/octet-stream' });
|
|
514
|
-
Logger.logDebug("HTTPConnection", "uploadAttachment", `Blob size: ${blob.size} bytes, type: ${blob.type}`);
|
|
515
|
-
|
|
516
|
-
// Create FormData with proper multipart handling
|
|
517
|
-
const formData = new FormData();
|
|
518
|
-
formData.append("file", blob, attachmentFileName); // Use blob directly with filename
|
|
519
|
-
|
|
520
|
-
const headers: HeadersInit = {
|
|
521
|
-
'Authorization': bearerAuth()
|
|
522
|
-
};
|
|
523
|
-
|
|
524
|
-
const timeoutInSeconds = (await SettingsHelper.getRequestTimeout()) * 60 || ServiceConstants.DefaultHttpTimeout;
|
|
525
|
-
const controller = new AbortController();
|
|
526
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutInSeconds * 1000);
|
|
527
|
-
|
|
528
|
-
try {
|
|
529
|
-
const response = await fetch(url.toString(), {
|
|
530
|
-
method: 'POST',
|
|
531
|
-
headers: headers,
|
|
532
|
-
body: formData,
|
|
533
|
-
signal: controller.signal
|
|
534
|
-
});
|
|
535
|
-
clearTimeout(timeoutId);
|
|
536
|
-
|
|
537
|
-
Logger.logDebug("HTTPConnection", "uploadAttachment", `Response status: ${response.status}`);
|
|
538
|
-
const responseHeaders: Record<string, string> = {};
|
|
539
|
-
response.headers.forEach((value, key) => {
|
|
540
|
-
responseHeaders[key] = value;
|
|
541
|
-
});
|
|
542
|
-
Logger.logDebug("HTTPConnection", "uploadAttachment", `Response headers: ${JSON.stringify(responseHeaders)}`);
|
|
543
|
-
|
|
544
|
-
if (!response.ok) {
|
|
545
|
-
const errorText = await response.text();
|
|
546
|
-
Logger.logError("HTTPConnection", "uploadAttachment", `Error response: ${errorText}`);
|
|
547
|
-
throw new Error(`Upload failed with status ${response.status}: ${errorText}`);
|
|
548
|
-
}
|
|
549
|
-
return response;
|
|
550
|
-
} catch (error) {
|
|
551
|
-
if (error.name === 'AbortError') {
|
|
552
|
-
Logger.logError("HTTPConnection", "uploadAttachment", "Request timed out. Error: " + JSON.stringify(error));
|
|
553
|
-
} else {
|
|
554
|
-
Logger.logError("HTTPConnection", "uploadAttachment", `Error: ${JSON.stringify(error)}`);
|
|
555
|
-
}
|
|
556
|
-
throw error;
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
public static async makeAdminServicesCall(inputData: string, paName: string, account: UnviredAccount, loginParameters: any): Promise<Response> {
|
|
561
|
-
await Logger.logInfo("HTTPConnection", "makeAdminServicesCall", "Calling admin services...");
|
|
562
|
-
|
|
563
|
-
if (!navigator.onLine) {
|
|
564
|
-
await Logger.logInfo("HTTPConnection", "makeAdminServicesCall", "No Internet connection.");
|
|
565
|
-
throw new Error("No Internet connection. Make sure your device is connected to the network and try again.");
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
if (account == null) {
|
|
569
|
-
await Logger.logError("HTTPConnection", "makeAdminServicesCall", "No last logged in account found.");
|
|
570
|
-
throw new Error("Account data not available.");
|
|
571
|
-
}
|
|
572
|
-
let appName = loginParameters.appName
|
|
573
|
-
|
|
574
|
-
if (!jwtAuthToken) {
|
|
575
|
-
await Logger.logInfo(fileName, "makeAdminServicesCall", "Reading JWT token from database...");
|
|
576
|
-
jwtAuthToken = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.jwtToken);
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
// if (!jwtAuthToken) {
|
|
580
|
-
// await Logger.logError("HTTPConnection", "makeAdminServicesCall", "Token not available. Refreshing token...");
|
|
581
|
-
// await new HttpConnection().getJwtToken(loginParameters);
|
|
582
|
-
// }
|
|
583
|
-
|
|
584
|
-
if (!jwtAuthToken) {
|
|
585
|
-
await Logger.logError("HTTPConnection", "makeAdminServicesCall", "Token not available.");
|
|
586
|
-
throw new Error("Token not available.");
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
const appBaseUrl = URLService.getApplicationUrl(account.getServerURL());
|
|
590
|
-
let queryString = "";
|
|
591
|
-
const postParams = await HttpConnection.getCommonPostParameters();
|
|
592
|
-
for (const [k, v] of Object.entries(postParams)) {
|
|
593
|
-
queryString += (queryString.length > 0 ? "&" : "") + `${k}=${v}`;
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
const appUrl = `${appBaseUrl}/${appName}/${ServiceConstants.ServiceAdminServices}/${paName}?${queryString}`;
|
|
597
|
-
const url = new URL(appUrl);
|
|
598
|
-
const inputObj = JSON.parse(inputData);
|
|
599
|
-
inputObj[ServiceConstants.QueryParamFrontendUser] = account.getFeUserId();
|
|
600
|
-
|
|
601
|
-
const timeoutInSeconds = (await SettingsHelper.getRequestTimeout()) * 60 || ServiceConstants.DefaultHttpTimeout;
|
|
602
|
-
const controller = new AbortController();
|
|
603
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutInSeconds * 1000);
|
|
604
|
-
|
|
605
|
-
try {
|
|
606
|
-
const syncResponse = await fetch(url.toString(), {
|
|
607
|
-
method: 'POST',
|
|
608
|
-
headers: {
|
|
609
|
-
'Authorization': bearerAuth(),
|
|
610
|
-
'Content-Type': "application/x-www-form-urlencoded",
|
|
611
|
-
"Accept": "application/json"
|
|
612
|
-
},
|
|
613
|
-
body: JSON.stringify(inputObj),
|
|
614
|
-
signal: controller.signal
|
|
615
|
-
});
|
|
616
|
-
|
|
617
|
-
clearTimeout(timeoutId);
|
|
618
|
-
|
|
619
|
-
const jwtToken = syncResponse.headers.get(ServiceConstants.KeyJwtToken);
|
|
620
|
-
await (new HttpConnection()).updateJwtToken(jwtToken);
|
|
621
|
-
|
|
622
|
-
return syncResponse;
|
|
623
|
-
} catch (error) {
|
|
624
|
-
if (error.name === 'AbortError') {
|
|
625
|
-
await Logger.logError("HTTPConnection", "makeAdminServicesCall", "Request timed out. Error: " + JSON.stringify(error));
|
|
626
|
-
} else {
|
|
627
|
-
await Logger.logError("HTTPConnection", "makeAdminServicesCall", "Error while pinging to server. Error: " + JSON.stringify(error));
|
|
628
|
-
}
|
|
629
|
-
throw error;
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
public async downloadMessage(account: UnviredAccount, loginParameters: any): Promise<FetchAPIResponse> {
|
|
634
|
-
return new Promise(async (resolve, reject) => {
|
|
635
|
-
let appName = loginParameters.appName;
|
|
636
|
-
|
|
637
|
-
if (!jwtAuthToken) {
|
|
638
|
-
await Logger.logInfo(fileName, "downloadMessage", "Reading JWT token from database...");
|
|
639
|
-
jwtAuthToken = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.jwtToken);
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
// if (!jwtAuthToken) {
|
|
643
|
-
// await Logger.logError(fileName, "downloadMessage", "token not available. Refreshing token...");
|
|
644
|
-
// await this.getJwtToken(AuthenticationService.instance.loginParameters);
|
|
645
|
-
// }
|
|
646
|
-
|
|
647
|
-
if (!jwtAuthToken) {
|
|
648
|
-
await Logger.logError(fileName, "downloadMessage", "Token not available.");
|
|
649
|
-
reject("Token not available.");
|
|
650
|
-
return;
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
if (!account) {
|
|
654
|
-
await Logger.logError(fileName, "downloadMessage", "Account data not available.");
|
|
655
|
-
reject("Account data not available.");
|
|
656
|
-
return;
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
const appBaseUrl = URLService.getApplicationUrl(AuthenticationService.instance.loginParameters.url);
|
|
660
|
-
const oneTimeToken = await this.getOnetimeTokenFromFWSettingsManager();
|
|
661
|
-
const tokenQuery = oneTimeToken ? `?${oneTimeToken}` : '';
|
|
662
|
-
const appUrl = `${appBaseUrl}/${appName}/${ServiceConstants.ServiceMessage}/${account.getFeUserId()}${tokenQuery}`;
|
|
663
|
-
const url = new URL(appUrl);
|
|
664
|
-
const headers: HeadersInit = {
|
|
665
|
-
'Authorization': bearerAuth(),
|
|
666
|
-
'Content-Type': "application/x-www-form-urlencoded",
|
|
667
|
-
"Accept": "application/json"
|
|
668
|
-
};
|
|
669
|
-
|
|
670
|
-
const timeoutInSeconds = (await SettingsHelper.getRequestTimeout()) * 60 || ServiceConstants.DefaultHttpTimeout;
|
|
671
|
-
const controller = new AbortController();
|
|
672
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutInSeconds * 1000);
|
|
673
|
-
|
|
674
|
-
try {
|
|
675
|
-
const downloadResponse = await fetch(url.toString(), {
|
|
676
|
-
method: 'GET',
|
|
677
|
-
headers: headers,
|
|
678
|
-
signal: controller.signal
|
|
679
|
-
});
|
|
680
|
-
clearTimeout(timeoutId);
|
|
681
|
-
const jwtToken = downloadResponse.headers.get(ServiceConstants.KeyJwtToken);
|
|
682
|
-
await this.updateJwtToken(jwtToken);
|
|
683
|
-
if (downloadResponse.status === Status.unauthorized) {
|
|
684
|
-
NotificationListenerHelper.postDataSenderNotification(null, NotificationListnerType.jwtTokenExpired);
|
|
685
|
-
// AuthenticationService.instance.loginParameters.password = await FrameworkSettingsManager.getInstance().getFieldValue(FrameworkSettingsFields.md5Pwd);
|
|
686
|
-
// await this.getJwtToken(AuthenticationService.instance.loginParameters);
|
|
687
|
-
// if (jwtAuthToken) {
|
|
688
|
-
// return await this.downloadMessage(account, loginParameters);
|
|
689
|
-
// }
|
|
690
|
-
}
|
|
691
|
-
var dataObj:any = {}
|
|
692
|
-
const headerJson:any = {}
|
|
693
|
-
downloadResponse.headers.forEach((value, key) => {
|
|
694
|
-
headerJson[key] = value;
|
|
695
|
-
});
|
|
696
|
-
if (downloadResponse.status != Status.noContent) {
|
|
697
|
-
dataObj = await downloadResponse.json()
|
|
698
|
-
}
|
|
699
|
-
const response = new FetchAPIResponse(downloadResponse.status, 100, JSON.stringify(headerJson), JSON.stringify(dataObj));
|
|
700
|
-
resolve(response);
|
|
701
|
-
} catch (error) {
|
|
702
|
-
if (error.name === 'AbortError') {
|
|
703
|
-
await Logger.logError("HTTPConnection", "makeSyncCall", "Request timed out. Error: " + JSON.stringify(error));
|
|
704
|
-
} else {
|
|
705
|
-
await Logger.logError("HTTPConnection", "makeSyncCall", "Error while downloading messages from server. Error: " + JSON.stringify(error));
|
|
706
|
-
}
|
|
707
|
-
reject(error);
|
|
708
|
-
}
|
|
709
|
-
});
|
|
710
|
-
}
|
|
711
|
-
|
|
712
|
-
public async acknowledgeMessageService(convId: string): Promise<Response> {
|
|
713
|
-
|
|
714
|
-
if (!navigator.onLine) {
|
|
715
|
-
await Logger.logDebug(fileName, "acknowledgeMessageService", "No Internet connection.");
|
|
716
|
-
throw new Error("No Internet connection. Make sure your device is connected to the network and try again.");
|
|
717
|
-
}
|
|
718
|
-
|
|
719
|
-
const account = UnviredAccountManager.getInstance().getLastLoggedInAccount();
|
|
720
|
-
let appName = AuthenticationService.instance.loginParameters.appName;
|
|
721
|
-
|
|
722
|
-
if (!account) {
|
|
723
|
-
await Logger.logError(fileName, "acknowledgeMessageService", "Account data not available.");
|
|
724
|
-
throw new Error("Account data not available.");
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
if (!account.getServerURL()) {
|
|
728
|
-
await Logger.logError(fileName, "acknowledgeMessageService", "URL is empty.");
|
|
729
|
-
throw new Error("URL is empty.");
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
if (!jwtAuthToken) {
|
|
733
|
-
await Logger.logInfo(fileName, "acknowledgeMessageService", "Reading JWT token from database...");
|
|
734
|
-
jwtAuthToken = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.jwtToken);
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
// if (!jwtAuthToken) {
|
|
738
|
-
// await Logger.logError(fileName, "acknowledgeMessageService",
|
|
739
|
-
// "Token not available. Refreshing token...");
|
|
740
|
-
// await this.getJwtToken(AuthenticationService.instance.loginParameters);
|
|
741
|
-
// }
|
|
742
|
-
|
|
743
|
-
if (!jwtAuthToken) {
|
|
744
|
-
await Logger.logError(fileName, "acknowledgeMessageService",
|
|
745
|
-
"Token not available.");
|
|
746
|
-
throw new Error("Token not available.");
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
const oneTimeToken = await this.getOnetimeTokenFromFWSettingsManager();
|
|
750
|
-
const tokenQuery = oneTimeToken ? `?${oneTimeToken}` : '';
|
|
751
|
-
const appBaseUrl = URLService.getBaseUrl(account.getServerURL());
|
|
752
|
-
const appUrl =
|
|
753
|
-
`${appBaseUrl}${ServiceConstants.ServiceMessages}/${ServiceConstants.ServiceFrontendUsers}/${account.getFeUserId()}/${ServiceConstants.ServiceConversation}/${convId}${tokenQuery}`;
|
|
754
|
-
|
|
755
|
-
await Logger.logDebug(fileName, "acknowledgeMessageService",
|
|
756
|
-
"Acknowledge message api is called.");
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
const timeoutInSeconds = (await SettingsHelper.getRequestTimeout()) * 60 || ServiceConstants.DefaultHttpTimeout;
|
|
760
|
-
const controller = new AbortController();
|
|
761
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutInSeconds * 1000);
|
|
762
|
-
|
|
763
|
-
try {
|
|
764
|
-
|
|
765
|
-
const response = await fetch(appUrl, {
|
|
766
|
-
method: 'DELETE',
|
|
767
|
-
headers: {
|
|
768
|
-
'authorization': bearerAuth()
|
|
769
|
-
},
|
|
770
|
-
signal: controller.signal
|
|
771
|
-
});
|
|
772
|
-
|
|
773
|
-
clearTimeout(timeoutId);
|
|
774
|
-
|
|
775
|
-
await Logger.logDebug(fileName, "acknowledgeMessageService",
|
|
776
|
-
`Acknowledge message api response code: ${response.status}`);
|
|
777
|
-
|
|
778
|
-
return response;
|
|
779
|
-
} catch (error) {
|
|
780
|
-
await Logger.logError(fileName, "acknowledgeMessageService",
|
|
781
|
-
`Error: ${JSON.stringify(error)}`);
|
|
782
|
-
throw error;
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
public async downloadAttachment(attachmentUid: string): Promise<Response> {
|
|
787
|
-
await Logger.logDebug("HTTPConnection", "downloadAttachment",
|
|
788
|
-
`Processing UID : ${attachmentUid}`);
|
|
789
|
-
|
|
790
|
-
const account = UnviredAccountManager.getInstance().getLastLoggedInAccount();
|
|
791
|
-
let appName = AuthenticationService.instance.loginParameters.appName;
|
|
792
|
-
|
|
793
|
-
if (account === null) {
|
|
794
|
-
await Logger.logError("HTTPConnection", "downloadAttachment",
|
|
795
|
-
"Account data not available.");
|
|
796
|
-
throw new Error("Account data not available.");
|
|
797
|
-
}
|
|
798
|
-
|
|
799
|
-
if (!jwtAuthToken) {
|
|
800
|
-
await Logger.logInfo(fileName, "downloadAttachment", "Reading JWT token from database...");
|
|
801
|
-
jwtAuthToken = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.jwtToken);
|
|
802
|
-
}
|
|
803
|
-
|
|
804
|
-
// if (!jwtAuthToken) {
|
|
805
|
-
// await Logger.logError("HTTPConnection", "downloadAttachment",
|
|
806
|
-
// "Token not available. Refreshing token...");
|
|
807
|
-
// await this.getJwtToken(AuthenticationService.instance.loginParameters);
|
|
808
|
-
// }
|
|
809
|
-
|
|
810
|
-
if (!jwtAuthToken) {
|
|
811
|
-
await Logger.logError("HTTPConnection", "downloadAttachment", "Token not available.");
|
|
812
|
-
throw new Error("Token not available.");
|
|
813
|
-
}
|
|
814
|
-
const appBaseUrl = URLService.getApplicationUrl(account.getServerURL());
|
|
815
|
-
const appUrl = `${appBaseUrl}/${appName}/${ServiceConstants.ServiceAttachments}/${attachmentUid}`;
|
|
816
|
-
await Logger.logInfo("HTTPConnection", "downloadAttachment", `downloading URL : ${appUrl}`);
|
|
817
|
-
const url = new URL(appUrl);
|
|
818
|
-
|
|
819
|
-
const timeoutInSeconds = (await SettingsHelper.getRequestTimeout()) * 60 || ServiceConstants.DefaultHttpTimeout;
|
|
820
|
-
const controller = new AbortController();
|
|
821
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutInSeconds * 1000);
|
|
822
|
-
|
|
823
|
-
const response = await fetch(url, {
|
|
824
|
-
headers: {
|
|
825
|
-
'authorization': bearerAuth()
|
|
826
|
-
},
|
|
827
|
-
signal: controller.signal
|
|
828
|
-
});
|
|
829
|
-
clearTimeout(timeoutId);
|
|
830
|
-
return response;
|
|
831
|
-
}
|
|
832
|
-
|
|
833
|
-
static async getCommonPostParameters(): Promise<any> {
|
|
834
|
-
const frameworkSettingsManager = FrameworkSettingsManager.getInstance();
|
|
835
|
-
let deviceModel = window.device.model;
|
|
836
|
-
let deviceOsVersion = window.device.version;
|
|
837
|
-
let appVersion = "";
|
|
838
|
-
|
|
839
|
-
try {
|
|
840
|
-
appVersion = await SettingsHelper.getApplicationVersionNumber();
|
|
841
|
-
} catch (e) {}
|
|
842
|
-
|
|
843
|
-
// TODO:
|
|
844
|
-
// const outboxCount = await Outbox.outboxCount();
|
|
845
|
-
// const sentItemsCount = await Outbox.sentItemsCount();
|
|
846
|
-
// const inboxCount = await Inbox.inboxCount();
|
|
847
|
-
|
|
848
|
-
const activationId = await frameworkSettingsManager.getFieldValue(FrameworkSettingsFields.activationId);
|
|
849
|
-
const companyAlias = await frameworkSettingsManager.getFieldValue(FrameworkSettingsFields.namespace);
|
|
850
|
-
const serverId = await frameworkSettingsManager.getFieldValue(FrameworkSettingsFields.serverId);
|
|
851
|
-
const feUserId = await frameworkSettingsManager.getFieldValue(FrameworkSettingsFields.feUser);
|
|
852
|
-
const oneTimeToken = await frameworkSettingsManager.getFieldValue(FrameworkSettingsFields.oneTimeToken);
|
|
853
|
-
const deviceType = await frameworkSettingsManager.getFieldValue(FrameworkSettingsFields.frontendType);
|
|
854
|
-
|
|
855
|
-
const userId = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.unviredUserId);
|
|
856
|
-
let password = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.unviredPassword);
|
|
857
|
-
const loginType = AuthenticationService.instance.loginParameters.loginType;
|
|
858
|
-
|
|
859
|
-
if ((loginType === LoginType.unvired || loginType === LoginType.email) && password) {
|
|
860
|
-
// Additional logic if needed
|
|
861
|
-
}
|
|
862
|
-
|
|
863
|
-
const params: { [key: string]: string } = {};
|
|
864
|
-
if (FrameworkHelper.getPlatform() != "browser") {
|
|
865
|
-
try {
|
|
866
|
-
const passCodeAndTime = PassCodeGenerator.computePin(oneTimeToken, feUserId);
|
|
867
|
-
if (password == undefined || password == null || password == "") {
|
|
868
|
-
password = AuthenticationService.instance.loginParameters.password;
|
|
869
|
-
}
|
|
870
|
-
password = FrameworkHelper.getMD5String(password + passCodeAndTime[1]);
|
|
871
|
-
params[ServiceConstants.ParamOneTimeToken] = passCodeAndTime[0];
|
|
872
|
-
params[ServiceConstants.ParamMessageTime] = passCodeAndTime[1];
|
|
873
|
-
} catch (e) {
|
|
874
|
-
Logger.logError("HTTPConnection", "getCommonPostParameters", "Error while generating pin. Error: " + JSON.stringify(e));
|
|
875
|
-
}
|
|
876
|
-
}
|
|
877
|
-
|
|
878
|
-
params[ServiceConstants.ParamServerUserId] = userId;
|
|
879
|
-
params[ServiceConstants.ParamPassword] = password;
|
|
880
|
-
params[ServiceConstants.ParamApplication] = AuthenticationService.instance.loginParameters.appName;
|
|
881
|
-
params[ServiceConstants.ParamFrameworkVersion] = ServiceConstants.FrameworkVersionNumber;
|
|
882
|
-
params[ServiceConstants.ParamAppVersion] = appVersion;
|
|
883
|
-
params[ServiceConstants.ParamDeviceOsVersion] = deviceOsVersion;
|
|
884
|
-
params[ServiceConstants.ParamDeviceModel] = deviceModel;
|
|
885
|
-
params[ServiceConstants.ParamFeUserId] = feUserId;
|
|
886
|
-
params[ServiceConstants.ParamServerId] = serverId;
|
|
887
|
-
params[ServiceConstants.ParamDeviceType] = deviceType;
|
|
888
|
-
params[ServiceConstants.ParamCompanyAlias] = companyAlias;
|
|
889
|
-
params[ServiceConstants.ParamLoginType] = loginType;
|
|
890
|
-
|
|
891
|
-
return params;
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
static async getActivatePostParameters(loginParameters: any): Promise<any> {
|
|
895
|
-
let deviceModel = window.device.model;
|
|
896
|
-
let deviceOsVersion = window.device.version;
|
|
897
|
-
let appVersion = "";
|
|
898
|
-
|
|
899
|
-
// TODO:
|
|
900
|
-
// try {
|
|
901
|
-
// appVersion = await SettingsHelper().getApplicationVersionNumber();
|
|
902
|
-
// } catch (e) {}
|
|
903
|
-
|
|
904
|
-
const params: any = {}
|
|
905
|
-
params[ServiceConstants.ParamApplication] = loginParameters.appName,
|
|
906
|
-
params[ServiceConstants.ParamCompanyAlias] = loginParameters.company,
|
|
907
|
-
params[ServiceConstants.ParamCompanyNamespace] = loginParameters.company,
|
|
908
|
-
params[ServiceConstants.ParamFrameworkVersion] = ServiceConstants.FrameworkVersionNumber,
|
|
909
|
-
params[ServiceConstants.ParamAppVersion] = appVersion,
|
|
910
|
-
params[ServiceConstants.ParamDeviceOsVersion] = deviceOsVersion,
|
|
911
|
-
params[ServiceConstants.ParamDeviceModel] = deviceModel
|
|
912
|
-
|
|
913
|
-
return params;
|
|
914
|
-
}
|
|
915
|
-
|
|
916
|
-
async getOnetimeTokenFromFWSettingsManager(): Promise<string> {
|
|
917
|
-
try {
|
|
918
|
-
if (FrameworkHelper.getPlatform() != "unknown") {
|
|
919
|
-
var frameworkSettingsManager = FrameworkSettingsManager.getInstance();
|
|
920
|
-
const oneTimeToken = await frameworkSettingsManager.getFieldValue(FrameworkSettingsFields.oneTimeToken);
|
|
921
|
-
const feUserId = await frameworkSettingsManager.getFieldValue(FrameworkSettingsFields.feUser);
|
|
922
|
-
if (!oneTimeToken.length || !feUserId.length) {
|
|
923
|
-
return "";
|
|
924
|
-
}
|
|
925
|
-
const passCodeAndTime = PassCodeGenerator.computePin(oneTimeToken, feUserId);
|
|
926
|
-
return `${ServiceConstants.ParamOneTimeToken}=${passCodeAndTime[0]}&${ServiceConstants.ParamMessageTime}=${passCodeAndTime[1]}`;
|
|
927
|
-
}
|
|
928
|
-
} catch (e) {
|
|
929
|
-
Logger.logError("HTTPConnection", "getOnetimeTokenFromFWSettingsManager", "Error: " + JSON.stringify(e));
|
|
930
|
-
}
|
|
931
|
-
return "";
|
|
932
|
-
}
|
|
933
|
-
|
|
934
|
-
downloadWithStream(url: string, body: string, headers: HeadersInit): Observable<FetchAPIResponse> {
|
|
935
|
-
headers["Accept"] = 'text/event-stream'
|
|
936
|
-
return new Observable(observer => {
|
|
937
|
-
const fetchData = async () => {
|
|
938
|
-
let receivedLength = 0; // bytes received that have been confirmed written to disk
|
|
939
|
-
|
|
940
|
-
try {
|
|
941
|
-
const timeoutInSeconds = (await SettingsHelper.getRequestTimeout()) * 60 || ServiceConstants.DefaultHttpTimeout;
|
|
942
|
-
const controller = new AbortController();
|
|
943
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutInSeconds * 1000);
|
|
944
|
-
const response = await fetch(url, {
|
|
945
|
-
method: 'POST',
|
|
946
|
-
headers: headers,
|
|
947
|
-
body: body,
|
|
948
|
-
mode: 'cors',
|
|
949
|
-
signal: controller.signal
|
|
950
|
-
});
|
|
951
|
-
clearTimeout(timeoutId);
|
|
952
|
-
const reader = response.body?.getReader();
|
|
953
|
-
if (!reader) {
|
|
954
|
-
observer.next(new FetchAPIResponse(response.status))
|
|
955
|
-
observer.complete()
|
|
956
|
-
return;
|
|
957
|
-
}
|
|
958
|
-
|
|
959
|
-
let chunks = []; // array to collect chunks
|
|
960
|
-
let isHeaderReceived = false;
|
|
961
|
-
let totalLength = 0;
|
|
962
|
-
|
|
963
|
-
while (true) {
|
|
964
|
-
const { done, value } = await reader.read();
|
|
965
|
-
if (done) {
|
|
966
|
-
break;
|
|
967
|
-
}
|
|
968
|
-
chunks.push(value);
|
|
969
|
-
|
|
970
|
-
// Check whether we have received the headers.
|
|
971
|
-
if (!isHeaderReceived) {
|
|
972
|
-
let headerString = await this.getHeaderFromChunks(chunks);
|
|
973
|
-
let header = JSON.parse(headerString)
|
|
974
|
-
if (header) {
|
|
975
|
-
isHeaderReceived = true;
|
|
976
|
-
receivedLength = -value.length; // To make the first percentage a zero percentage.
|
|
977
|
-
totalLength = header['Content-Length'];
|
|
978
|
-
}
|
|
979
|
-
}
|
|
980
|
-
|
|
981
|
-
if (isHeaderReceived) {
|
|
982
|
-
receivedLength += value.length;
|
|
983
|
-
const percentage = (receivedLength / totalLength) * 100;
|
|
984
|
-
|
|
985
|
-
// We send the percentage value as 100 when the data is fully received
|
|
986
|
-
// till then, we do not want to send anything more than 100 (this can happen because of extra bytes due to escape characters in the response)
|
|
987
|
-
if (percentage < 100) {
|
|
988
|
-
observer.next(new FetchAPIResponse(response.status, percentage));
|
|
989
|
-
}
|
|
990
|
-
}
|
|
991
|
-
}
|
|
992
|
-
|
|
993
|
-
// Data download is complete.
|
|
994
|
-
// Now we need to get the header and data from the chunks.
|
|
995
|
-
|
|
996
|
-
let headerString = await this.getHeaderFromChunks(chunks);
|
|
997
|
-
let dataString = await this.getDataFromChunks(chunks);
|
|
998
|
-
|
|
999
|
-
observer.next(new FetchAPIResponse(response.status, 100, headerString, dataString));
|
|
1000
|
-
observer.complete();
|
|
1001
|
-
|
|
1002
|
-
} catch (error) {
|
|
1003
|
-
console.error('Failed to fetch data', error);
|
|
1004
|
-
observer.error(error);
|
|
1005
|
-
}
|
|
1006
|
-
};
|
|
1007
|
-
fetchData();
|
|
1008
|
-
});
|
|
1009
|
-
}
|
|
1010
|
-
|
|
1011
|
-
private getDataFromChunks(chunks: Uint8Array[]): Promise<string> {
|
|
1012
|
-
return this.getObjectFromChunks(chunks, 1)
|
|
1013
|
-
}
|
|
1014
|
-
|
|
1015
|
-
private getHeaderFromChunks(chunks: Uint8Array[]): Promise<string> {
|
|
1016
|
-
return this.getObjectFromChunks(chunks, 0)
|
|
1017
|
-
}
|
|
1018
|
-
|
|
1019
|
-
private getObjectFromChunks(chunks: Uint8Array[], objectIndex: number): Promise<string> {
|
|
1020
|
-
return new Promise((resolve, reject) => {
|
|
1021
|
-
const blob = new Blob(chunks);
|
|
1022
|
-
|
|
1023
|
-
// Get string from blob
|
|
1024
|
-
const reader = new FileReader();
|
|
1025
|
-
reader.readAsText(blob);
|
|
1026
|
-
|
|
1027
|
-
let headerString = ''
|
|
1028
|
-
reader.onload = () => {
|
|
1029
|
-
let headerAndData = (reader.result as string).split('\\n');
|
|
1030
|
-
if (headerAndData.length > objectIndex) {
|
|
1031
|
-
headerString = headerAndData[objectIndex].replace(/\\/g, '').replace(/\"\"/g, '"').trim().replace(/^"|"$/g, '');
|
|
1032
|
-
Logger.logInfo("HTTPConnection", "getObjectFromChunks", `Header string: ${JSON.parse(headerString)}`);
|
|
1033
|
-
resolve(headerString)
|
|
1034
|
-
}
|
|
1035
|
-
else {
|
|
1036
|
-
resolve('')
|
|
1037
|
-
}
|
|
1038
|
-
};
|
|
1039
|
-
})
|
|
1040
|
-
}
|
|
1041
|
-
|
|
1042
|
-
private async updateJwtToken(jwtToken: string): Promise<void> {
|
|
1043
|
-
if (jwtToken) {
|
|
1044
|
-
jwtAuthToken = jwtToken;
|
|
1045
|
-
await UserSettingsManager.getInstance().setFieldValue(UserSettingsFields.jwtToken, jwtAuthToken);
|
|
1046
|
-
NotificationListenerHelper.postDataSenderNotification(jwtAuthToken, NotificationListnerType.jwtTokenUpdated);
|
|
1047
|
-
}
|
|
1048
|
-
}
|
|
1049
|
-
}
|
|
1050
|
-
|
|
1051
|
-
export default new HttpConnection()
|