@aj-shadow/z-abs-corelayer-server 0.0.0-aj-beta.221

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.
Files changed (87) hide show
  1. package/.gitattributes +26 -0
  2. package/LICENSE.txt +96 -0
  3. package/README.md +5 -0
  4. package/npm-shrinkwrap.json +13 -0
  5. package/package.json +10 -0
  6. package/project/server/_build/Server-CoreLayer-server.bld +12 -0
  7. package/project/server/_build/z-abs-corelayer-server.prj +12 -0
  8. package/project/server/communication/core-protocol/decoder.js +404 -0
  9. package/project/server/communication/core-protocol/encoder.js +503 -0
  10. package/project/server/communication/messages/messages-s-to-c/message-persistent-init-response.js +14 -0
  11. package/project/server/communication/messages/messages-s-to-c/message-persistent-publish.js +16 -0
  12. package/project/server/communication/messages/messages-s-to-c/message-ws-init.js +14 -0
  13. package/project/server/communication/messages/messages-s-to-s/service-init-request.js +17 -0
  14. package/project/server/communication/messages/messages-s-to-s/service-init-response.js +18 -0
  15. package/project/server/communication/messages/messages-s-to-s/service-offer-off.js +15 -0
  16. package/project/server/communication/messages/messages-s-to-s/service-offer-on.js +15 -0
  17. package/project/server/communication/messages/messages-s-to-s/worker-init-request.js +15 -0
  18. package/project/server/data-response.js +588 -0
  19. package/project/server/high-resolution-timestamp.js +36 -0
  20. package/project/server/log/log-config.js +107 -0
  21. package/project/server/log/log-types.js +14 -0
  22. package/project/server/log/logger-console.js +36 -0
  23. package/project/server/log/logger.js +114 -0
  24. package/project/server/node/channel-input.js +65 -0
  25. package/project/server/node/channel-output.js +39 -0
  26. package/project/server/node/clients.js +80 -0
  27. package/project/server/node/connection-address.js +24 -0
  28. package/project/server/node/connection-data-ip.js +82 -0
  29. package/project/server/node/connection-data.js +25 -0
  30. package/project/server/node/const.js +44 -0
  31. package/project/server/node/external-services.js +209 -0
  32. package/project/server/node/http-cache.js +109 -0
  33. package/project/server/node/http-proxy.js +97 -0
  34. package/project/server/node/http-request-handler.js +219 -0
  35. package/project/server/node/http-server.js +36 -0
  36. package/project/server/node/http2-server.js +67 -0
  37. package/project/server/node/https-server.js +63 -0
  38. package/project/server/node/ip-client.js +98 -0
  39. package/project/server/node/ip-server.js +63 -0
  40. package/project/server/node/ip-subscription.js +46 -0
  41. package/project/server/node/message-channel.js +98 -0
  42. package/project/server/node/node-admin.js +513 -0
  43. package/project/server/node/node-data.js +25 -0
  44. package/project/server/node/node-settings.js +352 -0
  45. package/project/server/node/node-worker.js +76 -0
  46. package/project/server/node/node.js +156 -0
  47. package/project/server/node/servers.js +168 -0
  48. package/project/server/node/ws-client.js +12 -0
  49. package/project/server/node/ws-server.js +20 -0
  50. package/project/server/node/ws-web-server.js +52 -0
  51. package/project/server/node/wss-server.js +20 -0
  52. package/project/server/node/wss-web-server.js +82 -0
  53. package/project/server/path/actor-path-build.js +29 -0
  54. package/project/server/path/actor-path-content.js +51 -0
  55. package/project/server/path/actor-path-creator.js +90 -0
  56. package/project/server/path/actor-path-data.js +487 -0
  57. package/project/server/path/actor-path-dist.js +132 -0
  58. package/project/server/path/actor-path-generated.js +202 -0
  59. package/project/server/path/actor-path-project.js +181 -0
  60. package/project/server/path/actor-path.js +57 -0
  61. package/project/server/path/paths/actor-content-paths.js +34 -0
  62. package/project/server/path/paths/actor-data-paths.js +302 -0
  63. package/project/server/path/paths/actor-generated-paths.js +99 -0
  64. package/project/server/path/paths/actor-paths.js +22 -0
  65. package/project/server/plugin-base-multi.js +484 -0
  66. package/project/server/plugin-base.js +233 -0
  67. package/project/server/plugin-component.js +92 -0
  68. package/project/server/plugin-data/client/plugin_data_ClientGet.js +18 -0
  69. package/project/server/plugin-data/dialog-file/plugin_data_DialogFileGet.js +197 -0
  70. package/project/server/plugin-data/platform/plugin_data_PlatformPing.js +19 -0
  71. package/project/server/plugin-factor-protocol.js +35 -0
  72. package/project/server/plugin-factory.js +127 -0
  73. package/project/server/plugin-lock.js +164 -0
  74. package/project/server/response-queue.js +46 -0
  75. package/project/server/responses.js +20 -0
  76. package/project/server/service/plugin-service.js +264 -0
  77. package/project/server/service/service-export.js +47 -0
  78. package/project/server/service/service-manager.js +270 -0
  79. package/project/server/service/service-requests.js +49 -0
  80. package/project/server/session-cache.js +39 -0
  81. package/project/server/session.js +23 -0
  82. package/project/server/worker/worker-channel.js +175 -0
  83. package/project/server/worker/worker-core.js +58 -0
  84. package/project/server/worker/worker-main.js +165 -0
  85. package/project/server/worker/worker-pool.js +94 -0
  86. package/project/server/worker/worker-thread.js +128 -0
  87. package/project/z-abs-corelayer-server.tree +99 -0
