/* Post a message to this worker. Note: the worker is the destination worker which may be the parent. function postMessage(data: Object, ports: Array = null): Void */ static EjsObj *workerPostMessage(Ejs *ejs, EjsWorker *worker, int argc, EjsObj **argv) { EjsString *data; EjsWorker *target; MprDispatcher *dispatcher; Message *msg; if (worker->state >= EJS_WORKER_CLOSED) { ejsThrowStateError(ejs, "Worker has completed"); return 0; } /* Create the event with serialized data in the originating interpreter. It owns the data. */ ejsBlockGC(ejs); if ((data = ejsToJSON(ejs, argv[0], NULL)) == 0) { ejsThrowArgError(ejs, "Cannot serialize message data"); return 0; } if ((msg = createMessage()) == 0) { ejsThrowMemoryError(ejs); return 0; } target = worker->pair; msg->data = ejsToMulti(ejs, data); msg->worker = target; msg->callback = "onmessage"; msg->callbackSlot = ES_Worker_onmessage; dispatcher = target->ejs->dispatcher; mprCreateEvent(dispatcher, "postMessage", 0, doMessage, msg, 0); return 0; }
/* function preload(path: Path): Object NOTE: this blocks. */ static EjsObj *workerPreload(Ejs *ejs, EjsWorker *worker, int argc, EjsObj **argv) { Ejs *inside; EjsWorker *insideWorker; EjsString *result; assert(argc > 0 && ejsIs(ejs, argv[0], Path)); assert(!worker->inside); if (worker->state > EJS_WORKER_BEGIN) { ejsThrowStateError(ejs, "Worker has already started"); return 0; } insideWorker = worker->pair; assert(insideWorker->inside); inside = insideWorker->ejs; loadFile(worker->pair, ((EjsPath*) argv[0])->value); if (inside->exception) { handleError(ejs, worker, inside->exception, 1); return 0; } result = ejsToJSON(inside, inside->result, NULL); if (result == 0) { return ESV(null); } return ejsDeserialize(ejs, result); }
/* function preeval(script: String): Object NOTE: this blocks. */ static EjsObj *workerPreeval(Ejs *ejs, EjsWorker *worker, int argc, EjsObj **argv) { Ejs *inside; EjsWorker *insideWorker; EjsString *result; assert(!worker->inside); if (worker->state > EJS_WORKER_BEGIN) { ejsThrowStateError(ejs, "Worker has already started"); return 0; } insideWorker = worker->pair; assert(insideWorker->inside); inside = insideWorker->ejs; (inside->service->loadScriptLiteral)(inside, (EjsString*) argv[0], NULL); if (inside->exception) { handleError(ejs, worker, inside->exception, 1); return 0; } result = ejsToJSON(inside, inside->result, NULL); if (result == 0) { return ESV(null); } return ejsDeserialize(ejs, result); }
/* Start a worker thread. This is called by eval() and load(). Not by preload() or by Worker(). It always joins. */ static EjsObj *startWorker(Ejs *ejs, EjsWorker *outsideWorker, int timeout) { EjsWorker *insideWorker; Ejs *inside; EjsString *result; assert(ejs); assert(outsideWorker); assert(!outsideWorker->inside); assert(outsideWorker->state == EJS_WORKER_BEGIN); assert(outsideWorker->pair); assert(outsideWorker->pair->ejs); mprTrace(5, "Worker.startWorker"); if (outsideWorker->state > EJS_WORKER_BEGIN) { ejsThrowStateError(ejs, "Worker has already started"); return 0; } insideWorker = outsideWorker->pair; assert(insideWorker->inside); assert(insideWorker->state == EJS_WORKER_BEGIN); inside = insideWorker->ejs; outsideWorker->state = EJS_WORKER_STARTED; if (mprCreateEvent(inside->dispatcher, "workerMain", 0, (MprEventProc) workerMain, insideWorker, 0) < 0) { ejsThrowStateError(ejs, "Cannot create worker event"); return 0; } if (timeout == 0) { return ESV(undefined); } if (timeout < 0) { timeout = MAXINT; } if (join(ejs, (EjsObj*) outsideWorker, timeout) < 0) { return ESV(undefined); } result = ejsToJSON(inside, inside->result, NULL); if (result == 0) { return ESV(null); } return ejsDeserialize(ejs, result); }
/* Prepare form data using json encoding. The objects are json encoded then URI encoded to be safe. */ static void prepForm(Ejs *ejs, EjsHttp *hp, char *prefix, EjsObj *data) { EjsName qname; EjsObj *vp; EjsString *value; cchar *key, *sep; char *encodedKey, *encodedValue, *newPrefix, *newKey; int i, count; jdata = ejsToJSON(ejs, data, NULL); if (prefix) { newKey = sjoin(prefix, ".", key, NULL); encodedKey = mprUriEncode(newKey, MPR_ENCODE_URI_COMPONENT); } else { encodedKey = mprUriEncode(key, MPR_ENCODE_URI_COMPONENT); } encodedValue = mprUriEncode(value->value, MPR_ENCODE_URI_COMPONENT); mprPutToBuf(hp->requestContent, "%s%s=%s", sep, encodedKey, encodedValue); }
/* function serialize(obj: Object, options: Object = null): String Options: baseClasses, commas, depth, indent, hidden, pretty, replacer */ static EjsString *g_serialize(Ejs *ejs, EjsObj *unused, int argc, EjsObj **argv) { return ejsToJSON(ejs, argv[0], (argc == 2) ? argv[1] : NULL); }