{"version":3,"sources":["task.ts"],"sourcesContent":["// DATEX class wrapper around JS Promises to support remote executed Task\n\nimport { Runtime } from \"../runtime/runtime.ts\";\nimport { Pointer } from \"../runtime/pointers.ts\";\nimport type { datex_scope } from \"../utils/global_types.ts\";\nimport { Scope } from \"./scope.ts\";\nimport { Type } from \"./type.ts\";\nimport { Endpoint } from \"./addressing.ts\";\n\nexport class Task<R=any,E=any> {\n\n    datex?:Scope<R>\n    #executed = false;\n    \n    promise?:Promise<any>\n\n    // locally executed task, can be awaited\n    get is_local(){return !!this.datex}\n\n    result?: R|E\n    state: 0n|1n|2n = 0n // 0 = running, 1 = success, 2 = error\n\n    constructor(datex?:Scope<R>) {\n        this.datex = datex;\n    }\n\n    replicate(){\n        // not local, no this.datex, create remote awaiting promise, because run is/was called externally\n        this.#remotePromise();\n    }\n\n    // TODO default create anonymouse pointer for this class -> pointer available immediately at construct/replicate?\n    #remotePromise(){\n        this.promise = new Promise((resolve, reject) => {\n            // already finished\n            if (this.state > 0n) {\n                if (this.state == 2n) reject(this.result);\n                else resolve(this.result);\n            }\n            // wait for state change\n            Pointer.observe(this, ()=>{\n                console.log(\"finished task:\",this);\n                if (this.state > 0n) {\n                    if (this.state == 2n) reject(this.result);\n                    else resolve(this.result);\n                    return false; // unobserve\n                }\n            }, this, 'state')\n        })\n    }\n\n    run (sender?:Endpoint, context?:any): Promise<any> {\n        if (!this.datex) throw new Error(\"Cannot run <Task> without DATEX body\");\n        if (!this.#executed) {\n            this.#executed = true;\n            this.promise = new Promise(async (resolve, reject)=>{\n                try {\n                    const res = await this.datex!.execute(sender??Runtime.endpoint, context);\n                    this.result = res;\n                    this.state = 1n;\n                    resolve(res);\n                }\n                catch (e) {\n                    this.result = e;\n                    this.state = 2n;\n                    reject(e);\n                }\n            })\n        }\n        return this.promise!;\n    }\n}\n\n\nType.get(\"std:Task\").setJSInterface({\n    class: Task,\n\n    // serialize: value => new Datex.Tuple(value.finished, value.result, value.error),\n\n    // cast: value => {\n    //     if (value instanceof Datex.Tuple) {\n    //         const task = new Datex.Task();\n    //         task.finished = value[0];\n    //         task.result = value[1];\n    //         task.error = value[2];\n    //         return task;\n    //     }\n    //     else if (typeof value == \"object\") {\n    //         const task = new Datex.Task();\n    //         task.finished = value.finished;\n    //         task.result = value.result;\n    //         task.error = value.error;\n    //         return task;\n    //     }\n    //     return INVALID;\n    // },\n    is_normal_object: true,\n    proxify_children: false,\n    visible_children: new Set([\"state\", \"result\"]),\n}).setReplicator(Task.prototype.replicate)"],"names":["Runtime","Pointer","Type","Task","datex","promise","is_local","result","state","constructor","replicate","Promise","resolve","reject","observe","console","log","run","sender","context","Error","res","execute","endpoint","e","get","setJSInterface","class","is_normal_object","proxify_children","visible_children","Set","setReplicator","prototype"],"mappings":"AAEA,SAASA,OAAO,QAAQ,wBAAwB;AAChD,SAASC,OAAO,QAAQ,yBAAyB;AAGjD,SAASC,IAAI,QAAQ,YAAY;AAGjC,OAAO,MAAMC;IAETC,MAAe;IACf,CAAA,QAAS,GAAG,CAAA,EAAM;IAElBC,QAAqB;IAGrB,IAAIC,WAAU;QAAC,OAAO,CAAC,CAAC,IAAI,CAACF,KAAK;IAAA;IAElCG,OAAY;IACZC,QAAkB,EAAE,CAAA;IAEpBC,YAAYL,KAAe,CAAE;QACzB,IAAI,CAACA,KAAK,GAAGA;IACjB;IAEAM,YAAW;QAEP,IAAI,CAAC,CAAA,aAAc;IACvB;IAGA,CAAA,aAAc;QACV,IAAI,CAACL,OAAO,GAAG,IAAIM,QAAQ,CAACC,SAASC;YAE7B,IAAI,CAACL,KAAK,GAAG,EAAE,KACX,AAAc,EAAE,IAAhB,IAAI,CAACA,KAAK,GAAQK,OAAO,IAAI,CAACN,MAAM,IACnCK,QAAQ,IAAI,CAACL,MAAM,IAG5BN,QAAQa,OAAO,CAAC,IAAI,EAAE;gBAElB,IADAC,QAAQC,GAAG,CAAC,kBAAiB,IAAI,GAC7B,IAAI,CAACR,KAAK,GAAG,EAAE,EAGf,OAFI,AAAc,EAAE,IAAhB,IAAI,CAACA,KAAK,GAAQK,OAAO,IAAI,CAACN,MAAM,IACnCK,QAAQ,IAAI,CAACL,MAAM,GACjB,CAAA;YAEf,GAAG,IAAI,EAAE;QACb;IACJ;IAEAU,IAAKC,MAAgB,EAAEC,OAAY,EAAgB;QAC/C,IAAI,CAAC,IAAI,CAACf,KAAK,EAAE,MAAM,AAAIgB,MAAM;QAiBjC,OAhBK,IAAI,CAAC,CAAA,QAAS,KACf,IAAI,CAAC,CAAA,QAAS,GAAG,CAAA,GACjB,IAAI,CAACf,OAAO,GAAG,IAAIM,QAAQ,OAAOC,SAASC;YACvC,IAAI;gBACA,IAAMQ,MAAM,MAAM,IAAI,CAACjB,KAAK,CAAEkB,OAAO,CAACJ,UAAQlB,QAAQuB,QAAQ,EAAEJ;gBAChE,IAAI,CAACZ,MAAM,GAAGc,KACd,IAAI,CAACb,KAAK,GAAG,EAAE,EACfI,QAAQS;YACZ,EACA,OAAOG,GAAG;gBACN,IAAI,CAACjB,MAAM,GAAGiB,GACd,IAAI,CAAChB,KAAK,GAAG,EAAE,EACfK,OAAOW;YACX;QACJ,KAEG,IAAI,CAACnB,OAAO;IACvB;AACJ;AAGAH,KAAKuB,GAAG,CAAC,YAAYC,cAAc,CAAC;IAChCC,OAAOxB;IAqBPyB,kBAAkB,CAAA;IAClBC,kBAAkB,CAAA;IAClBC,kBAAkB,IAAIC,IAAI;QAAC;QAAS;KAAS;AACjD,GAAGC,aAAa,CAAC7B,KAAK8B,SAAS,CAACvB,SAAS","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/types/","file":"task.ts"}