active-connect-ng2 0.0.1
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/README.md +24 -0
- package/esm2020/active-connect-ng2.mjs +5 -0
- package/esm2020/lib/active-connect-ng2.module.mjs +16 -0
- package/esm2020/lib/websocket/client.mjs +259 -0
- package/esm2020/lib/websocket/decorators/function.mjs +49 -0
- package/esm2020/lib/websocket/decorators/websocket/handle.mjs +9 -0
- package/esm2020/lib/websocket/decorators/websocket/on-success.mjs +8 -0
- package/esm2020/lib/websocket/decorators/websocket/outbound.mjs +53 -0
- package/esm2020/lib/websocket/decorators/websocket/route.mjs +21 -0
- package/esm2020/lib/websocket/decorators/websocket/shared.mjs +10 -0
- package/esm2020/lib/websocket/decorators/websocket/websocket-route-service.mjs +2 -0
- package/esm2020/lib/websocket/index.mjs +8 -0
- package/esm2020/lib/websocket/json/json-parser.mjs +23 -0
- package/esm2020/public-api.mjs +6 -0
- package/fesm2015/active-connect-ng2.mjs +459 -0
- package/fesm2015/active-connect-ng2.mjs.map +1 -0
- package/fesm2020/active-connect-ng2.mjs +453 -0
- package/fesm2020/active-connect-ng2.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/active-connect-ng2.module.d.ts +6 -0
- package/lib/websocket/client.d.ts +44 -0
- package/lib/websocket/decorators/function.d.ts +30 -0
- package/lib/websocket/decorators/websocket/handle.d.ts +1 -0
- package/lib/websocket/decorators/websocket/on-success.d.ts +1 -0
- package/lib/websocket/decorators/websocket/outbound.d.ts +1 -0
- package/lib/websocket/decorators/websocket/route.d.ts +1 -0
- package/lib/websocket/decorators/websocket/shared.d.ts +4 -0
- package/lib/websocket/decorators/websocket/websocket-route-service.d.ts +5 -0
- package/lib/websocket/index.d.ts +7 -0
- package/lib/websocket/json/json-parser.d.ts +5 -0
- package/package.json +31 -0
- package/public-api.d.ts +2 -0
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { __awaiter } from 'tslib';
|
|
4
|
+
|
|
5
|
+
class ActiveConnectNg2Module {
|
|
6
|
+
}
|
|
7
|
+
ActiveConnectNg2Module.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ActiveConnectNg2Module, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
8
|
+
ActiveConnectNg2Module.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: ActiveConnectNg2Module });
|
|
9
|
+
ActiveConnectNg2Module.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ActiveConnectNg2Module });
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ActiveConnectNg2Module, decorators: [{
|
|
11
|
+
type: NgModule,
|
|
12
|
+
args: [{
|
|
13
|
+
declarations: [],
|
|
14
|
+
imports: [],
|
|
15
|
+
exports: [],
|
|
16
|
+
}]
|
|
17
|
+
}] });
|
|
18
|
+
|
|
19
|
+
class JsonParser {
|
|
20
|
+
static stringify(obj) {
|
|
21
|
+
return JSON.stringify(obj);
|
|
22
|
+
}
|
|
23
|
+
static parsingFunction(key, value) {
|
|
24
|
+
var a;
|
|
25
|
+
if (typeof value === "string") {
|
|
26
|
+
a =
|
|
27
|
+
/^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}\:[0-9]{2}\:[0-9]{2}\.[0-9]{3}Z$/.exec(value);
|
|
28
|
+
if (a) {
|
|
29
|
+
return new Date(a);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
static parse(str) {
|
|
35
|
+
if (str && str != "undefined") {
|
|
36
|
+
return JSON.parse(str, JsonParser.parsingFunction);
|
|
37
|
+
}
|
|
38
|
+
return str;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
class WebsocketClient {
|
|
43
|
+
constructor(url) {
|
|
44
|
+
this.url = url;
|
|
45
|
+
this.requestStack = [];
|
|
46
|
+
this._token = '';
|
|
47
|
+
this.connectionEstablishedOnce = false;
|
|
48
|
+
this.messageId = 0;
|
|
49
|
+
this.expectedMethods = new Map();
|
|
50
|
+
this.closed = false;
|
|
51
|
+
if (!url) {
|
|
52
|
+
let protocol;
|
|
53
|
+
let port;
|
|
54
|
+
switch (document.location.protocol) {
|
|
55
|
+
case 'https:': {
|
|
56
|
+
protocol = 'wss:';
|
|
57
|
+
port = ':443';
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
default: {
|
|
61
|
+
protocol = 'ws:';
|
|
62
|
+
port = ':80';
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
this.url = protocol + '//' + document.location.hostname + port + '/wss';
|
|
67
|
+
}
|
|
68
|
+
this.connect(this.url);
|
|
69
|
+
}
|
|
70
|
+
connect(url) {
|
|
71
|
+
if (!this.subject) {
|
|
72
|
+
this.create(url);
|
|
73
|
+
}
|
|
74
|
+
return this.subject;
|
|
75
|
+
}
|
|
76
|
+
get Token() {
|
|
77
|
+
if (!this._token) {
|
|
78
|
+
if (window.localStorage)
|
|
79
|
+
this._token = window.localStorage.getItem('token') || '';
|
|
80
|
+
}
|
|
81
|
+
return this._token;
|
|
82
|
+
}
|
|
83
|
+
set Token(val) {
|
|
84
|
+
this._token = val;
|
|
85
|
+
if (window.localStorage)
|
|
86
|
+
window.localStorage.setItem('token', val);
|
|
87
|
+
}
|
|
88
|
+
set Connected(value) {
|
|
89
|
+
if (value) {
|
|
90
|
+
this.sendBrowserInfoToServer();
|
|
91
|
+
this.resetRequestedState();
|
|
92
|
+
this.auth(this.Token).then(() => {
|
|
93
|
+
this.requestStack.forEach((e) => {
|
|
94
|
+
this.sendToSocket(e.method, e.data);
|
|
95
|
+
this.requestStack = this.requestStack.filter((e1) => e1 != e);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (this.pool && this.pool.WssConnected)
|
|
100
|
+
this.pool.WssConnected = value;
|
|
101
|
+
}
|
|
102
|
+
resetRequestedState() {
|
|
103
|
+
if (this.connectionEstablishedOnce) {
|
|
104
|
+
// reset requested state for outbounds
|
|
105
|
+
WebsocketClient.resetRequestedStateCallbacks.forEach((reset) => {
|
|
106
|
+
reset();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
this.connectionEstablishedOnce = true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
static addResetRequestingStateCallback(callback) {
|
|
114
|
+
WebsocketClient.resetRequestedStateCallbacks.push(callback);
|
|
115
|
+
}
|
|
116
|
+
create(url) {
|
|
117
|
+
// create new connection
|
|
118
|
+
this.ws = new WebSocket(url);
|
|
119
|
+
this.ws.onerror = (err) => {
|
|
120
|
+
this.ws.close();
|
|
121
|
+
console.log(err);
|
|
122
|
+
};
|
|
123
|
+
this.ws.onopen = () => {
|
|
124
|
+
this.Connected = true;
|
|
125
|
+
};
|
|
126
|
+
this.ws.onmessage = (e) => {
|
|
127
|
+
this.messageReceived(JsonParser.parse(e.data.toString()));
|
|
128
|
+
};
|
|
129
|
+
this.ws.onclose = () => {
|
|
130
|
+
if (!this.closed) {
|
|
131
|
+
if (this.pool && this.pool.WssConnected)
|
|
132
|
+
this.pool.WssConnected = false;
|
|
133
|
+
setTimeout(() => {
|
|
134
|
+
this.connect(url);
|
|
135
|
+
}, 1000);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
sendToSocket(method, data, dontEnsureTransmission) {
|
|
140
|
+
const messageId = ++this.messageId;
|
|
141
|
+
if (this.ws.readyState != this.ws.OPEN) {
|
|
142
|
+
if (!dontEnsureTransmission)
|
|
143
|
+
this.requestStack.push({ method, data, messageId });
|
|
144
|
+
else
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
this.ws.send(JsonParser.stringify({ method, value: data, messageId }));
|
|
149
|
+
}
|
|
150
|
+
return messageId;
|
|
151
|
+
}
|
|
152
|
+
auth(token) {
|
|
153
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
154
|
+
return this.sendToSocket('auth.token', token);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
send(method, data, dontEnsureTransmission) {
|
|
158
|
+
const messageId = this.sendToSocket(method, data, dontEnsureTransmission || false);
|
|
159
|
+
if (messageId) {
|
|
160
|
+
return this.expectMethod(`m.${method}`, messageId);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
return new Promise((resolve) => {
|
|
164
|
+
resolve(false);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
expectMethod(method, messageId) {
|
|
169
|
+
return new Promise((resolve) => {
|
|
170
|
+
if (messageId) {
|
|
171
|
+
this.expectedMethods.set(messageId, [resolve]);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
if (this.expectedMethods.has(method)) {
|
|
175
|
+
let arr = this.expectedMethods.get(method);
|
|
176
|
+
arr.push(resolve);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
this.expectedMethods.set(method, [resolve]);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
messageReceived({ method, value, messageId, }) {
|
|
185
|
+
if (messageId) {
|
|
186
|
+
const callback = this.expectedMethods.get(messageId);
|
|
187
|
+
if (callback) {
|
|
188
|
+
const func = callback.shift();
|
|
189
|
+
if (func)
|
|
190
|
+
func(value);
|
|
191
|
+
this.invokeSuccessHandlers(method);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
const callback = this.expectedMethods.get(method);
|
|
195
|
+
if (callback && callback.length > 0) {
|
|
196
|
+
const func = callback.shift();
|
|
197
|
+
if (func)
|
|
198
|
+
func(value);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
const out = WebsocketClient.outbounds.get(method);
|
|
202
|
+
if (out) {
|
|
203
|
+
out(value);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
const handle = WebsocketClient.handles.get(method);
|
|
207
|
+
if (handle) {
|
|
208
|
+
handle.Func(value);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
throw Error('No MessageId was provided, the connection is not supported.');
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
static expectOutbound(method, callback) {
|
|
219
|
+
WebsocketClient.outbounds.set(method, callback);
|
|
220
|
+
}
|
|
221
|
+
static registerHandle(method, callback) {
|
|
222
|
+
WebsocketClient.handles.set(method, callback);
|
|
223
|
+
}
|
|
224
|
+
get isConnected() {
|
|
225
|
+
if (this.ws)
|
|
226
|
+
return this.ws.readyState == WebSocket.OPEN;
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
sendBrowserInfoToServer() {
|
|
230
|
+
// send browser / os information
|
|
231
|
+
const browser = this.getBrowser();
|
|
232
|
+
const os = this.getOS();
|
|
233
|
+
this.send('___browser', {
|
|
234
|
+
browser: `${browser.name} ${browser.version} ${os}`,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
getBrowser() {
|
|
238
|
+
// https://www.gregoryvarghese.com/how-to-get-browser-name-and-version-via-javascript/
|
|
239
|
+
var ua = navigator.userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
|
|
240
|
+
if (/trident/i.test(M[1])) {
|
|
241
|
+
tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
|
|
242
|
+
return { name: 'IE ', version: tem[1] || '' };
|
|
243
|
+
}
|
|
244
|
+
if (M[1] === 'Chrome') {
|
|
245
|
+
tem = ua.match(/\bOPR\/(\d+)/);
|
|
246
|
+
if (tem != null) {
|
|
247
|
+
return { name: 'Opera', version: tem[1] };
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
|
|
251
|
+
if ((tem = ua.match(/version\/(\d+)/i)) != null) {
|
|
252
|
+
M.splice(1, 1, tem[1]);
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
name: M[0],
|
|
256
|
+
version: M[1],
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
getOS() {
|
|
260
|
+
var userAgent = window.navigator.userAgent, platform = window.navigator.platform, macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'], windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'], iosPlatforms = ['iPhone', 'iPad', 'iPod'], os = null;
|
|
261
|
+
if (macosPlatforms.indexOf(platform) !== -1) {
|
|
262
|
+
os = 'Mac OS';
|
|
263
|
+
}
|
|
264
|
+
else if (iosPlatforms.indexOf(platform) !== -1) {
|
|
265
|
+
os = 'iOS';
|
|
266
|
+
}
|
|
267
|
+
else if (windowsPlatforms.indexOf(platform) !== -1) {
|
|
268
|
+
os = 'Windows';
|
|
269
|
+
}
|
|
270
|
+
else if (/Android/.test(userAgent)) {
|
|
271
|
+
os = 'Android';
|
|
272
|
+
}
|
|
273
|
+
else if (!os && /Linux/.test(platform)) {
|
|
274
|
+
os = 'Linux';
|
|
275
|
+
}
|
|
276
|
+
return os || '';
|
|
277
|
+
}
|
|
278
|
+
static onSuccess(callback, regexp) {
|
|
279
|
+
this.onSuccessHandlers.push({ callback, regexp });
|
|
280
|
+
}
|
|
281
|
+
invokeSuccessHandlers(method) {
|
|
282
|
+
WebsocketClient.onSuccessHandlers
|
|
283
|
+
.filter((e) => e.regexp.test(method))
|
|
284
|
+
.forEach((e) => {
|
|
285
|
+
var res = e.callback.Func();
|
|
286
|
+
if (res && res.then) {
|
|
287
|
+
res.then();
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
disconnect(restart) {
|
|
292
|
+
if (!restart)
|
|
293
|
+
this.closed = true;
|
|
294
|
+
this.ws.close();
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
WebsocketClient.resetRequestedStateCallbacks = [];
|
|
298
|
+
WebsocketClient.outbounds = new Map();
|
|
299
|
+
WebsocketClient.handles = new Map();
|
|
300
|
+
WebsocketClient.onSuccessHandlers = [];
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Represents the reference to an object method used for websocket routes and outbounds.
|
|
304
|
+
*/
|
|
305
|
+
class DecorableFunction {
|
|
306
|
+
/**
|
|
307
|
+
* Creates an instance of DecorableFunction.
|
|
308
|
+
* @param objConfig - The configuration object for the object method.
|
|
309
|
+
* @param objConfig.target - The target object.
|
|
310
|
+
* @param objConfig.propertyKey - The property key of the target object.
|
|
311
|
+
*/
|
|
312
|
+
constructor(objConfig) {
|
|
313
|
+
this.objConfig = objConfig;
|
|
314
|
+
// singelton service - fetch from angular
|
|
315
|
+
const prototype = this.objConfig.target.prototype || this.objConfig.target;
|
|
316
|
+
if (!prototype.___constructorOverridden) {
|
|
317
|
+
prototype.___constructorOverridden = true;
|
|
318
|
+
const oldConstructor = this.objConfig.target.constructor;
|
|
319
|
+
this.objConfig.target.constructor = (...data) => {
|
|
320
|
+
const object = oldConstructor(...data);
|
|
321
|
+
if (!prototype.___data) {
|
|
322
|
+
prototype.___data = {};
|
|
323
|
+
}
|
|
324
|
+
prototype.___data._obj = object;
|
|
325
|
+
return object;
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Returns the decorated function.
|
|
331
|
+
* @returns - The decorated function.
|
|
332
|
+
*/
|
|
333
|
+
get Func() {
|
|
334
|
+
var _a;
|
|
335
|
+
if (((_a = this.objConfig) === null || _a === void 0 ? void 0 : _a.target) &&
|
|
336
|
+
this.objConfig.target[this.objConfig.propertyKey]) {
|
|
337
|
+
return this.objConfig.target[this.objConfig.propertyKey].bind(this.getBindObject());
|
|
338
|
+
}
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Returns the bind object.
|
|
343
|
+
* @private
|
|
344
|
+
* @returns - The bind object.
|
|
345
|
+
*/
|
|
346
|
+
getBindObject() {
|
|
347
|
+
const prototype = this.objConfig.target.prototype || this.objConfig.target;
|
|
348
|
+
return prototype.___data._obj;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function Handle(method) {
|
|
353
|
+
return function _Handle(target, propertyKey) {
|
|
354
|
+
// method annotation
|
|
355
|
+
WebsocketClient.registerHandle(method, new DecorableFunction({ target, propertyKey }));
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function OnSuccess(regexp) {
|
|
360
|
+
return function _Route(target, propertyKey) {
|
|
361
|
+
WebsocketClient.onSuccess(new DecorableFunction({ target, propertyKey }), regexp);
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
function Outbound(method, requestingRequired) {
|
|
366
|
+
return function _Outbound(target, propertyKey) {
|
|
367
|
+
target.loading = new Map();
|
|
368
|
+
// property annotation
|
|
369
|
+
WebsocketClient.expectOutbound(method, function setOutbound(data) {
|
|
370
|
+
if (!target.___received)
|
|
371
|
+
target.___received = {};
|
|
372
|
+
if (!target.___data)
|
|
373
|
+
target.___data = {};
|
|
374
|
+
target.___received[propertyKey] = true;
|
|
375
|
+
target.___data[propertyKey] = data;
|
|
376
|
+
target.loading.set(propertyKey, false);
|
|
377
|
+
});
|
|
378
|
+
if (requestingRequired) {
|
|
379
|
+
WebsocketClient.addResetRequestingStateCallback(function callback() {
|
|
380
|
+
if (target.___requested) {
|
|
381
|
+
target.___requested[propertyKey] = false;
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
return {
|
|
386
|
+
configurable: true,
|
|
387
|
+
writeable: true,
|
|
388
|
+
get() {
|
|
389
|
+
if (!target.___received)
|
|
390
|
+
target.___received = {};
|
|
391
|
+
if (!target.___requested)
|
|
392
|
+
target.___requested = {};
|
|
393
|
+
if (requestingRequired && !target.___requested[propertyKey]) {
|
|
394
|
+
target.___requested[propertyKey] = true;
|
|
395
|
+
this.client.send('request.' + method, null).then();
|
|
396
|
+
}
|
|
397
|
+
if (!target.___data)
|
|
398
|
+
target.___data = {};
|
|
399
|
+
if (!target.___data[propertyKey]) {
|
|
400
|
+
target.loading.set(propertyKey, true);
|
|
401
|
+
}
|
|
402
|
+
else if (target.loading[propertyKey]) {
|
|
403
|
+
target.loading.set(propertyKey, false);
|
|
404
|
+
}
|
|
405
|
+
return target.___data[propertyKey];
|
|
406
|
+
},
|
|
407
|
+
set(val) {
|
|
408
|
+
if (!target.___data)
|
|
409
|
+
target.___data = {};
|
|
410
|
+
target.loading.set(propertyKey, false);
|
|
411
|
+
return (target.___data[propertyKey] = val);
|
|
412
|
+
},
|
|
413
|
+
};
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
function Route(method, loadingKey, dontEnsureTransmission) {
|
|
418
|
+
return function _Route(target, propertyKey) {
|
|
419
|
+
// method annotation
|
|
420
|
+
const original = target[propertyKey];
|
|
421
|
+
target[propertyKey] = function execRoute(...data) {
|
|
422
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
423
|
+
if (loadingKey)
|
|
424
|
+
this.loadingElements[loadingKey]++;
|
|
425
|
+
const promise = original.bind(this)(...data);
|
|
426
|
+
let res = null;
|
|
427
|
+
if (this.client) {
|
|
428
|
+
res = yield this.client.send(method, data[0], dontEnsureTransmission);
|
|
429
|
+
}
|
|
430
|
+
yield promise;
|
|
431
|
+
if (loadingKey)
|
|
432
|
+
this.loadingElements[loadingKey]--;
|
|
433
|
+
return res;
|
|
434
|
+
});
|
|
435
|
+
};
|
|
436
|
+
return target;
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* @deprecated
|
|
442
|
+
*/
|
|
443
|
+
function Shared(defaultValue) {
|
|
444
|
+
if (defaultValue) {
|
|
445
|
+
throw Error("Active-Connect/@Shared: defaultValue is no longer supported, please assign the value to the variable itself.");
|
|
446
|
+
}
|
|
447
|
+
return function _Shared(target, propertyKey) { };
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/*
|
|
451
|
+
* Public API Surface of active-connect-ng2
|
|
452
|
+
*/
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Generated bundle index. Do not edit.
|
|
456
|
+
*/
|
|
457
|
+
|
|
458
|
+
export { ActiveConnectNg2Module, Handle, OnSuccess, Outbound, Route, Shared, WebsocketClient };
|
|
459
|
+
//# sourceMappingURL=active-connect-ng2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-connect-ng2.mjs","sources":["../../../projects/active-connect-ng2/src/lib/active-connect-ng2.module.ts","../../../projects/active-connect-ng2/src/lib/websocket/json/json-parser.ts","../../../projects/active-connect-ng2/src/lib/websocket/client.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/function.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/websocket/handle.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/websocket/on-success.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/websocket/outbound.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/websocket/route.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/websocket/shared.ts","../../../projects/active-connect-ng2/src/public-api.ts","../../../projects/active-connect-ng2/src/active-connect-ng2.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\n\n@NgModule({\n declarations: [],\n imports: [],\n exports: [],\n})\nexport class ActiveConnectNg2Module {}\n","export class JsonParser {\r\n static stringify(obj: any) {\r\n return JSON.stringify(obj);\r\n }\r\n\r\n static parsingFunction(key: any, value: any) {\r\n var a;\r\n if (typeof value === \"string\") {\r\n a =\r\n /^[0-9]{4}\\-[0-9]{2}\\-[0-9]{2}T[0-9]{2}\\:[0-9]{2}\\:[0-9]{2}\\.[0-9]{3}Z$/.exec(\r\n value\r\n );\r\n if (a) {\r\n return new Date(a as any);\r\n }\r\n }\r\n return value;\r\n }\r\n\r\n static parse(str: string) {\r\n if (str && str != \"undefined\") {\r\n return JSON.parse(str, JsonParser.parsingFunction);\r\n }\r\n return str;\r\n }\r\n}\r\n","import { DecorableFunction } from './decorators/function';\r\nimport { JsonParser } from './json/json-parser';\r\n\r\nexport class WebsocketClient {\r\n ws!: WebSocket;\r\n pool!: { WssConnected: boolean } | null;\r\n\r\n constructor(private url?: string) {\r\n if (!url) {\r\n let protocol;\r\n let port;\r\n switch (document.location.protocol) {\r\n case 'https:': {\r\n protocol = 'wss:';\r\n port = ':443';\r\n break;\r\n }\r\n default: {\r\n protocol = 'ws:';\r\n port = ':80';\r\n break;\r\n }\r\n }\r\n this.url = protocol + '//' + document.location.hostname + port + '/wss';\r\n }\r\n this.connect(this.url as string);\r\n }\r\n\r\n subject: any;\r\n\r\n private connect(url: string) {\r\n if (!this.subject) {\r\n this.create(url);\r\n }\r\n return this.subject;\r\n }\r\n\r\n private requestStack: any[] = [];\r\n\r\n private _token = '';\r\n public get Token(): string {\r\n if (!this._token) {\r\n if (window.localStorage)\r\n this._token = window.localStorage.getItem('token') || '';\r\n }\r\n return this._token;\r\n }\r\n public set Token(val: string) {\r\n this._token = val;\r\n if (window.localStorage) window.localStorage.setItem('token', val);\r\n }\r\n\r\n private set Connected(value: boolean) {\r\n if (value) {\r\n this.sendBrowserInfoToServer();\r\n\r\n this.resetRequestedState();\r\n this.auth(this.Token).then(() => {\r\n this.requestStack.forEach((e) => {\r\n this.sendToSocket(e.method, e.data);\r\n this.requestStack = this.requestStack.filter((e1) => e1 != e);\r\n });\r\n });\r\n }\r\n if (this.pool && this.pool.WssConnected) this.pool.WssConnected = value;\r\n }\r\n private static resetRequestedStateCallbacks: Function[] = [];\r\n private connectionEstablishedOnce: boolean = false;\r\n private resetRequestedState() {\r\n if (this.connectionEstablishedOnce) {\r\n // reset requested state for outbounds\r\n WebsocketClient.resetRequestedStateCallbacks.forEach((reset) => {\r\n reset();\r\n });\r\n } else {\r\n this.connectionEstablishedOnce = true;\r\n }\r\n }\r\n public static addResetRequestingStateCallback(callback: Function) {\r\n WebsocketClient.resetRequestedStateCallbacks.push(callback);\r\n }\r\n\r\n private create(url: string) {\r\n // create new connection\r\n this.ws = new WebSocket(url);\r\n this.ws.onerror = (err) => {\r\n this.ws.close();\r\n console.log(err);\r\n };\r\n this.ws.onopen = () => {\r\n this.Connected = true;\r\n };\r\n this.ws.onmessage = (e) => {\r\n this.messageReceived(JsonParser.parse(e.data.toString()));\r\n };\r\n this.ws.onclose = () => {\r\n if (!this.closed) {\r\n if (this.pool && this.pool.WssConnected) this.pool.WssConnected = false;\r\n setTimeout(() => {\r\n this.connect(url);\r\n }, 1000);\r\n }\r\n };\r\n }\r\n\r\n private messageId: number = 0;\r\n protected sendToSocket(\r\n method: string,\r\n data: any,\r\n dontEnsureTransmission?: boolean\r\n ) {\r\n const messageId = ++this.messageId;\r\n if (this.ws.readyState != this.ws.OPEN) {\r\n if (!dontEnsureTransmission)\r\n this.requestStack.push({ method, data, messageId });\r\n else return false;\r\n } else {\r\n this.ws.send(JsonParser.stringify({ method, value: data, messageId }));\r\n }\r\n return messageId;\r\n }\r\n\r\n async auth(token: string): Promise<any> {\r\n return this.sendToSocket('auth.token', token);\r\n }\r\n\r\n public send(\r\n method: string,\r\n data: any,\r\n dontEnsureTransmission?: boolean\r\n ): Promise<any> {\r\n const messageId = this.sendToSocket(\r\n method,\r\n data,\r\n dontEnsureTransmission || false\r\n );\r\n if (messageId) {\r\n return this.expectMethod(`m.${method}`, messageId);\r\n } else {\r\n return new Promise((resolve) => {\r\n resolve(false);\r\n });\r\n }\r\n }\r\n\r\n private expectedMethods: Map<string | number, Array<Function>> = new Map();\r\n private expectMethod(method: string, messageId?: number | null) {\r\n return new Promise((resolve) => {\r\n if (messageId) {\r\n this.expectedMethods.set(messageId, [resolve]);\r\n } else {\r\n if (this.expectedMethods.has(method)) {\r\n let arr = this.expectedMethods.get(method);\r\n (arr as Array<Function>).push(resolve);\r\n } else {\r\n this.expectedMethods.set(method, [resolve]);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private messageReceived({\r\n method,\r\n value,\r\n messageId,\r\n }: {\r\n method: string;\r\n value: any;\r\n messageId: number | null;\r\n }) {\r\n if (messageId) {\r\n const callback = this.expectedMethods.get(messageId);\r\n if (callback) {\r\n const func = callback.shift();\r\n if (func) func(value);\r\n this.invokeSuccessHandlers(method);\r\n } else {\r\n const callback = this.expectedMethods.get(method);\r\n if (callback && callback.length > 0) {\r\n const func = callback.shift();\r\n if (func) func(value);\r\n } else {\r\n const out = WebsocketClient.outbounds.get(method);\r\n if (out) {\r\n out(value);\r\n } else {\r\n const handle = WebsocketClient.handles.get(method);\r\n if (handle) {\r\n (handle.Func as Function)(value);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n throw Error(\r\n 'No MessageId was provided, the connection is not supported.'\r\n );\r\n }\r\n }\r\n\r\n private static outbounds: Map<string, (data: any) => void> = new Map();\r\n static expectOutbound(method: string, callback: (data: any) => void) {\r\n WebsocketClient.outbounds.set(method, callback);\r\n }\r\n\r\n private static handles: Map<string, DecorableFunction> = new Map();\r\n static registerHandle(method: string, callback: DecorableFunction) {\r\n WebsocketClient.handles.set(method, callback);\r\n }\r\n\r\n public get isConnected(): boolean {\r\n if (this.ws) return this.ws.readyState == WebSocket.OPEN;\r\n return true;\r\n }\r\n\r\n private sendBrowserInfoToServer() {\r\n // send browser / os information\r\n const browser = this.getBrowser();\r\n const os = this.getOS();\r\n this.send('___browser', {\r\n browser: `${browser.name} ${browser.version} ${os}`,\r\n });\r\n }\r\n\r\n public getBrowser(): { name: string; version: string } {\r\n // https://www.gregoryvarghese.com/how-to-get-browser-name-and-version-via-javascript/\r\n var ua = navigator.userAgent,\r\n tem,\r\n M =\r\n ua.match(\r\n /(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i\r\n ) || [];\r\n if (/trident/i.test(M[1])) {\r\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\r\n return { name: 'IE ', version: tem[1] || '' };\r\n }\r\n if (M[1] === 'Chrome') {\r\n tem = ua.match(/\\bOPR\\/(\\d+)/);\r\n if (tem != null) {\r\n return { name: 'Opera', version: tem[1] };\r\n }\r\n }\r\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\r\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null) {\r\n M.splice(1, 1, tem[1]);\r\n }\r\n return {\r\n name: M[0],\r\n version: M[1],\r\n };\r\n }\r\n\r\n public getOS(): string {\r\n var userAgent = window.navigator.userAgent,\r\n platform = window.navigator.platform,\r\n macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'],\r\n windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'],\r\n iosPlatforms = ['iPhone', 'iPad', 'iPod'],\r\n os = null;\r\n\r\n if (macosPlatforms.indexOf(platform) !== -1) {\r\n os = 'Mac OS';\r\n } else if (iosPlatforms.indexOf(platform) !== -1) {\r\n os = 'iOS';\r\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\r\n os = 'Windows';\r\n } else if (/Android/.test(userAgent)) {\r\n os = 'Android';\r\n } else if (!os && /Linux/.test(platform)) {\r\n os = 'Linux';\r\n }\r\n\r\n return os || '';\r\n }\r\n\r\n private static onSuccessHandlers: {\r\n callback: DecorableFunction;\r\n regexp: RegExp;\r\n }[] = [];\r\n public static onSuccess(callback: DecorableFunction, regexp: RegExp) {\r\n this.onSuccessHandlers.push({ callback, regexp });\r\n }\r\n\r\n private invokeSuccessHandlers(method: string) {\r\n WebsocketClient.onSuccessHandlers\r\n .filter((e) => e.regexp.test(method))\r\n .forEach((e) => {\r\n var res = (e.callback.Func as Function)();\r\n if (res && res.then) {\r\n res.then();\r\n }\r\n });\r\n }\r\n\r\n public closed = false;\r\n public disconnect(restart?: boolean) {\r\n if (!restart) this.closed = true;\r\n this.ws.close();\r\n }\r\n}\r\n","/**\r\n * Represents the reference to an object method used for websocket routes and outbounds.\r\n */\r\nexport class DecorableFunction {\r\n /**\r\n * Creates an instance of DecorableFunction.\r\n * @param objConfig - The configuration object for the object method.\r\n * @param objConfig.target - The target object.\r\n * @param objConfig.propertyKey - The property key of the target object.\r\n */\r\n constructor(protected objConfig: { target: any; propertyKey: string }) {\r\n // singelton service - fetch from angular\r\n const prototype = this.objConfig.target.prototype || this.objConfig.target;\r\n if (!prototype.___constructorOverridden) {\r\n prototype.___constructorOverridden = true;\r\n const oldConstructor = this.objConfig.target.constructor;\r\n this.objConfig.target.constructor = (...data: any[]) => {\r\n const object = oldConstructor(...data);\r\n if (!prototype.___data) {\r\n prototype.___data = {};\r\n }\r\n prototype.___data._obj = object;\r\n return object;\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Returns the decorated function.\r\n * @returns - The decorated function.\r\n */\r\n public get Func(): ((...data: any[]) => Promise<any> | any) | null {\r\n if (\r\n this.objConfig?.target &&\r\n this.objConfig.target[this.objConfig.propertyKey]\r\n ) {\r\n return this.objConfig.target[this.objConfig.propertyKey].bind(\r\n this.getBindObject()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the bind object.\r\n * @private\r\n * @returns - The bind object.\r\n */\r\n private getBindObject(): any {\r\n const prototype = this.objConfig.target.prototype || this.objConfig.target;\r\n return prototype.___data._obj;\r\n }\r\n}\r\n","import { WebsocketClient } from '../../client';\r\nimport { DecorableFunction } from '../function';\r\n\r\nexport function Handle(method: string) {\r\n return function _Handle(target: any, propertyKey: string): any {\r\n // method annotation\r\n WebsocketClient.registerHandle(\r\n method,\r\n new DecorableFunction({ target, propertyKey })\r\n );\r\n };\r\n}\r\n","import { WebsocketClient } from '../../client';\r\nimport { DecorableFunction } from '../function';\r\n\r\nexport function OnSuccess(regexp: RegExp) {\r\n return function _Route(target: any, propertyKey: string): any {\r\n WebsocketClient.onSuccess(\r\n new DecorableFunction({ target, propertyKey }),\r\n regexp\r\n );\r\n };\r\n}\r\n","import { WebsocketClient } from '../../client';\r\n\r\nexport function Outbound(method: string, requestingRequired?: boolean) {\r\n return function _Outbound(target: any, propertyKey: string): any {\r\n target.loading = new Map<string, boolean>();\r\n // property annotation\r\n WebsocketClient.expectOutbound(method, function setOutbound(data: any) {\r\n if (!target.___received) target.___received = {};\r\n if (!target.___data) target.___data = {};\r\n target.___received[propertyKey] = true;\r\n target.___data[propertyKey] = data;\r\n target.loading.set(propertyKey, false);\r\n });\r\n if (requestingRequired) {\r\n WebsocketClient.addResetRequestingStateCallback(function callback() {\r\n if (target.___requested) {\r\n target.___requested[propertyKey] = false;\r\n }\r\n });\r\n }\r\n return {\r\n configurable: true,\r\n writeable: true,\r\n get() {\r\n if (!target.___received) target.___received = {};\r\n if (!target.___requested) target.___requested = {};\r\n if (requestingRequired && !target.___requested[propertyKey]) {\r\n target.___requested[propertyKey] = true;\r\n this.client.send('request.' + method, null).then();\r\n }\r\n if (!target.___data) target.___data = {};\r\n if (!target.___data[propertyKey]) {\r\n target.loading.set(propertyKey, true);\r\n } else if (target.loading[propertyKey]) {\r\n target.loading.set(propertyKey, false);\r\n }\r\n return target.___data[propertyKey];\r\n },\r\n set(val: any) {\r\n if (!target.___data) target.___data = {};\r\n target.loading.set(propertyKey, false);\r\n return (target.___data[propertyKey] = val);\r\n },\r\n };\r\n };\r\n}\r\n","export function Route(\r\n method: string,\r\n loadingKey?: string,\r\n dontEnsureTransmission?: boolean\r\n) {\r\n return function _Route(target: any, propertyKey: string): any {\r\n // method annotation\r\n const original = target[propertyKey];\r\n target[propertyKey] = async function execRoute(...data: any): Promise<any> {\r\n if (loadingKey) this.loadingElements[loadingKey]++;\r\n const promise = original.bind(this)(...data);\r\n let res = null;\r\n if (this.client) {\r\n res = await this.client.send(method, data[0], dontEnsureTransmission);\r\n }\r\n await promise;\r\n if (loadingKey) this.loadingElements[loadingKey]--;\r\n return res;\r\n };\r\n return target;\r\n };\r\n}\r\n","/**\r\n * @deprecated\r\n */\r\nexport function Shared<T>(defaultValue?: T) {\r\n if (defaultValue) {\r\n throw Error(\r\n \"Active-Connect/@Shared: defaultValue is no longer supported, please assign the value to the variable itself.\"\r\n );\r\n }\r\n return function _Shared(target: any, propertyKey: string) {};\r\n}\r\n","/*\n * Public API Surface of active-connect-ng2\n */\n\nexport * from './lib/active-connect-ng2.module';\nexport * from './lib/websocket';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|