UNPKG

@xuda.io/runtime-bundle

Version:

The Xuda Runtime Bundle refers to a collection of scripts and libraries packaged together to provide the necessary runtime environment for executing plugins or components in the Xuda platform.

306 lines (266 loc) • 9 kB
const _this = {}; export const init_module = (e) => { _this.func = e.func; _this.glb = e.glb; _this.SESSION_OBJ = e.SESSION_OBJ; _this.APP_OBJ = e.APP_OBJ; _this.IS_DOCKER = e.IS_DOCKER; _this.IS_API_SERVER = e.IS_API_SERVER; _this.IS_PROCESS_SERVER = e.IS_PROCESS_SERVER; }; export const get_doc_from_studio = async function (SESSION_ID, app_id, idP) { return new Promise(function (resolve, reject) { var _session = _this.SESSION_OBJ[SESSION_ID]; if (glb.IS_WORKER) { func.utils.post_back_to_client(SESSION_ID, 'get_doc_from_studio', _session.worker_id, { doc_id: idP }); self.addEventListener('live_preview_get_obj_response_worker_' + idP, (event) => { // console.log("Custom event triggered:", event); resolve(event.detail.data); }); } else { STUDIO_PEER_CONN_SEND_METHOD({ service: 'get_doc_obj', data: { doc_id: idP }, session_id: SESSION_ID, id: STUDIO_PEER.id, source: 'runtime', app_id, }); $('body').on('live_preview_get_obj_response_' + idP, function (e, data) { resolve(data.data); $('body').off('live_preview_get_obj_response_' + idP); }); } }); }; export const get_doc_from_websocket = async function (SESSION_ID, app_id, idP) { var _session = _this.SESSION_OBJ[SESSION_ID]; return new Promise(function (resolve, reject) { if (glb.IS_WORKER) { // throw new Error("fail to fetch from ws"); func.utils.post_back_to_client(SESSION_ID, 'get_doc_from_websocket', _session.worker_id, { doc_id: idP }); self.addEventListener('get_doc_obj_from_build_worker_' + idP, (event) => { resolve(event.detail.data); }); } else { if (RUNTIME_SERVER_WEBSOCKET && RUNTIME_SERVER_WEBSOCKET_CONNECTED) { RUNTIME_SERVER_WEBSOCKET.emit('message', { service: 'get_doc_obj_from_build', data: { doc_id: idP }, }); $('body').on('get_doc_obj_from_build_response_' + idP, (e, data) => { // views_ret = data.data; resolve(data.data); $('body').off('get_doc_obj_from_build_response_' + idP); }); } else { throw new Error('fail to fetch from ws websocket inactive'); } } }); }; export const DOCS_OBJ_get = async function (SESSION_ID, idP) { if (!idP) return; if (idP === '_empty_panel_program') { return { _id: '_empty_panel_program', properties: { menuName: '_empty_panel_program', menuTitle: '_empty_panel_program', menuType: 'component', // uiFramework: "@xuda.io/xuda-framework-plugin-tailwind", renderType: 'form', }, progUi: [ { id: 'node-empty_panel_program', tagName: 'xu-single-view', children: [ { id: 'node-empty_panel_program-span', tagName: 'span', children: [], content: '', type: 'element', attributes: {}, }, ], content: '', type: 'element', attributes: {}, }, ], progDataSource: {}, progFields: [], progEvents: [], }; } var _session = _this.SESSION_OBJ[SESSION_ID]; const app_id = _session.app_id; var views_ret; if (_session.engine_mode === 'live_preview') { return await get_doc_from_studio(SESSION_ID, app_id, idP); } if (glb.register_startup_programs) { func.common.db(SESSION_ID, 'register_startup_programs', { prog_id: idP, build_id: _session?.build_info?.build || 0, }); } views_ret = await read_objects_cache(SESSION_ID, idP, 'DOCS_OBJ'); if (!views_ret) { if (typeof _this.IS_DOCKER === 'undefined' && typeof _this.IS_PROCESS_SERVER === 'undefined') { let url = _this.func.common.get_url(SESSION_ID, 'rpi', ''); // Jul 7,25 build condition for master need to be added if (['master'].includes(_this.APP_OBJ[app_id].app_type)) { url += 'get_doc_obj_raw'; } else { url += 'get_doc_obj_from_build'; } let app_id_reference = _this.APP_OBJ[app_id].app_id_reference; ///////////////// const http = async function () { const response = await fetch(url, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 'xu-gtp-token': _session.gtp_token, 'xu-app-token': _session.app_token, }, body: JSON.stringify({ app_id: app_id, doc_id: idP, build: _session.build_info.instance_build || _session.build_info.build || _session.opt.app_build_id, app_id_reference: app_id_reference, engine_mode: _session.engine_mode, }), }); const json = await response.json(); if (response) { if (response && response.status === 400) { return _this.func.utils.request_error(SESSION_ID, 'ajax', response.statusText); } views_ret = json.data; } }; if (_session.engine_mode === 'miniapp') { await http(); } else { views_ret = await get_doc_from_websocket(SESSION_ID, app_id, idP); } // // Jul 7,25 replaced ^^ // try { // if (SESSION_OBJ?.[SESSION_ID]?.rpi_http_methods?.includes('get_doc_obj_from_build')) { // views_ret = await get_doc_from_websocket(SESSION_ID, app_id, idP); // } else { // throw new Error('not a get_doc_obj_from_build method'); // } // } catch (err) { // await http(); // } } if (typeof _this.IS_DOCKER !== 'undefined' || typeof _this.IS_PROCESS_SERVER !== 'undefined') { var ret = await __.rpi.get_prog(app_id, idP); if (ret.data) { views_ret = ret.data; } } if (views_ret) { if (views_ret.error) { console.error(views_ret); views_ret = ''; return; } await save_objects_cache(SESSION_ID, idP, 'DOCS_OBJ', views_ret); } } return views_ret; }; export const save_objects_cache = async function (SESSION_ID, id, obj_type, data) { var _session = _this.SESSION_OBJ[SESSION_ID]; if (typeof _this.IS_DOCKER !== 'undefined' || typeof _this.IS_PROCESS_SERVER !== 'undefined' || _session.worker_type === 'Dev') { return; } var build_id = _session?.build_info?.build || 0; const db = await _this.func.utils.connect_pouchdb(SESSION_ID); var doc = { _id: `cache_${build_id}_${obj_type}_${id}`, id: id, docType: 'cache_objects', build_id: build_id.toString(), obj_type: obj_type, data: data, }; setTimeout(async function () { try { await db.get(doc_id); return; } catch (e) { if (await read_objects_cache(SESSION_ID, id, obj_type)) { return; } if (!doc.data || (doc.data && typeof doc.data === 'string' && doc.data.indexOf('error') > -1)) { return; } try { return await db.put(doc); } catch (err) { return; } } }, 1000); }; export const read_objects_cache = async function (SESSION_ID, id, obj_type) { if (typeof _this.IS_DOCKER !== 'undefined' || typeof _this.IS_PROCESS_SERVER !== 'undefined') { try { const data = fs.readFileSync('/var/xuda/progs/' + id + '.json', 'utf8'); return JSON.parse(data); } catch (err) { console.error('read_objects_cache', err); return; } } var _session = _this.SESSION_OBJ[SESSION_ID]; var build_id = _session?.build_info?.build || 0; const db = await _this.func.utils.connect_pouchdb(SESSION_ID); var ret; try { ret = await db.get(`cache_${build_id}_${obj_type}_${id}`); if (ret.data && typeof ret.data === 'string' && ret.data.indexOf('error') > -1) { return ''; } return ret.data; } catch (err) { return ret; } }; export const delete_objects_cache = async function (SESSION_ID, id, obj_type) { const app_id = _this.SESSION_OBJ[SESSION_ID].app_id; var build_id = _session?.build_info?.build || 0; const db = await _this.func.utils.connect_pouchdb(SESSION_ID); try { var doc = await db.get(`cache_${build_id}_${obj_type}_${id}`); if (!doc) return; var ret = await db.remove(doc); } catch (err) { // return; } return ret; }; export const load_objects_cache = async function (SESSION_ID) { var _session = _this.SESSION_OBJ[SESSION_ID]; if (typeof _this.IS_DOCKER !== 'undefined' || typeof _this.IS_PROCESS_SERVER !== 'undefined') { return; } const app_id = _session.app_id; const db = await _this.func.utils.connect_pouchdb(SESSION_ID); const build_id = _this.APP_OBJ[app_id].app_build_id; let ret = await db.find({ selector: { docType: 'cache_objects', build_id }, }); for (let val of ret.docs) { eval(val.obj_type)[_session.app_id][val.id] = val.data; } };