Skip to content

Commit 7d51522

Browse files
committed
Neo.worker.Task #5263
1 parent b636d27 commit 7d51522

3 files changed

Lines changed: 112 additions & 32 deletions

File tree

src/DefaultConfig.mjs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,14 @@ const DefaultConfig = {
218218
* @type Boolean
219219
*/
220220
useSharedWorkers: false,
221+
/**
222+
* True will generate a new task worker, which can get filled with own expensive remote methods
223+
* @default false
224+
* @memberOf! module:Neo
225+
* @name config.useTaskWorker
226+
* @type Boolean
227+
*/
228+
useTaskWorker: false,
221229
/**
222230
* Adds global dom event listeners for mobile related events like rotate, swipe, tap
223231
* @default true

src/worker/Manager.mjs

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ class Manager extends Base {
8787
data: {
8888
fileName: devMode ? 'Data.mjs' : 'dataworker.js'
8989
},
90+
task: {
91+
fileName: devMode ? 'Task.mjs' : 'taskworker.js'
92+
},
9093
vdom: {
9194
fileName: devMode ? 'VDom.mjs' : 'vdomworker.js'
9295
}
@@ -124,7 +127,7 @@ class Manager extends Base {
124127
'message:readDom' : {fn: DomAccess.onReadDom, scope: DomAccess},
125128
'message:registerRemote' : {fn: me.onRegisterRemote, scope: me},
126129
'message:workerConstructed' : {fn: me.onWorkerConstructed, scope: me}
127-
});
130+
})
128131
}
129132

130133
/**
@@ -135,9 +138,10 @@ class Manager extends Base {
135138
Object.keys(this.workers).forEach(name => {
136139
if (!(
137140
name === 'canvas' && !NeoConfig.useCanvasWorker ||
141+
name === 'task' && !NeoConfig.useTaskWorker ||
138142
name === 'vdom' && !NeoConfig.useVdomWorker
139143
)) {
140-
this.sendMessage(name, msg);
144+
this.sendMessage(name, msg)
141145
}
142146
});
143147
}
@@ -163,7 +167,7 @@ class Manager extends Base {
163167

164168
me.activeWorkers++;
165169

166-
return worker;
170+
return worker
167171
}
168172

169173
/**
@@ -193,17 +197,18 @@ class Manager extends Base {
193197

194198
for ([key, value] of Object.entries(me.workers)) {
195199
if (key === 'canvas' && !config.useCanvasWorker ||
200+
key === 'task' && !config.useTaskWorker ||
196201
key === 'vdom' && !config.useVdomWorker
197202
) {
198-
continue;
203+
continue
199204
}
200205

201206
try {
202-
value.worker = me.createWorker(value);
207+
value.worker = me.createWorker(value)
203208
} catch (e) {
204209
document.body.innerHTML = e;
205210
me.stopCommunication = true;
206-
break;
211+
break
207212
}
208213

209214
me.sendMessage(key, {
@@ -223,13 +228,13 @@ class Manager extends Base {
223228
NeoConfig.hasTouchEvents = ('ontouchstart' in window) || (navigator.maxTouchPoints > 0);
224229

225230
if (window.Worker) {
226-
me.webWorkersEnabled = true;
231+
me.webWorkersEnabled = true
227232
} else {
228-
throw new Error('Your browser does not support Web Workers');
233+
throw new Error('Your browser does not support Web Workers')
229234
}
230235

231236
if (window.SharedWorker) {
232-
me.sharedWorkersEnabled = true;
237+
me.sharedWorkersEnabled = true
233238
}
234239
}
235240

@@ -239,10 +244,10 @@ class Manager extends Base {
239244
*/
240245
getWorker(name) {
241246
if (name === 'service') {
242-
return navigator.serviceWorker?.controller || this.serviceWorker;
247+
return navigator.serviceWorker?.controller || this.serviceWorker
243248
}
244249

245-
return name instanceof Worker ? name : this.workers[name].worker;
250+
return name instanceof Worker ? name : this.workers[name].worker
246251
}
247252

248253
/**
@@ -253,7 +258,7 @@ class Manager extends Base {
253258
action : 'loadApplication',
254259
path,
255260
resourcesPath: NeoConfig.resourcesPath
256-
});
261+
})
257262
}
258263

259264
/**
@@ -265,9 +270,9 @@ class Manager extends Base {
265270
me.constructedThreads++;
266271

267272
if (me.constructedThreads === me.activeWorkers) {
268-
NeoConfig.appPath && setTimeout(() => { // better save than sorry => all remotes need to be registered
273+
NeoConfig.appPath && setTimeout(() => { // better safe than sorry => all remotes need to be registered
269274
me.loadApplication(NeoConfig.appPath);
270-
}, NeoConfig.loadApplicationDelay);
275+
}, NeoConfig.loadApplicationDelay)
271276
}
272277
}
273278

@@ -277,7 +282,7 @@ class Manager extends Base {
277282
*/
278283
onWorkerError(e) {
279284
// starting a worker from a JS module will show JS errors in a correct way
280-
!devMode && console.log('Worker Error:', e);
285+
!devMode && console.log('Worker Error:', e)
281286
}
282287

283288
/**
@@ -307,12 +312,12 @@ class Manager extends Base {
307312
// we want to delay the message until the rendering queue has processed it
308313
// see: https://github.com/neomjs/neo/issues/2864
309314
me.promiseForwardMessage(data).then(msgData => {
310-
me.sendMessage(msgData.destination, msgData);
311-
});
315+
me.sendMessage(msgData.destination, msgData)
316+
})
312317
}
313318
} else {
314319
if (data.destination === 'main') {
315-
data = data.data;
320+
data = data.data
316321
}
317322

318323
promise[data.reject ? 'reject' : 'resolve'](data);
@@ -322,7 +327,7 @@ class Manager extends Base {
322327

323328
if (dest !== 'main' && action !== 'reply') {
324329
if (data.transfer) {
325-
transfer = [data.transfer];
330+
transfer = [data.transfer]
326331
}
327332

328333
me.promiseMessage(dest, data, transfer).then(response => {
@@ -333,8 +338,8 @@ class Manager extends Base {
333338
reject : true,
334339
replyId: data.id,
335340
error : err.message
336-
});
337-
});
341+
})
342+
})
338343
}
339344

340345
// only needed for SharedWorkers
@@ -344,11 +349,11 @@ class Manager extends Base {
344349
me.broadcast({
345350
action : 'registerApp',
346351
appName: data.appName
347-
});
352+
})
348353
}
349354

350355
else if (dest === 'main' && action === 'remoteMethod') {
351-
me.onRemoteMethod(data);
356+
me.onRemoteMethod(data)
352357
}
353358
}
354359

@@ -359,8 +364,8 @@ class Manager extends Base {
359364
*/
360365
promiseForwardMessage(data) {
361366
return new Promise((resolve, reject) => {
362-
this.promises[data.replyId] = { data, reject, resolve };
363-
});
367+
this.promises[data.replyId] = { data, reject, resolve }
368+
})
364369
}
365370