@@ -0,0 +1,175 @@
1
+
2
+ 'use strict';
3
+
4
+
5
+ class WorkerChannel {
6
+ constructor(id, type, port) {
7
+ this.id = id;
8
+ this.type = type;
9
+ this.port = port;
10
+ this.responses = new Map();
11
+ this.currentResponseId = 0;
12
+ this.cbExitKill = null;
13
+ this.exitType = WorkerChannel.CB_NONE;
14
+ this.state = WorkerChannel.STATE_OPEN;
15
+ }
16
+
17
+ static MSG_COMMAND = 0;
18
+ static MSG_REQUEST = 1;
19
+ static MSG_RESPONSE = 2;
20
+ static MSG_METHOD = 3;
21
+ static MSG_MESSAGE = 4;
22
+
23
+ static MSG_TYPES = ['COMMAND', 'REQUEST', 'RESPONSE', 'METHOD', 'MESSAGE'];
24
+
25
+ static STATE_OPEN = 0;
26
+ static STATE_STOPPED = 1;
27
+ static STATE_KILLED = 2;
28
+
29
+ static TYPE_MAIN = 0;
30
+ static TYPE_THREAD = 1;
31
+ static TYPES = ['MAIN', 'THREAD'];
32
+
33
+ static CB_NONE = -1;
34
+ static CB_EXIT = 0;
35
+ static CB_KILL = 1;
36
+
37
+ start() {
38
+ this.state = WorkerChannel.STATE_OPEN;
39
+ }
40
+
41
+ stop(cbExit) {
42
+ if(0 === this.responses.size) {
43
+ cbExit(() => {
44
+ this.state = WorkerChannel.STATE_STOPPED;
45
+ });
46
+ }
47
+ else {
48
+ this.cbExitKill = cbExit;
49
+ this.exitType = WorkerChannel.CB_EXIT;
50
+ }
51
+ }
52
+
53
+ kill(cbKill) {
54
+ if(0 === this.responses.size) {
55
+ cbKill(() => {
56
+ this.state = WorkerChannel.STATE_KILLED;
57
+ });
58
+ }
59
+ else {
60
+ this.cbExitKill = cbKill;
61
+ this.exitType = WorkerChannel.CB_KILL;
62
+ }
63
+ }
64
+
65
+ dead(done) {
66
+ this.responses.forEach((response) => {
67
+ response.done();
68
+ });
69
+ process.nextTick(done);
70
+ }
71
+
72
+ command(msgId, done, transferList, ...params) {
73
+ const responseId = this.currentResponseId++;
74
+ this.responses.set(responseId, {
75
+ msgId,
76
+ type: 'request',
77
+ done
78
+ });
79
+ this.port.postMessage({
80
+ type: WorkerChannel.MSG_COMMAND,
81
+ msgId: msgId,
82
+ responseId: responseId,
83
+ params: params
84
+ }, transferList);
85
+ }
86
+
87
+ request(msgId, done, transferList, ...params) {
88
+ if(WorkerChannel.STATE_OPEN === this.state) {
89
+ const responseId = this.currentResponseId++;
90
+ this.responses.set(responseId, {
91
+ msgId,
92
+ type: 'request',
93
+ done
94
+ });
95
+ this.port.postMessage({
96
+ type: WorkerChannel.MSG_REQUEST,
97
+ msgId: msgId,
98
+ responseId: responseId,
99
+ params: params
100
+ }, transferList);
101
+ }
102
+ else {
103
+ ddb.warning(this.id, 'Channel not open(request).', msgId, params);
104
+ process.nextTick(done, new Error('Channel not open.'), msgId, params);
105
+ }
106
+ }
107
+
108
+ response(message, ...params) {
109
+ this.port.postMessage({
110
+ type: WorkerChannel.MSG_RESPONSE,
111
+ responseId: message.responseId,
112
+ msgId: message.msgId,
113
+ params: params
114
+ });
115
+ }
116
+
117
+ method(msgId, done, transferList, ...params) {
118
+ if(WorkerChannel.STATE_OPEN === this.state) {
119
+ const responseId = this.currentResponseId++;
120
+ this.responses.set(responseId, {
121
+ msgId,
122
+ type: 'method',
123
+ done
124
+ });
125
+ this.port.postMessage({
126
+ type: WorkerChannel.MSG_METHOD,
127
+ msgId: msgId,
128
+ responseId: responseId,
129
+ params: params
130
+ }, transferList);
131
+ }
132
+ else {
133
+ ddb.warning(this.id, 'Channel not open(method).', msgId, params);
134
+ process.nextTick(done, new Error('Channel not open(method).'));
135
+ }
136
+ }
137
+
138
+ message(msgId, transferList, ...params) {
139
+ if(WorkerChannel.STATE_OPEN === this.state) {
140
+ this.port.postMessage({
141
+ type: WorkerChannel.MSG_MESSAGE,
142
+ msgId: msgId,
143
+ params: params
144
+ }, transferList);
145
+ }
146
+ else {
147
+ ddb.warning(this.id, 'Channel not open(message).', msgId, params);
148
+ }
149
+ }
150
+
151
+ handleResponse(message, cb) {
152
+ const cbResponse = this.responses.get(message.responseId);
153
+ if(cb) {
154
+ cb(message.msgId, ...message.params);
155
+ }
156
+ if(cbResponse) {
157
+ this.responses.delete(message.responseId);
158
+ cbResponse.done(...message.params);
159
+ if(this.cbExitKill) {
160
+ if(0 === this.responses.size) {
161
+ if(WorkerChannel.STATE_KILLED === this.state) {
162
+ }
163
+ this.cbExitKill(() => {
164
+ this.state = this.exitType;
165
+ });
166
+ this.cbExitKill = null;
167
+ this.exitType = WorkerChannel.CB_NONE;
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+
174
+
175
+ module.exports = WorkerChannel;
@@ -0,0 +1,58 @@
1
+
2
+ 'use strict';
3
+
4
+ const HighResolutionTimestamp = require('../high-resolution-timestamp');
5
+ const { Worker, isMainThread, parentPort, workerData, threadId } = require('worker_threads');
6
+
7
+ if(isMainThread) {
8
+
9
+ class WorkerCore {
10
+ constructor(typeName, instanceId, factoryThreadPath, workerPool) {
11
+ this.typeName = typeName;
12
+ this.instanceId = instanceId;
13
+ this.factoryThreadPath = factoryThreadPath;
14
+ this.workerPool = workerPool;
15
+ this.id = -1;
16
+ this.worker = null;
17
+ this.error = null;
18
+ }
19
+
20
+ start(cbExit) {
21
+ const releaseData = Reflect.get(global, 'release-data@actorjs_global');
22
+ this.worker = new Worker(__filename, {
23
+ workerData: {
24
+ appName: releaseData.appName,
25
+ releaseStep: releaseData.releaseStep,
26
+ organization: releaseData.organization,
27
+ path: this.factoryThreadPath,
28
+ dateStamp: HighResolutionTimestamp.dateStamp,
29
+ timeStamp: HighResolutionTimestamp.timeStamp
30
+ }
31
+ });
32
+ this.worker.on('exit', (exitCode) => {
33
+ this.worker = null;
34
+ //ddb.info(`Worker[${this.id}] exitCode:${exitCode}`, this.typeName);
35
+ process.nextTick(cbExit, exitCode);
36
+ });
37
+ this.worker.on('error', (err) => {
38
+ console.log(`WORKER ERROR[${this.typeName}:${this.id}]:`, err.valueOf());
39
+ ddb.error(`WORKER ERROR[${this.typeName}:${this.id}]:`, err);
40
+ this.error = err;
41
+ });
42
+ }
43
+ }
44
+
45
+ module.exports = WorkerCore;
46
+
47
+ }
48
+ else {
49
+ Reflect.set(global, 'release-data@actorjs_global', {
50
+ appName: workerData.appName,
51
+ releaseStep: workerData.releaseStep,
52
+ organization: workerData.organization
53
+ });
54
+ HighResolutionTimestamp.workerInit(workerData.dateStamp, workerData.timeStamp);
55
+ const workerThread = new (require(workerData.path))();
56
+ workerThread._init(parentPort);
57
+ }
58
+
@@ -0,0 +1,165 @@
1
+
2
+ 'use strict';
3
+
4
+ const WorkerChannel = require('./worker-channel');
5
+
6
+
7
+ class WorkerMain {
8
+ constructor() {
9
+ this.id = -1;
10
+ this.parentObject = null;
11
+ this.typeName = '';
12
+ this.instanceId = -1;
13
+ this.globalInstanceId = -1;
14
+ this.workerPool = null;
15
+ this.workerCore = null;
16
+ this.channel = null;
17
+ this.cbStart = null;
18
+ this.cbStop = null;
19
+ this.state = WorkerMain.STATE_NONE;
20
+ }
21
+
22
+ static STATE_NONE = 0;
23
+ static STATE_STARTED = 1;
24
+ static STATED_STOPPED = 2;
25
+ static STATED_KILLED = 3;
26
+ static STATES = ['NONE', 'STARTED', 'STOPPED', 'KILLED'];
27
+
28
+ _init(typeName, instanceId, globalInstanceId, workerPool, workerCore) {
29
+ this.typeName = typeName;
30
+ this.instanceId = instanceId;
31
+ this.globalInstanceId = globalInstanceId;
32
+ this.workerPool = workerPool;
33
+ this.workerCore = workerCore;
34
+ }
35
+
36
+ start(id, parentObject, cbStart, cbStop) {
37
+ this.id = id;
38
+ this.workerCore.id = id;
39
+ this.parentObject = parentObject;
40
+ this.cbStart = cbStart;
41
+ this.cbStop = cbStop;
42
+ if(WorkerMain.STATE_NONE !== this.state && WorkerMain.STATED_STOPPED !== this.state) {
43
+ process.nextTick((self, WorkerMain) => {
44
+ if(self.cbStart) {
45
+ self.cbStart(new Error(`Can not start Worker in state: '${WorkerMain.STATES[self.state]}'.`));
46
+ self.cbStart = null;
47
+ }
48
+ }, this, WorkerMain);
49
+ return;
50
+ }
51
+ if(null === this.channel) {
52
+ this.workerCore.start((exitCode) => {
53
+ this.state = WorkerMain.STATED_KILLED;
54
+ if(this.cbStop) {
55
+ if(this.channel) {
56
+ this.channel.dead(() => {
57
+ if(this.cbStart) {
58
+ this.cbStart(new Error('Can not start Worker, it died. exitCode: ' + exitCode + '.'));
59
+ this.cbStart = null;
60
+ }
61
+ if(this.cbStop) {
62
+ this.cbStop(exitCode);
63
+ this.cbStop = null;
64
+ this.channel = null;
65
+ }
66
+ });
67
+ }
68
+ else {
69
+ this.cbStop(exitCode);
70
+ this.cbStop = null;
71
+ }
72
+ }
73
+ });
74
+ this.channel = new WorkerChannel(id, WorkerChannel.TYPE_MAIN, this.workerCore.worker);
75
+ this.workerCore.worker.on('message', (message) => {
76
+ if(WorkerChannel.MSG_RESPONSE === message.type) {
77
+ if(this.channel) {
78
+ this.channel.handleResponse(message);
79
+ }
80
+ else {
81
+ ddb.warning('DROPPED', message);
82
+ }
83
+ }
84
+ else {
85
+ const func = Reflect.get(this.parentObject, `on${message.msgId}`).bind(this.parentObject);
86
+ if(null !== func) {
87
+ if(WorkerChannel.MSG_MESSAGE === message.type) {
88
+ func(this.id, ...message.params);
89
+ }
90
+ else if(WorkerChannel.MSG_METHOD === message.type) {
91
+ func((err, ...params) => {
92
+ if(this.channel) {
93
+ this.channel.response(message, err, ...params);
94
+ }
95
+ else {
96
+ ddb.warning('DROPPED', message);
97
+ }
98
+ }, ...message.params);
99
+ }
100
+ }
101
+ else {
102
+ ddb.error(`Error function 'on${message.msgId}' not found.`);
103
+ }
104
+ }
105
+ });
106
+ }
107
+ this.channel.start(this.id);
108
+ this.channel.command('start', (err) => {
109
+ this.state = WorkerMain.STATE_STARTED;
110
+ if(this.cbStart) {
111
+ this.cbStart(err);
112
+ this.cbStart = null;
113
+ }
114
+ }, undefined, id);
115
+ }
116
+
117
+ stop(done) {
118
+ if(WorkerMain.STATE_STARTED !== this.state) {
119
+ process.nextTick(done);
120
+ return;
121
+ }
122
+ this.channel.stop((cbStopped) => {
123
+ this.channel.command('stop', (err) => {
124
+ cbStopped();
125
+ this.state = WorkerMain.STATED_STOPPED;
126
+ if(this.cbStop) {
127
+ this.cbStop(-1);
128
+ this.cbStop = null;
129
+ }
130
+ if(!err && !this.workerCore.error) {
131
+ //this.id = -1;
132
+ this.workerCore.id = -1;
133
+ this.workerPool.store(this);
134
+ }
135
+ else {
136
+ this.channel = null;
137
+ }
138
+ done(err);
139
+ }, undefined);
140
+ });
141
+ }
142
+
143
+ kill(done) {
144
+ if(WorkerMain.STATE_STARTED !== this.state && WorkerMain.STATED_STOPPED !== this.state) {
145
+ process.nextTick(done);
146
+ return;
147
+ }
148
+ if(this.channel) {
149
+ this.channel.kill((cbKilled) => {
150
+ this.channel.command('kill', (err) => {
151
+ cbKilled();
152
+ this.state = WorkerMain.STATED_KILLED;
153
+ this.channel = null;
154
+ done(err);
155
+ }, undefined);
156
+ });
157
+ }
158
+ else {
159
+ process.nextTick(done);
160
+ }
161
+ }
162
+ }
163
+
164
+
165
+ module.exports = WorkerMain;
@@ -0,0 +1,94 @@
1
+
2
+ 'use strict';
3
+
4
+ const WorkerCore = require('./worker-core');
5
+
6
+
7
+ class WorkerPool {
8
+ constructor() {
9
+ if(1 === ++WorkerPool.global.instancesPool) {
10
+ WorkerPool.global.intervalId = setInterval((workersQueue) => {
11
+ workersQueue.forEach((workersTypeData, typeName) => {
12
+ const now = process.hrtime.bigint();
13
+ while(1 <= workersTypeData.queue.length) {
14
+ let timestamp = workersTypeData.queue[0].timestamp;
15
+ if(now - timestamp < WorkerPool.TIMEOUT_BIG) {
16
+ break;
17
+ }
18
+ else {
19
+ const workerMain = workersTypeData.queue.shift().workerMain;
20
+ workerMain.kill(() => {
21
+ WorkerPool.global.workersInstances.delete(workerMain.globalInstanceId);
22
+ });
23
+ }
24
+ }
25
+ });
26
+ }, WorkerPool.TIMEOUT, WorkerPool.global.workersQueue);
27
+ }
28
+ }
29
+
30
+ static global = {
31
+ workersQueue: new Map(),
32
+ workersInstances: new Map(),
33
+ instancesPool: 0,
34
+ instancesWorkes: 0,
35
+ intervalId: -1
36
+ };
37
+ static TIMEOUT = 256000;
38
+ static TIMEOUT_BIG = BigInt(1000000 * WorkerPool.TIMEOUT);
39
+
40
+ release() {
41
+ if(0 === --WorkerPool.global.instancesPool) {
42
+ clearInterval(WorkerPool.global.intervalId);
43
+ WorkerPool.global.intervalId = -1;
44
+ WorkerPool.global.workersQueue.forEach((workersTypeData, typeName) => {
45
+ const now = process.hrtime.bigint();
46
+ while(1 <= workersTypeData.queue.length) {
47
+ const workerMain = workersTypeData.queue.shift().workerMain;
48
+ workerMain.kill(() => {
49
+ WorkerPool.global.workersInstances.delete(workerMain.globalInstanceId);
50
+ });
51
+ }
52
+ });
53
+ }
54
+ }
55
+
56
+ getWorker(typeName, factoryMain, factoryThreadPath) {
57
+ let workersTypeData = WorkerPool.global.workersQueue.get(typeName);
58
+ if(!workersTypeData) {
59
+ workersTypeData = {
60
+ instanceId: -1,
61
+ queue: []
62
+ };
63
+ WorkerPool.global.workersQueue.set(typeName, workersTypeData);
64
+ }
65
+ if(0 === workersTypeData.queue.length) {
66
+ const globalInstanceId = ++WorkerPool.global.instancesWorkes;
67
+ const workerMain = new factoryMain();
68
+ WorkerPool.global.workersInstances.set(globalInstanceId, workerMain);
69
+ ++workersTypeData.instanceId;
70
+ workerMain._init(typeName, workersTypeData.instanceId, globalInstanceId, this, new WorkerCore(typeName, workersTypeData.instanceId, factoryThreadPath, this));
71
+ return workerMain;
72
+ }
73
+ else {
74
+ const workerData = workersTypeData.queue.shift();
75
+ return workerData.workerMain;
76
+ }
77
+ }
78
+
79
+ store(workerMain) {
80
+ const workersTypeData = WorkerPool.global.workersQueue.get(workerMain.typeName);
81
+ if(workersTypeData) {
82
+ workersTypeData.queue.push({
83
+ workerMain: workerMain,
84
+ timestamp: process.hrtime.bigint()
85
+ });
86
+ }
87
+ else {
88
+ ddb.error(`Can not reuse Worker not defined, typeName: '${workerMain.typeName}'`);
89
+ }
90
+ }
91
+ }
92
+
93
+
94
+ module.exports = WorkerPool;
@@ -0,0 +1,128 @@
1
+
2
+ 'use strict';
3
+
4
+ const WorkerChannel = require('./worker-channel');
5
+
6
+
7
+ class WorkerThread {
8
+ constructor() {
9
+ this.id = -1;
10
+ this.channel = null;
11
+ this.parentPort = null;
12
+ this.state = WorkerThread.STATE_NONE;
13
+ }
14
+
15
+ static STATE_NONE = 0;
16
+ static STATE_STARTED = 1;
17
+ static STATED_STOPPED = 2;
18
+ static STATED_KILLED = 3;
19
+ static STATES = ['NONE', 'STARTED', 'STOPPED', 'KILLED'];
20
+
21
+ handleCommand(message) {
22
+ if('start' === message.msgId) {
23
+ this.state = WorkerThread.STATE_STARTED;
24
+ this.id = message.params[0];
25
+ this.channel.start(this.id);
26
+ if(this.onStart) {
27
+ this.channel.id = this.id;
28
+ this.onStart(this.id, () => {
29
+ this.channel.response(message);
30
+ });
31
+ }
32
+ else {
33
+ process.nextTick((self) => {
34
+ self.channel.response(message);
35
+ }, this);
36
+ }
37
+ }
38
+ else if('stop' === message.msgId) {
39
+ this.channel.stop((cbStopped) => {
40
+ if(this.onStop) {
41
+ this.onStop(() => {
42
+ this.state = WorkerThread.STATED_STOPPED;
43
+ this.channel.response(message);
44
+ cbStopped();
45
+ });
46
+ }
47
+ else {
48
+ this.state = WorkerThread.STATED_STOPPED;
49
+ process.nextTick((self, message, cbStopped) => {
50
+ self.channel.response(message);
51
+ cbStopped();
52
+ }, this, message, cbStopped);
53
+ }
54
+ });
55
+ }
56
+ else if('kill' === message.msgId) {
57
+ this.state = WorkerThread.STATED_KILLED;
58
+ this.channel.kill((cbKilled) => {
59
+ this.parentPort.unref();
60
+ this.parentPort = null;
61
+ this.channel.response(message);
62
+ cbKilled();
63
+ });
64
+ }
65
+ }
66
+
67
+ handleRequest(message) {
68
+ const func = Reflect.get(this, message.msgId).bind(this);
69
+ if(func) {
70
+ func(...message.params, (...params) => {
71
+ this.channel.response(message, ...params);
72
+ });
73
+ }
74
+ else {
75
+ throw new Error(`Not Implemented. '${message.msgId}'`);
76
+ }
77
+ }
78
+
79
+ _init(parentPort) {
80
+ this.parentPort = parentPort;
81
+ this.channel = new WorkerChannel(-1, WorkerChannel.TYPE_THREAD, parentPort);
82
+ parentPort.on('message', (message) => {
83
+ if(WorkerChannel.MSG_COMMAND === message.type) {
84
+ try {
85
+ this.handleCommand(message);
86
+ }
87
+ catch(err) {
88
+ ddb.error(err.message);
89
+ this.channel.response(message, err);
90
+ }
91
+ }
92
+ else if(WorkerChannel.MSG_REQUEST === message.type) {
93
+ try {
94
+ this.handleRequest(message);
95
+ }
96
+ catch(err) {
97
+ ddb.error(err.message);
98
+ this.channel.response(message, err);
99
+ }
100
+ }
101
+ else if(WorkerChannel.MSG_RESPONSE === message.type) {
102
+ try {
103
+ this.channel.handleResponse(message);
104
+ }
105
+ catch(err) {
106
+ ddb.error(err);
107
+ }
108
+ }
109
+ else if(WorkerChannel.MSG_MESSAGE === message.type) {
110
+ try {
111
+ ddb.error('Not Implemented.');
112
+ }
113
+ catch(err) {
114
+ ddb.error(err);
115
+ }
116
+ }
117
+ else {
118
+ ddb.warning('DROPPED message. type = ', WorkerChannel.MSG_TYPES[message.type]);
119
+ }
120
+ });
121
+ parentPort.on('messageerror', (err) => {
122
+ ddb.error('messageerror', err);
123
+ });
124
+ }
125
+ }
126
+
127
+
128
+ module.exports = WorkerThread;