@push.rocks/smartsocket 2.0.19
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/dist_bundle/bundle.js +10311 -0
- package/dist_bundle/bundle.js.map +7 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/index.d.ts +4 -0
- package/dist_ts/index.js +7 -0
- package/dist_ts/interfaces/connection.d.ts +4 -0
- package/dist_ts/interfaces/connection.js +2 -0
- package/dist_ts/interfaces/index.d.ts +2 -0
- package/dist_ts/interfaces/index.js +3 -0
- package/dist_ts/interfaces/tag.d.ts +7 -0
- package/dist_ts/interfaces/tag.js +2 -0
- package/dist_ts/smartsocket.classes.smartsocket.d.ts +43 -0
- package/dist_ts/smartsocket.classes.smartsocket.js +102 -0
- package/dist_ts/smartsocket.classes.smartsocketclient.d.ts +64 -0
- package/dist_ts/smartsocket.classes.smartsocketclient.js +217 -0
- package/dist_ts/smartsocket.classes.socketconnection.d.ts +65 -0
- package/dist_ts/smartsocket.classes.socketconnection.js +169 -0
- package/dist_ts/smartsocket.classes.socketfunction.d.ts +45 -0
- package/dist_ts/smartsocket.classes.socketfunction.js +40 -0
- package/dist_ts/smartsocket.classes.socketrequest.d.ts +47 -0
- package/dist_ts/smartsocket.classes.socketrequest.js +72 -0
- package/dist_ts/smartsocket.classes.socketserver.d.ts +35 -0
- package/dist_ts/smartsocket.classes.socketserver.js +78 -0
- package/dist_ts/smartsocket.logging.d.ts +2 -0
- package/dist_ts/smartsocket.logging.js +3 -0
- package/dist_ts/smartsocket.plugins.d.ts +13 -0
- package/dist_ts/smartsocket.plugins.js +16 -0
- package/dist_ts/smartsocket.pluginstyped.d.ts +15 -0
- package/dist_ts/smartsocket.pluginstyped.js +2 -0
- package/npmextra.json +18 -0
- package/package.json +64 -0
- package/readme.md +120 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/index.ts +7 -0
- package/ts/interfaces/connection.ts +11 -0
- package/ts/interfaces/index.ts +2 -0
- package/ts/interfaces/tag.ts +6 -0
- package/ts/smartsocket.classes.smartsocket.ts +137 -0
- package/ts/smartsocket.classes.smartsocketclient.ts +266 -0
- package/ts/smartsocket.classes.socketconnection.ts +224 -0
- package/ts/smartsocket.classes.socketfunction.ts +93 -0
- package/ts/smartsocket.classes.socketrequest.ts +126 -0
- package/ts/smartsocket.classes.socketserver.ts +94 -0
- package/ts/smartsocket.logging.ts +3 -0
- package/ts/smartsocket.plugins.ts +29 -0
- package/ts/smartsocket.pluginstyped.ts +23 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import * as plugins from './smartsocket.plugins.js';
|
|
2
|
+
import './smartsocket.pluginstyped.js';
|
|
3
|
+
import './interfaces/index.js';
|
|
4
|
+
// import classes
|
|
5
|
+
import './smartsocket.classes.smartsocket.js';
|
|
6
|
+
import './smartsocket.classes.socketfunction.js';
|
|
7
|
+
import { SocketRequest } from './smartsocket.classes.socketrequest.js';
|
|
8
|
+
// socket.io
|
|
9
|
+
import './smartsocket.classes.smartsocketclient.js';
|
|
10
|
+
import { logger } from './smartsocket.logging.js';
|
|
11
|
+
// export classes
|
|
12
|
+
export let allSocketConnections = new plugins.lik.ObjectMap();
|
|
13
|
+
/**
|
|
14
|
+
* class SocketConnection represents a websocket connection
|
|
15
|
+
*/
|
|
16
|
+
export class SocketConnection {
|
|
17
|
+
constructor(optionsArg) {
|
|
18
|
+
this.authenticated = false;
|
|
19
|
+
this.eventSubject = new plugins.smartrx.rxjs.Subject();
|
|
20
|
+
this.eventStatus = 'new';
|
|
21
|
+
this.tagStore = {};
|
|
22
|
+
this.tagStoreObservable = new plugins.smartrx.rxjs.Subject();
|
|
23
|
+
this.remoteTagStoreObservable = new plugins.smartrx.rxjs.Subject();
|
|
24
|
+
this.alias = optionsArg.alias;
|
|
25
|
+
this.authenticated = optionsArg.authenticated;
|
|
26
|
+
this.side = optionsArg.side;
|
|
27
|
+
this.smartsocketRef = optionsArg.smartsocketHost;
|
|
28
|
+
this.socket = optionsArg.socket;
|
|
29
|
+
// standard behaviour that is always true
|
|
30
|
+
allSocketConnections.add(this);
|
|
31
|
+
// handle connection
|
|
32
|
+
this.socket.on('connect', async () => {
|
|
33
|
+
this.updateStatus('connected');
|
|
34
|
+
});
|
|
35
|
+
this.socket.on('disconnect', async () => {
|
|
36
|
+
logger.log('info', `SocketConnection with >alias ${this.alias} on >side ${this.side} disconnected`);
|
|
37
|
+
await this.disconnect();
|
|
38
|
+
allSocketConnections.remove(this);
|
|
39
|
+
this.eventSubject.next('disconnected');
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* adds a tag to a connection
|
|
44
|
+
*/
|
|
45
|
+
async addTag(tagArg) {
|
|
46
|
+
const done = plugins.smartpromise.defer();
|
|
47
|
+
this.tagStore[tagArg.id] = tagArg;
|
|
48
|
+
this.tagStoreObservable.next(this.tagStore);
|
|
49
|
+
const remoteSubscription = this.remoteTagStoreObservable.subscribe((remoteTagStore) => {
|
|
50
|
+
if (!remoteTagStore[tagArg.id]) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const localTagString = plugins.smartjson.stringify(tagArg);
|
|
54
|
+
const remoteTagString = plugins.smartjson.stringify(remoteTagStore[tagArg.id]);
|
|
55
|
+
if (localTagString === remoteTagString) {
|
|
56
|
+
remoteSubscription.unsubscribe();
|
|
57
|
+
done.resolve();
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
this.socket.emit('updateTagStore', this.tagStore);
|
|
61
|
+
await done.promise;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* gets a tag by id
|
|
65
|
+
* @param tagIdArg
|
|
66
|
+
*/
|
|
67
|
+
async getTagById(tagIdArg) {
|
|
68
|
+
return this.tagStore[tagIdArg];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* removes a tag from a connection
|
|
72
|
+
*/
|
|
73
|
+
async removeTagById(tagIdArg) {
|
|
74
|
+
delete this.tagStore[tagIdArg];
|
|
75
|
+
this.tagStoreObservable.next(this.tagStore);
|
|
76
|
+
this.socket.emit('updateTagStore', this.tagStore);
|
|
77
|
+
}
|
|
78
|
+
// authenticating --------------------------
|
|
79
|
+
/**
|
|
80
|
+
* authenticate the socket
|
|
81
|
+
*/
|
|
82
|
+
authenticate() {
|
|
83
|
+
const done = plugins.smartpromise.defer();
|
|
84
|
+
this.socket.on('dataAuth', async (dataArg) => {
|
|
85
|
+
logger.log('info', 'received authentication data...');
|
|
86
|
+
this.socket.removeAllListeners('dataAuth');
|
|
87
|
+
if (dataArg.alias) {
|
|
88
|
+
// TODO: authenticate password
|
|
89
|
+
this.alias = dataArg.alias;
|
|
90
|
+
this.authenticated = true;
|
|
91
|
+
this.socket.emit('authenticated');
|
|
92
|
+
logger.log('ok', `socket with >>alias ${this.alias} is authenticated!`);
|
|
93
|
+
done.resolve(this);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
this.authenticated = false;
|
|
97
|
+
await this.disconnect();
|
|
98
|
+
done.reject('a socket tried to connect, but could not authenticated.');
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
const requestAuthPayload = {
|
|
102
|
+
serverAlias: this.smartsocketRef.alias,
|
|
103
|
+
};
|
|
104
|
+
this.socket.emit('requestAuth', requestAuthPayload);
|
|
105
|
+
return done.promise;
|
|
106
|
+
}
|
|
107
|
+
// listening -------------------------------
|
|
108
|
+
/**
|
|
109
|
+
* listen to function requests
|
|
110
|
+
*/
|
|
111
|
+
listenToFunctionRequests() {
|
|
112
|
+
const done = plugins.smartpromise.defer();
|
|
113
|
+
if (this.authenticated) {
|
|
114
|
+
this.socket.on('function', (dataArg) => {
|
|
115
|
+
// check if requested function is available to the socket's scope
|
|
116
|
+
// logger.log('info', 'function request received');
|
|
117
|
+
const referencedFunction = this.smartsocketRef.socketFunctions.findSync((socketFunctionArg) => {
|
|
118
|
+
return socketFunctionArg.name === dataArg.funcCallData.funcName;
|
|
119
|
+
});
|
|
120
|
+
if (referencedFunction) {
|
|
121
|
+
// logger.log('ok', 'function in access scope');
|
|
122
|
+
const localSocketRequest = new SocketRequest(this.smartsocketRef, {
|
|
123
|
+
side: 'responding',
|
|
124
|
+
originSocketConnection: this,
|
|
125
|
+
shortId: dataArg.shortId,
|
|
126
|
+
funcCallData: dataArg.funcCallData,
|
|
127
|
+
});
|
|
128
|
+
localSocketRequest.createResponse(); // takes care of creating response and sending it back
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
logger.log('warn', 'function not existent or out of access scope');
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
this.socket.on('functionResponse', (dataArg) => {
|
|
135
|
+
// logger.log('info', `received response for request with id ${dataArg.shortId}`);
|
|
136
|
+
const targetSocketRequest = SocketRequest.getSocketRequestById(this.smartsocketRef, dataArg.shortId);
|
|
137
|
+
targetSocketRequest.handleResponse(dataArg);
|
|
138
|
+
});
|
|
139
|
+
this.socket.on('updateTagStore', async (tagStoreArg) => {
|
|
140
|
+
if (!plugins.smartjson.deepEqualObjects(this.tagStore, tagStoreArg)) {
|
|
141
|
+
this.tagStore = tagStoreArg;
|
|
142
|
+
this.socket.emit('updateTagStore', this.tagStore);
|
|
143
|
+
this.tagStoreObservable.next(this.tagStore);
|
|
144
|
+
}
|
|
145
|
+
this.remoteTagStoreObservable.next(tagStoreArg);
|
|
146
|
+
});
|
|
147
|
+
logger.log('info', `now listening to function requests for ${this.alias} on side ${this.side}`);
|
|
148
|
+
done.resolve(this);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const errMessage = 'socket needs to be authenticated first';
|
|
152
|
+
logger.log('error', errMessage);
|
|
153
|
+
done.reject(errMessage);
|
|
154
|
+
}
|
|
155
|
+
return done.promise;
|
|
156
|
+
}
|
|
157
|
+
// disconnecting ----------------------
|
|
158
|
+
async disconnect() {
|
|
159
|
+
this.socket.disconnect(true);
|
|
160
|
+
this.updateStatus('disconnected');
|
|
161
|
+
}
|
|
162
|
+
updateStatus(statusArg) {
|
|
163
|
+
if (this.eventStatus !== statusArg) {
|
|
164
|
+
this.eventSubject.next(statusArg);
|
|
165
|
+
}
|
|
166
|
+
this.eventStatus = statusArg;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRjb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRjb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBOEIsK0JBQStCLENBQUM7QUFDOUQsT0FBNEIsdUJBQXVCLENBQUM7QUFFcEQsaUJBQWlCO0FBQ2pCLE9BQTRCLHNDQUFzQyxDQUFDO0FBQ25FLE9BQStCLHlDQUF5QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQTRCLE1BQU0sd0NBQXdDLENBQUM7QUFFakcsWUFBWTtBQUNaLE9BQWtDLDRDQUE0QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQTJCbEQsaUJBQWlCO0FBQ2pCLE1BQU0sQ0FBQyxJQUFJLG9CQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQW9CLENBQUM7QUFFaEY7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBYzNCLFlBQVksVUFBK0M7UUFYcEQsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFJL0IsaUJBQVksR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBZ0MsQ0FBQztRQUNoRixnQkFBVyxHQUFpQyxLQUFLLENBQUM7UUFFakQsYUFBUSxHQUF5QixFQUFFLENBQUM7UUFDckMsdUJBQWtCLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQXdCLENBQUM7UUFDOUUsNkJBQXdCLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQXdCLENBQUM7UUFHekYsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFD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
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as plugins from './smartsocket.plugins.js';
|
|
2
|
+
import { SocketConnection } from './smartsocket.classes.socketconnection.js';
|
|
3
|
+
import { Smartsocket } from './smartsocket.classes.smartsocket.js';
|
|
4
|
+
import { SmartsocketClient } from './smartsocket.classes.smartsocketclient.js';
|
|
5
|
+
/**
|
|
6
|
+
* interface of the contructor options of class SocketFunction
|
|
7
|
+
*/
|
|
8
|
+
export interface ISocketFunctionConstructorOptions<T extends plugins.typedrequestInterfaces.ITypedRequest> {
|
|
9
|
+
funcName: T['method'];
|
|
10
|
+
funcDef: TFuncDef<T>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* interface of the Socket Function call, in other words the object that routes a call to a function
|
|
14
|
+
*/
|
|
15
|
+
export interface ISocketFunctionCallDataRequest<T extends plugins.typedrequestInterfaces.ITypedRequest> {
|
|
16
|
+
funcName: T['method'];
|
|
17
|
+
funcDataArg: T['request'];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* interface of the Socket Function call, in other words the object that routes a call to a function
|
|
21
|
+
*/
|
|
22
|
+
export interface ISocketFunctionCallDataResponse<T extends plugins.typedrequestInterfaces.ITypedRequest> {
|
|
23
|
+
funcName: T['method'];
|
|
24
|
+
funcDataArg: T['response'];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* interface for function definition of SocketFunction
|
|
28
|
+
*/
|
|
29
|
+
export type TFuncDef<T extends plugins.typedrequestInterfaces.ITypedRequest> = (dataArg: T['request'], connectionArg: SocketConnection) => PromiseLike<T['response']>;
|
|
30
|
+
/**
|
|
31
|
+
* class that respresents a function that can be transparently called using a SocketConnection
|
|
32
|
+
*/
|
|
33
|
+
export declare class SocketFunction<T extends plugins.typedrequestInterfaces.ITypedRequest> {
|
|
34
|
+
static getSocketFunctionByName<Q extends plugins.typedrequestInterfaces.ITypedRequest>(smartsocketRefArg: Smartsocket | SmartsocketClient, functionNameArg: string): SocketFunction<Q>;
|
|
35
|
+
name: string;
|
|
36
|
+
funcDef: TFuncDef<T>;
|
|
37
|
+
/**
|
|
38
|
+
* the constructor for SocketFunction
|
|
39
|
+
*/
|
|
40
|
+
constructor(optionsArg: ISocketFunctionConstructorOptions<T>);
|
|
41
|
+
/**
|
|
42
|
+
* invokes the function of this SocketFunction
|
|
43
|
+
*/
|
|
44
|
+
invoke(dataArg: ISocketFunctionCallDataRequest<T>, socketConnectionArg: SocketConnection): Promise<ISocketFunctionCallDataResponse<T>>;
|
|
45
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import './smartsocket.plugins.js';
|
|
2
|
+
// import classes
|
|
3
|
+
import './smartsocket.classes.socketconnection.js';
|
|
4
|
+
import './smartsocket.classes.smartsocket.js';
|
|
5
|
+
import './smartsocket.classes.smartsocketclient.js';
|
|
6
|
+
// export classes
|
|
7
|
+
/**
|
|
8
|
+
* class that respresents a function that can be transparently called using a SocketConnection
|
|
9
|
+
*/
|
|
10
|
+
export class SocketFunction {
|
|
11
|
+
// STATIC
|
|
12
|
+
static getSocketFunctionByName(smartsocketRefArg, functionNameArg) {
|
|
13
|
+
return smartsocketRefArg.socketFunctions.findSync((socketFunctionArg) => {
|
|
14
|
+
return socketFunctionArg.name === functionNameArg;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* the constructor for SocketFunction
|
|
19
|
+
*/
|
|
20
|
+
constructor(optionsArg) {
|
|
21
|
+
this.name = optionsArg.funcName;
|
|
22
|
+
this.funcDef = optionsArg.funcDef;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* invokes the function of this SocketFunction
|
|
26
|
+
*/
|
|
27
|
+
async invoke(dataArg, socketConnectionArg) {
|
|
28
|
+
if (dataArg.funcName === this.name) {
|
|
29
|
+
const funcResponseData = {
|
|
30
|
+
funcName: this.name,
|
|
31
|
+
funcDataArg: await this.funcDef(dataArg.funcDataArg, socketConnectionArg),
|
|
32
|
+
};
|
|
33
|
+
return funcResponseData;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw new Error("SocketFunction.name does not match the data argument's .name!");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRmdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc29ja2V0ZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBeUIsMEJBQTBCLENBQUM7QUFFcEQsaUJBQWlCO0FBQ2pCLE9BQWlDLDJDQUEyQyxDQUFDO0FBQzdFLE9BQTRCLHNDQUFzQyxDQUFDO0FBQ25FLE9BQWtDLDRDQUE0QyxDQUFDO0FBMEMvRSxpQkFBaUI7QUFFakI7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUN6QixTQUFTO0lBQ0YsTUFBTSxDQUFDLHVCQUF1QixDQUNuQyxpQkFBa0QsRUFDbEQsZUFBdUI7UUFFdkIsT0FBTyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtZQUN0RSxPQUFPLGlCQUFpQixDQUFDLElBQUksS0FBSyxlQUFlLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBTUQ7O09BRUc7SUFDSCxZQUFZLFVBQWdEO1FBQzFELElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLE1BQU0sQ0FDakIsT0FBMEMsRUFDMUMsbUJBQXFDO1FBRXJDLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2xDLE1BQU0sZ0JBQWdCLEdBQXVDO2dCQUMzRCxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ25CLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQzthQUMxRSxDQUFDO1lBQ0YsT0FBTyxnQkFBZ0IsQ0FBQztTQUN6QjthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1NBQ2xGO0lBQ0gsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as plugins from './smartsocket.plugins.js';
|
|
2
|
+
import { ISocketFunctionCallDataRequest, ISocketFunctionCallDataResponse } from './smartsocket.classes.socketfunction.js';
|
|
3
|
+
import { SocketConnection } from './smartsocket.classes.socketconnection.js';
|
|
4
|
+
import { Smartsocket } from './smartsocket.classes.smartsocket.js';
|
|
5
|
+
import { SmartsocketClient } from './smartsocket.classes.smartsocketclient.js';
|
|
6
|
+
export type TSocketRequestStatus = 'new' | 'pending' | 'finished';
|
|
7
|
+
export type TSocketRequestSide = 'requesting' | 'responding';
|
|
8
|
+
/**
|
|
9
|
+
* interface of constructor of class SocketRequest
|
|
10
|
+
*/
|
|
11
|
+
export interface ISocketRequestConstructorOptions<T extends plugins.typedrequestInterfaces.ITypedRequest> {
|
|
12
|
+
side: TSocketRequestSide;
|
|
13
|
+
originSocketConnection: SocketConnection;
|
|
14
|
+
shortId: string;
|
|
15
|
+
funcCallData?: ISocketFunctionCallDataRequest<T>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* request object that is sent initially and may or may not receive a response
|
|
19
|
+
*/
|
|
20
|
+
export interface ISocketRequestDataObject<T extends plugins.typedrequestInterfaces.ITypedRequest> {
|
|
21
|
+
funcCallData: ISocketFunctionCallDataRequest<T> | ISocketFunctionCallDataResponse<T>;
|
|
22
|
+
shortId: string;
|
|
23
|
+
responseTimeout?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare class SocketRequest<T extends plugins.typedrequestInterfaces.ITypedRequest> {
|
|
26
|
+
static getSocketRequestById(smartsocketRef: Smartsocket | SmartsocketClient, shortIdArg: string): SocketRequest<any>;
|
|
27
|
+
status: TSocketRequestStatus;
|
|
28
|
+
side: TSocketRequestSide;
|
|
29
|
+
shortid: string;
|
|
30
|
+
originSocketConnection: SocketConnection;
|
|
31
|
+
funcCallData: ISocketFunctionCallDataRequest<T>;
|
|
32
|
+
done: plugins.smartpromise.Deferred<ISocketFunctionCallDataResponse<T>>;
|
|
33
|
+
smartsocketRef: Smartsocket | SmartsocketClient;
|
|
34
|
+
constructor(smartsocketRefArg: Smartsocket | SmartsocketClient, optionsArg: ISocketRequestConstructorOptions<T>);
|
|
35
|
+
/**
|
|
36
|
+
* dispatches a socketrequest from the requesting to the receiving side
|
|
37
|
+
*/
|
|
38
|
+
dispatch(): Promise<ISocketFunctionCallDataResponse<T>>;
|
|
39
|
+
/**
|
|
40
|
+
* handles the response that is received by the requesting side
|
|
41
|
+
*/
|
|
42
|
+
handleResponse(responseDataArg: ISocketRequestDataObject<T>): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* creates the response on the responding side
|
|
45
|
+
*/
|
|
46
|
+
createResponse(): Promise<void>;
|
|
47
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as plugins from './smartsocket.plugins.js';
|
|
2
|
+
// import interfaces
|
|
3
|
+
import { SocketFunction, } from './smartsocket.classes.socketfunction.js';
|
|
4
|
+
// import classes
|
|
5
|
+
import './smartsocket.classes.socketconnection.js';
|
|
6
|
+
import { logger } from './smartsocket.logging.js';
|
|
7
|
+
import './smartsocket.classes.smartsocket.js';
|
|
8
|
+
import './smartsocket.classes.smartsocketclient.js';
|
|
9
|
+
// export classes
|
|
10
|
+
export class SocketRequest {
|
|
11
|
+
// STATIC
|
|
12
|
+
static getSocketRequestById(smartsocketRef, shortIdArg) {
|
|
13
|
+
return smartsocketRef.socketRequests.findSync((socketRequestArg) => {
|
|
14
|
+
return socketRequestArg.shortid === shortIdArg;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
constructor(smartsocketRefArg, optionsArg) {
|
|
18
|
+
// INSTANCE
|
|
19
|
+
this.status = 'new';
|
|
20
|
+
this.done = plugins.smartpromise.defer();
|
|
21
|
+
this.smartsocketRef = smartsocketRefArg;
|
|
22
|
+
this.side = optionsArg.side;
|
|
23
|
+
this.shortid = optionsArg.shortId;
|
|
24
|
+
this.funcCallData = optionsArg.funcCallData;
|
|
25
|
+
this.originSocketConnection = optionsArg.originSocketConnection;
|
|
26
|
+
this.smartsocketRef.socketRequests.add(this);
|
|
27
|
+
}
|
|
28
|
+
// requesting --------------------------
|
|
29
|
+
/**
|
|
30
|
+
* dispatches a socketrequest from the requesting to the receiving side
|
|
31
|
+
*/
|
|
32
|
+
dispatch() {
|
|
33
|
+
const requestData = {
|
|
34
|
+
funcCallData: this.funcCallData,
|
|
35
|
+
shortId: this.shortid,
|
|
36
|
+
};
|
|
37
|
+
this.originSocketConnection.socket.emit('function', requestData);
|
|
38
|
+
return this.done.promise;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* handles the response that is received by the requesting side
|
|
42
|
+
*/
|
|
43
|
+
async handleResponse(responseDataArg) {
|
|
44
|
+
// logger.log('info', 'handling response!');
|
|
45
|
+
this.done.resolve(responseDataArg.funcCallData);
|
|
46
|
+
this.smartsocketRef.socketRequests.remove(this);
|
|
47
|
+
}
|
|
48
|
+
// responding --------------------------
|
|
49
|
+
/**
|
|
50
|
+
* creates the response on the responding side
|
|
51
|
+
*/
|
|
52
|
+
async createResponse() {
|
|
53
|
+
const targetSocketFunction = SocketFunction.getSocketFunctionByName(this.smartsocketRef, this.funcCallData.funcName);
|
|
54
|
+
if (!targetSocketFunction) {
|
|
55
|
+
logger.log('error', `There is no SocketFunction defined for ${this.funcCallData.funcName}`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// logger.log('info', `invoking ${targetSocketFunction.name}`);
|
|
59
|
+
targetSocketFunction
|
|
60
|
+
.invoke(this.funcCallData, this.originSocketConnection)
|
|
61
|
+
.then((resultData) => {
|
|
62
|
+
// logger.log('info', 'got resultData. Sending it to requesting party.');
|
|
63
|
+
const responseData = {
|
|
64
|
+
funcCallData: resultData,
|
|
65
|
+
shortId: this.shortid,
|
|
66
|
+
};
|
|
67
|
+
this.originSocketConnection.socket.emit('functionResponse', responseData);
|
|
68
|
+
this.smartsocketRef.socketRequests.remove(this);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sMEJBQTBCLENBQUM7QUFFcEQsb0JBQW9CO0FBQ3BCLE9BQU8sRUFDTCxjQUFjLEdBR2YsTUFBTSx5Q0FBeUMsQ0FBQztBQUVqRCxpQkFBaUI7QUFDakIsT0FBaUMsMkNBQTJDLENBQUM7QUFDN0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQTRCLHNDQUFzQyxDQUFDO0FBQ25FLE9BQWtDLDRDQUE0QyxDQUFDO0FBMkIvRSxpQkFBaUI7QUFDakIsTUFBTSxPQUFPLGFBQWE7SUFDeEIsU0FBUztJQUNGLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDaEMsY0FBK0MsRUFDL0MsVUFBa0I7UUFFbEIsT0FBTyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDakUsT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQVlELFlBQ0UsaUJBQWtELEVBQ2xELFVBQStDO1FBWmpELFdBQVc7UUFDSixXQUFNLEdBQXlCLEtBQUssQ0FBQztRQUtyQyxTQUFJLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQXNDLENBQUM7UUFRN0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztRQUM1QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsVUFBVSxDQUFDLHNCQUFzQixDQUFDO1FBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsd0NBQXdDO0lBRXhDOztPQUVHO0lBQ0ksUUFBUTtRQUNiLE1BQU0sV0FBVyxHQUFnQztZQUMvQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3RCLENBQUM7UUFDRixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsY0FBYyxDQUFDLGVBQTRDO1FBQ3RFLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCx3Q0FBd0M7SUFFeEM7O09BRUc7SUFDSSxLQUFLLENBQUMsY0FBYztRQUN6QixNQUFNLG9CQUFvQixHQUFzQixjQUFjLENBQUMsdUJBQXVCLENBQ3BGLElBQUksQ0FBQyxjQUFjLEVBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUMzQixDQUFDO1FBRUYsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDBDQUEwQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDNUYsT0FBTztTQUNSO1FBQ0QsK0RBQStEO1FBQy9ELG9CQUFvQjthQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUM7YUFDdEQsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDbkIseUVBQXlFO1lBQ3pFLE1BQU0sWUFBWSxHQUFnQztnQkFDaEQsWUFBWSxFQUFFLFVBQVU7Z0JBQ3hCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTzthQUN0QixDQUFDO1lBQ0YsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import * as pluginsTyped from './smartsocket.pluginstyped.js';
|
|
4
|
+
import { Smartsocket } from './smartsocket.classes.smartsocket.js';
|
|
5
|
+
/**
|
|
6
|
+
* class socketServer
|
|
7
|
+
* handles the attachment of socketIo to whatever server is in play
|
|
8
|
+
*/
|
|
9
|
+
export declare class SocketServer {
|
|
10
|
+
private smartsocket;
|
|
11
|
+
private httpServerDeferred;
|
|
12
|
+
private httpServer;
|
|
13
|
+
/**
|
|
14
|
+
* wether httpServer is standalone
|
|
15
|
+
*/
|
|
16
|
+
private standaloneServer;
|
|
17
|
+
constructor(smartSocketInstance: Smartsocket);
|
|
18
|
+
/**
|
|
19
|
+
* starts the server with another server
|
|
20
|
+
* also works with an express style server
|
|
21
|
+
*/
|
|
22
|
+
setExternalServer(serverType: 'smartexpress', serverArg: pluginsTyped.smartexpress.Server): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* gets the server for socket.io
|
|
25
|
+
*/
|
|
26
|
+
getServerForSocketIo(): Promise<pluginsTyped.http.Server<typeof pluginsTyped.http.IncomingMessage, typeof pluginsTyped.http.ServerResponse> | pluginsTyped.https.Server<typeof pluginsTyped.http.IncomingMessage, typeof pluginsTyped.http.ServerResponse>>;
|
|
27
|
+
/**
|
|
28
|
+
* starts listening to incoming sockets:
|
|
29
|
+
*/
|
|
30
|
+
start(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* closes the server
|
|
33
|
+
*/
|
|
34
|
+
stop(): Promise<void>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as plugins from './smartsocket.plugins.js';
|
|
2
|
+
import './smartsocket.pluginstyped.js';
|
|
3
|
+
// used in case no other server is supplied
|
|
4
|
+
import './smartsocket.classes.smartsocket.js';
|
|
5
|
+
import { logger } from './smartsocket.logging.js';
|
|
6
|
+
/**
|
|
7
|
+
* class socketServer
|
|
8
|
+
* handles the attachment of socketIo to whatever server is in play
|
|
9
|
+
*/
|
|
10
|
+
export class SocketServer {
|
|
11
|
+
constructor(smartSocketInstance) {
|
|
12
|
+
/**
|
|
13
|
+
* wether httpServer is standalone
|
|
14
|
+
*/
|
|
15
|
+
this.standaloneServer = false;
|
|
16
|
+
this.smartsocket = smartSocketInstance;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* starts the server with another server
|
|
20
|
+
* also works with an express style server
|
|
21
|
+
*/
|
|
22
|
+
async setExternalServer(serverType, serverArg) {
|
|
23
|
+
this.httpServerDeferred = plugins.smartpromise.defer();
|
|
24
|
+
await serverArg.startedPromise;
|
|
25
|
+
this.httpServer = serverArg.httpServer;
|
|
26
|
+
this.httpServerDeferred.resolve();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* gets the server for socket.io
|
|
30
|
+
*/
|
|
31
|
+
async getServerForSocketIo() {
|
|
32
|
+
if (this.httpServerDeferred) {
|
|
33
|
+
await this.httpServerDeferred.promise;
|
|
34
|
+
}
|
|
35
|
+
if (this.httpServer) {
|
|
36
|
+
return this.httpServer;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const httpModule = await this.smartsocket.smartenv.getSafeNodeModule('http');
|
|
40
|
+
this.httpServer = new httpModule.Server();
|
|
41
|
+
this.standaloneServer = true;
|
|
42
|
+
return this.httpServer;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* starts listening to incoming sockets:
|
|
47
|
+
*/
|
|
48
|
+
async start() {
|
|
49
|
+
const done = plugins.smartpromise.defer();
|
|
50
|
+
// handle http servers
|
|
51
|
+
// in case an external server has been set "this.standaloneServer" should be false
|
|
52
|
+
if (this.httpServer && this.standaloneServer) {
|
|
53
|
+
if (!this.smartsocket.options.port) {
|
|
54
|
+
logger.log('error', 'there should be a port specifed for smartsocket!');
|
|
55
|
+
throw new Error('there should be a port specified for smartsocket');
|
|
56
|
+
}
|
|
57
|
+
this.httpServer.listen(this.smartsocket.options.port, () => {
|
|
58
|
+
logger.log('success', `Server started in standalone mode on ${this.smartsocket.options.port}`);
|
|
59
|
+
done.resolve();
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
done.resolve();
|
|
64
|
+
}
|
|
65
|
+
// nothing else to do if express server is set
|
|
66
|
+
await done.promise;
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* closes the server
|
|
71
|
+
*/
|
|
72
|
+
async stop() {
|
|
73
|
+
if (this.httpServer) {
|
|
74
|
+
this.httpServer.close();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRzZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHNvY2tldC5jbGFzc2VzLnNvY2tldHNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQThCLCtCQUErQixDQUFDO0FBRTlELDJDQUEyQztBQUMzQyxPQUE0QixzQ0FBc0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFbEQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFVdkIsWUFBWSxtQkFBZ0M7UUFMNUM7O1dBRUc7UUFDSyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFHL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLGlCQUFpQixDQUM1QixVQUEwQixFQUMxQixTQUEyQztRQUUzQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2RCxNQUFNLFNBQVMsQ0FBQyxjQUFjLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsb0JBQW9CO1FBQy9CLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztTQUN2QztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDeEI7YUFBTTtZQUNMLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFMUMsc0JBQXNCO1FBQ3RCLGtGQUFrRjtRQUNsRixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLGtEQUFrRCxDQUFDLENBQUM7Z0JBQ3hFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQzthQUNyRTtZQUNELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ3pELE1BQU0sQ0FBQyxHQUFHLENBQ1IsU0FBUyxFQUNULHdDQUF3QyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FDeEUsQ0FBQztnQkFDRixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2hCO1FBRUQsOENBQThDO1FBQzlDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNuQixPQUFPO0lBQ1QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import * as plugins from './smartsocket.plugins.js';
|
|
2
|
+
export const logger = new plugins.smartlog.ConsoleLog();
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQubG9nZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmxvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUVwRCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDIn0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as typedrequestInterfaces from '@apiglobal/typedrequest-interfaces';
|
|
2
|
+
export { typedrequestInterfaces };
|
|
3
|
+
import * as isohash from '@pushrocks/isohash';
|
|
4
|
+
import * as isounique from '@pushrocks/isounique';
|
|
5
|
+
import * as lik from '@pushrocks/lik';
|
|
6
|
+
import * as smartenv from '@pushrocks/smartenv';
|
|
7
|
+
import * as smartjson from '@pushrocks/smartjson';
|
|
8
|
+
import * as smartlog from '@pushrocks/smartlog';
|
|
9
|
+
import * as smartdelay from '@pushrocks/smartdelay';
|
|
10
|
+
import * as smartpromise from '@pushrocks/smartpromise';
|
|
11
|
+
import * as smarttime from '@pushrocks/smarttime';
|
|
12
|
+
import * as smartrx from '@pushrocks/smartrx';
|
|
13
|
+
export { isohash, isounique, lik, smartenv, smartjson, smartlog, smartdelay, smartpromise, smarttime, smartrx, };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// apiglobal scope
|
|
2
|
+
import * as typedrequestInterfaces from '@apiglobal/typedrequest-interfaces';
|
|
3
|
+
export { typedrequestInterfaces };
|
|
4
|
+
// pushrocks scope
|
|
5
|
+
import * as isohash from '@pushrocks/isohash';
|
|
6
|
+
import * as isounique from '@pushrocks/isounique';
|
|
7
|
+
import * as lik from '@pushrocks/lik';
|
|
8
|
+
import * as smartenv from '@pushrocks/smartenv';
|
|
9
|
+
import * as smartjson from '@pushrocks/smartjson';
|
|
10
|
+
import * as smartlog from '@pushrocks/smartlog';
|
|
11
|
+
import * as smartdelay from '@pushrocks/smartdelay';
|
|
12
|
+
import * as smartpromise from '@pushrocks/smartpromise';
|
|
13
|
+
import * as smarttime from '@pushrocks/smarttime';
|
|
14
|
+
import * as smartrx from '@pushrocks/smartrx';
|
|
15
|
+
export { isohash, isounique, lik, smartenv, smartjson, smartlog, smartdelay, smartpromise, smarttime, smartrx, };
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCO0FBQ2xCLE9BQU8sS0FBSyxzQkFBc0IsTUFBTSxvQ0FBb0MsQ0FBQztBQUU3RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztBQUVsQyxrQkFBa0I7QUFDbEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEtBQUssU0FBUyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxHQUFHLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEtBQUssU0FBUyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxRQUFRLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxLQUFLLFVBQVUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssWUFBWSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sS0FBSyxTQUFTLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE9BQU8sTUFBTSxvQkFBb0IsQ0FBQztBQUU5QyxPQUFPLEVBQ0wsT0FBTyxFQUNQLFNBQVMsRUFDVCxHQUFHLEVBQ0gsUUFBUSxFQUNSLFNBQVMsRUFDVCxRQUFRLEVBQ1IsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1QsT0FBTyxHQUNSLENBQUMifQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type * as http from 'http';
|
|
2
|
+
import type * as https from 'https';
|
|
3
|
+
export { http, https };
|
|
4
|
+
import type * as smartexpress from '@pushrocks/smartexpress';
|
|
5
|
+
export { smartexpress };
|
|
6
|
+
import type { Socket as ServerSocket, Server as ServerServer } from 'socket.io';
|
|
7
|
+
import type { Socket as ClientSocket, connect as ClientIo } from 'socket.io-client';
|
|
8
|
+
export declare namespace socketIo {
|
|
9
|
+
type Socket = ServerSocket;
|
|
10
|
+
type Server = ServerServer;
|
|
11
|
+
}
|
|
12
|
+
export declare namespace socketIoClient {
|
|
13
|
+
type Socket = ClientSocket;
|
|
14
|
+
type connect = typeof ClientIo;
|
|
15
|
+
}
|
package/npmextra.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"gitzone": {
|
|
3
|
+
"projectType": "npm",
|
|
4
|
+
"module": {
|
|
5
|
+
"githost": "gitlab.com",
|
|
6
|
+
"gitscope": "pushrocks",
|
|
7
|
+
"gitrepo": "smartsocket",
|
|
8
|
+
"description": "easy and secure websocket communication",
|
|
9
|
+
"npmPackagename": "@pushrocks/smartsocket",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"projectDomain": "push.rocks"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"npmci": {
|
|
15
|
+
"npmGlobalTools": [],
|
|
16
|
+
"npmAccessLevel": "public"
|
|
17
|
+
}
|
|
18
|
+
}
|