366371
/**
@@ -378,8 +383,8 @@ class Manager extends Base {
378383
let message = me.sendMessage(dest, opts, transfer),
379384
msgId = message.id;
380385

381-
me.promises[msgId] = { reject, resolve };
382-
});
386+
me.promises[msgId] = { reject, resolve }
387+
})
383388
}
384389

385390
/**
@@ -391,7 +396,7 @@ class Manager extends Base {
391396

392397
if (promise) {
393398
promise.resolve(promise.data);
394-
delete this.promises[replyId];
399+
delete this.promises[replyId]
395400
}
396401
}
397402
}
@@ -412,21 +417,21 @@ class Manager extends Base {
412417
if (!me.stopCommunication) {
413418
if (opts.channelPort) {
414419
worker = opts.channelPort;
415-
delete opts.channelPort;
420+
delete opts.channelPort
416421
} else {
417-
worker = me.getWorker(dest);
422+
worker = me.getWorker(dest)
418423
}
419424

420425
if (!worker) {
421-
throw new Error('Called sendMessage for a worker that does not exist: ' + dest);
426+
throw new Error('Called sendMessage for a worker that does not exist: ' + dest)
422427
}
423428

424429
opts.destination = dest;
425430

426431
message = new Message(opts);
427432

428433
(worker.port ? worker.port : worker).postMessage(message, transfer);
429-
return message;
434+
return message
430435
}
431436
}
432437
}

src/worker/Task.mjs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import Neo from '../Neo.mjs';
2+
import Base from './Base.mjs';
3+
import * as core from '../core/_export.mjs';
4+
5+
/**
6+
* The Task worker can get filled with custom remote methods as needed.
7+
* To activate it, set useTaskWorker to true inside your neo-config.json and add a task.mjs file as the entry point.
8+
* @class Neo.worker.Task
9+
* @extends Neo.worker.Base
10+
* @singleton
11+
*/
12+
class Task extends Base {
13+
static config = {
14+
/**
15+
* @member {String} className='Neo.worker.Task'
16+
* @protected
17+
*/
18+
className: 'Neo.worker.Task',
19+
/**
20+
* @member {Boolean} singleton=true
21+
* @protected
22+
*/
23+
singleton: true,
24+
/**
25+
* @member {String} workerId='task'
26+
* @protected
27+
*/
28+
workerId: 'task'
29+
}
30+
31+
/**
32+
*
33+
*/
34+
afterConnect() {
35+
let me = this,
36+
channel = new MessageChannel(),
37+
{port1, port2} = channel;
38+
39+
port1.onmessage = me.onMessage.bind(me);
40+
41+
me.sendMessage('app', {action: 'registerPort', transfer: port2}, [port2]);
42+
43+
me.channelPorts.app = port1
44+
}
45+
46+
/**
47+
* @param {Object} msg
48+
*/
49+
onRegisterNeoConfig(msg) {
50+
super.onRegisterNeoConfig(msg);
51+
52+
let path = Neo.config.appPath.slice(0, -8); // removing "/app.mjs"
53+
54+
import(
55+
/* webpackInclude: /\/task.mjs$/ */
56+
/* webpackExclude: /\/node_modules/ */
57+
/* webpackMode: "lazy" */
58+
`../../${path}/task.mjs`
59+
).then(module => {
60+
module.onStart()
61+
})
62+
}
63+
}
64+
65+
let instance = Neo.setupClass(Task);
66+
67+
export default instance;

0 commit comments

Comments
 (0)