// common.ts - common stuff like config and app setup import { createApp } from 'petite-vue' import { Data } from './comp-data' import { domain } from '@params' type Config = { domain: string itemid: string sid: string iid: string apiurl: string pollurl: string } export function config (api): Config { const pu = api.polling ? `${api.path}/${api.polling.msgbase.join('/')}` : '' return { domain: domain, itemid: location.hash.substring(1), sid: getSid(), iid: createRandString(1), apiurl: api.path, pollurl: pu, } } export const pvapp = { run(conf: Config, components: any[]) { appdata.conf = conf for (const comp of components) { appdata[comp.name] = comp } if (appdata.conf.pollurl) { poll(appdata) } createApp(appdata).mount() } } const appdata = { $delimiters: ['{|', '|}'], conf: {} as Config, components: {}, register, sendMsg } // generic App (appdata) methods function register(name: string, comp: any) { this.components[name] = comp } // specific App (appdata) methods export async function sendMsg(basemsg: string[], data: any) { const url = `${this.conf.apiurl}/${basemsg.join('/')}` await send(url, this.conf, data) } // common functions function handle(app, msg) { const [ domain, action, class_, item ] = msg.path.split('/') const comp = app.components[class_ || 'data'] if (domain && domain != comp.domain) { return } if (comp) { comp.handle(domain, action, class_, item, msg.payload) } } // app-specific functions async function send(url: string, conf: Config, data: any) { data._interaction = conf.iid const body = JSON.stringify(data) const headers = {} headers['X-Integrator-Session'] = conf.sid return fetch(url, { method: 'POST', headers: headers, body: body }) } function createRandString(size: number): string { const arr = new Uint32Array(size) crypto.getRandomValues(arr) const result: string[] = [] arr.forEach((x) => result.push(x.toString(36))) return result.join('') } function getSid(): string { const sid_key = 'api.sessionid' let sid = localStorage.getItem(sid_key) if (!sid) { sid = createRandString(2) localStorage.setItem(sid_key, sid) } return sid } //console.log("sid: ", getSid()) // TODO: clear sid - when? //localStorage.setItem('api.sessionid', '') async function poll(app: typeof appdata) { const wait_time = 10000 while (true) { try { const res = await(send(app.conf.pollurl, app.conf, {})) const msg = await res.json() switch (msg.status) { case 'idle': break case 'data': console.log('--- poll', msg) handle(app, msg) break default: console.log('**** poll', msg) await sleep(wait_time) } } catch (error) { console.log(error) await sleep(wait_time) } } } const sleep = (delay: number) => new Promise(r => setTimeout(r, delay))