import { reactive, watch } from 'vue'; import vista from './vista.mjs'; import cookie from './cookie.mjs'; import { debounce } from './util.mjs'; import { lab_parse, lab_reparse_results, measurement_parse, orderinfo_parse, orderoverrides_parse, orderoptions_parse } from './reportparser.mjs'; import { TplFS, EncFS, randpassword as tplfs_randpassword } from './tplfs.mjs'; export const localstate = reactive(cookie.get('state') ? JSON.parse(cookie.get('state')) : {}); window.addEventListener('storage', function(evt) { if((evt.storageArea == window.localStorage) && (evt.key == 'state') && (evt.newValue)) Object.assign(localstate, JSON.parse(evt.newValue)); }); watch(localstate, function(value) { cookie.set('state', value = JSON.stringify(value), 45); window.localStorage.setItem('state', value); }, { immediate: true, deep: true }); function RPCError(type, ...args) { this.name = type; this.message = args; } RPCError.prototype = Object.create(Error.prototype); export function logged(fn, name) { return async function(...args) { var res = await fn(...args); console.log(name, ...args, res); return res; } } export function unwrapped(fn) { return async function(...args) { var res = await fn(...args); if(res.error) throw new RPCError(res.error.type, ...res.error.args); if(res.ts) try { res.result._ts = res.ts; } catch(ex) {} return res.result; } } export function memoized(fn) { var cache = {}; return async function(...args) { var key = JSON.stringify(args); return cache.hasOwnProperty(key) ? cache[key] : (cache[key] = await fn(...args)); } } export function converted_boolean(fn, columns=null) { return async function(...args) { return await fn(...args) == '1'; } } export function parsed_nullarray(fn) { return async function(...args) { var res = await fn(...args); return res !== '' ? res : []; } } export function parsed_text(fn) { return async function(...args) { var res = await fn(...args); return res !== '' ? res.join('\r\n') : res; } } function parse_caretseparated(rows, columns) { return rows.map(function(row) { row = row.split('^'); for(var i = columns.length - 1; i >= 0; --i) if(columns[i]) row[columns[i]] = row[i]; return row; }); } function parse_caretseparated1(row, columns) { var res = row.split('^'); if(columns) for(var i = columns.length - 1; i >= 0; --i) if(columns[i]) res[columns[i]] = res[i]; return res; } export function caretseparated(fn, columns=null) { return async function(...args) { if(columns) return (await fn(...args)).map(function(row) { row = row.split('^'); for(var i = columns.length - 1; i >= 0; --i) if(columns[i]) row[columns[i]] = row[i]; return row; }); else return (await fn(...args)).map(function(row) { return row.split('^'); }); } } export function caretseparated1(fn, columns=null) { return async function(...args) { var res = (await fn(...args)).split('^'); if(columns) for(var i = columns.length - 1; i >= 0; --i) if(columns[i]) res[columns[i]] = res[i]; return res; } } function parsed_caretseparated_detail(fn, columns, detailcolumn) { if(!columns) columns = []; if(!detailcolumn) detailcolumn = 'detail'; return columns ? async function(...args) { var res = [], item = {}, rows = await fn(...args); for(var i = 0; i < rows.length; ++i) { var row = rows[i], prefix = row.charAt(0); if(prefix == '~') { item = row.substring(1).split('^'); for(var j = columns.length - 1; j >= 0; --j) if(columns[j]) item[columns[j]] = item[j]; res.push(item); } else if(prefix == 't') { if(item[detailcolumn]) item[detailcolumn] += '\r\n' + rows[i].substring(1); else item[detailcolumn] = rows[i].substring(1); } } return res; } : async function(...args) { var res = [], item = {}, rows = await fn(...args); for(var i = 0; i < rows.length; ++i) { var row = rows[i], prefix = row.charAt(0); if(prefix == '~') res.push(item = row.substring(1).split('^')); else if(prefix == 't') { if(item[detailcolumn]) item[detailcolumn] += '\r\n' + rows[i].substring(1); else item[detailcolumn] = rows[i].substring(1); } } return res; } } export function sliced(fn, start, end) { return async function(...args) { return (await fn(...args)).slice(start, end); } } export function mapped(fn, id='id') { if(typeof id === 'function') return async function(...args) { var res = await fn(...args); for(var i = res.length - 1; i >= 0; --i) res[id(res[i])] = res[i]; return res; }; else return async function(...args) { var res = await fn(...args); for(var i = res.length - 1; i >= 0; --i) res[res[i][id]] = res[i]; return res; }; } export function labreportparsed(fn) { return async function(...args) { return lab_parse(await fn(...args)); } } const parsed_orderdialogs_columns = ['IEN', 'windowFormId', 'displayGroupId', 'type', 'displayText']; export function parsed_orderdialogs(fn, columns=parsed_orderdialogs_columns) { return async function(...args) { return (await fn(...args)).map(function(row) { row = row.split('^'); row = [...row[0].split(';'), row[1]]; for(var i = columns.length - 1; i >= 0; --i) if(columns[i]) row[columns[i]] = row[i]; return row; }); } } export function parsed_orderoverrides(fn) { return async function(...args) { return orderoverrides_parse(await fn(...args)); } } export function parsed_ordermenu(fn) { return async function(...args) { var resultset = await fn(...args); var res = parse_caretseparated1(resultset[0], ['name', 'columns', 'path_switch']); res.children = parse_caretseparated(resultset.slice(1), ['col', 'row', 'type', 'IEN', 'formid', 'autoaccept', 'display_text', 'mnemonic', 'displayonly']); return res; } } export function parsed_orderinfo(fn) { return async function(...args) { return orderinfo_parse(await fn(...args)); } } export function parsed_orderoptions_scheduling(fn) { return async function(...args) { var res = orderoptions_parse(await fn(...args)); for(var k in res) if(res.hasOwnProperty(k)) { if(res[k].items) res[k].items = res[k].items.split('^'); res['~' + k.toUpperCase()] = res[k]; } return res; } } export function parsed_orderoptions_labfacility(fn) { return async function(...args) { var res = orderoptions_parse(await fn(...args)), val, defaultvalue; for(var k in res) if(res.hasOwnProperty(k)) { val = res[k]; if(val.default) { val.default = parse_caretseparated1(val.default, ['value', 'text']); defaultvalue = val.default.value; } else defaultvalue = null; if(val.items) val.items = val.items.split('\r\n').map(x => x ? (x = parse_caretseparated1(x, ['value', 'text']), x.default = x.value == defaultvalue, x) : null); res['~' + k.toUpperCase()] = val; } return res; } } export function parsed_orderoptions_labtest(fn) { return async function(...args) { var res = orderoptions_parse(await fn(...args)), val, defaultvalue; if(res.hasOwnProperty('Test Name')) res['Test Name'].default = res['Test Name'].default.replace(/^\s+|\s+$/, ''); if(res.hasOwnProperty('Item ID')) res['Item ID'].default = parse_caretseparated1(res['Item ID'].default, ['value', 'text']); if(res.hasOwnProperty('ReqCom')) res['ReqCom'].default = res['ReqCom'].default.replace(/^\s+|\s+$/, ''); if(res.hasOwnProperty('CollSamp')) res['CollSamp'].items = res['CollSamp'].items.split('\r\n').map(x => parse_caretseparated1(x, ['n', 'SampIEN', 'SampName', 'SpecPtr', 'TubeTop', 'unk_5', 'unk_6', 'LabCollect', 'unk_8', 'SpecName'])); res['Derived CollSamp'] = res['Unique CollSamp'] || res['Lab CollSamp'] || res['Default CollSamp']; if(res.hasOwnProperty('Specimens')) res['Specimens'].items = res['Specimens'].items.split('\r\n').map(x => parse_caretseparated1(x, ['value', 'text'])); if(res.hasOwnProperty('Default Urgency')) res['Default Urgency'].default = res['Default Urgency'].default.split('\r\n').map(x => parse_caretseparated1(x, ['value', 'text', 'x'])); if(res.hasOwnProperty('Urgencies')) res['Urgencies'].items = res['Urgencies'].items.split('\r\n').map(x => parse_caretseparated1(x, ['value', 'text'])); return res; } } export function parsed_orderoptions_medfill(fn) { return async function(...args) { var res = orderoptions_parse(await fn(...args)); if(res.hasOwnProperty('Pickup')) { if(res['Pickup'].default) res['Pickup'].default = parse_caretseparated1(res['Pickup'].default, ['value', 'text']); if(res['Pickup'].items) res['Pickup'].items = parse_caretseparated(res['Pickup'].items.split('\r\n'), ['value', 'text']); } if(res.hasOwnProperty('Priority')) { if(res['Priority'].default) res['Priority'].default = parse_caretseparated1(res['Priority'].default, ['value', 'text']); if(res['Priority'].items) res['Priority'].items = parse_caretseparated(res['Priority'].items.split('\r\n'), ['value', 'text']); } if(res.hasOwnProperty('Refills')) { if(res['Refills'].default) res['Refills'].default = parse_caretseparated1(res['Refills'].default, ['value', 'text']); if(res['Refills'].items) res['Refills'].items = parse_caretseparated(res['Refills'].items.split('\r\n'), ['value', 'text']); } return res; } } export function parsed_orderoptions_meddose(fn) { return async function(...args) { var res = orderoptions_parse(await fn(...args)); if(res.hasOwnProperty('AllDoses')) res['AllDoses'].items = parse_caretseparated(res['AllDoses'].items.split('\r\n'), ['text', 'id', 'dosefields']); if(res.hasOwnProperty('Dispense')) res['Dispense'].items = parse_caretseparated(res['Dispense'].items.split('\r\n'), ['id', 'dose', 'unit', 'text', 'split']); if(res.hasOwnProperty('Dosage')) res['Dosage'].items = parse_caretseparated(res['Dosage'].items.split('\r\n'), ['medication', '_', '_', 'value', 'text', 'tier', '_', 'form']); if(res.hasOwnProperty('Indication')) res['Indication'].items = res['Indication'].items.split('\r\n'); if((res.hasOwnProperty('Medication')) && (res['Medication'].default)) res['Medication'].default = parse_caretseparated1(res['Medication'].default, ['value', 'text']); if(res.hasOwnProperty('Route')) { if(res['Route'].default) res['Route'].default = parse_caretseparated1(res['Route'].default, ['value', 'abbr']); res['Route'].items = parse_caretseparated(res['Route'].items.split('\r\n'), ['value', 'text', 'abbr', 'sig', '_']); } return res; } } export function tabulated(fn, mapping) { return async function(...args) { var res = (await fn(...args)).map(function(row) { return row.slice(); }), nrow = res.length; for(var i = 0; i < nrow; ++i) { var row = res[i], ncol = row.length; for(var j = 0; j < ncol; ++j) if(mapping.hasOwnProperty(j)) row[mapping[j]] = row[j]; res.push() } return res; } } export function Client(cid, secret) { var heartbeat = null; this.secret = secret; this.cid = cid; this.status = reactive({ connected: true, requests: 0 }); this.close = function() { console.log('CLOSE', cid); if(heartbeat) window.clearInterval(heartbeat); this.status.connected = false; return vista.close(cid); }; this.call = async function(body, ...params) { body = (typeof body === 'string') || (body instanceof String) ? { method: body, params, id: Date.now() } : Object.assign({ id: Date.now() }, body); if(params.length > 0) { if(body.params) Array.prototype.push.apply(body.params, params); else body.params = params; } this.status.requests++; try { var res = await vista.call(cid, body); } finally { this.status.requests--; } if((res.error) && (res.error.type == 'ConnectionResetError')) this.close(); res._request = body; return res; }; this.callctx = function(context, method, ...params) { return this.call({ context, method, params, id: Date.now() }); }; this.heartbeat = async function(interval=null) { if(!interval) interval = 0.45*1000*(await this.XWB_GET_BROKER_INFO())[0]; if(heartbeat) window.clearInterval(heartbeat); this.XWB_IM_HERE(); return heartbeat = window.setInterval(this.XWB_IM_HERE, interval); } this.serverinfo = () => vista.serverinfo(cid); this.userinfo = () => vista.userinfo(cid); this.authenticate = (avcode=null) => vista.authenticate(cid, avcode); if(!localstate.encfs) localstate.encfs = tplfs_randpassword(); this.tplfs = async () => this._tplfs ? this._tplfs : (this._tplfs = await TplFS.fromUser(this, (await this.userinfo()).result[0])); this.encfs = async () => this._encfs ? this._encfs : (this._encfs = await EncFS.fromPassword(await this.tplfs(), localstate.encfs)); this.remotestate = reactive({}); this.setup_remotestate = async () => { var fs = await this.encfs(), file; try { file = await fs.open('state'); Object.assign(this.remotestate, JSON.parse(await file.cat(null))); } catch(ex) { console.error(ex); file = await fs.create('state', JSON.stringify(this.remotestate)); } watch(this.remotestate, debounce(function(value) { file.update(null, JSON.stringify(value)); }, 1000), { deep: true }); if((!this.remotestate.resources) && (localstate.resources)) this.remotestate.resources = localstate.resources; if((!this.remotestate.practitioner) && (localstate.practitioner)) this.remotestate.practitioner = localstate.practitioner; if(localstate.resources) delete localstate.resources; if(localstate.practitioner) delete localstate.practitioner; }; this.XWB_IM_HERE = unwrapped(logged(() => this.call({ method: 'XWB_IM_HERE', ttl: 30, stale: false }), 'XWB_IM_HERE')); this.XUS_INTRO_MSG = memoized(unwrapped(logged(() => this.callctx(['XUCOMMAND'], 'XUS_INTRO_MSG'), 'XUS_INTRO_MSG'))); this.XWB_GET_BROKER_INFO = memoized(unwrapped(logged(() => this.callctx(['XUCOMMAND'], 'XWB_GET_BROKER_INFO'), 'XWB_GET_BROKER_INFO'))); this.XUS_GET_USER_INFO = memoized(unwrapped(logged(() => this.call('XUS_GET_USER_INFO'), 'XUS_GET_USER_INFO'))); this.SDEC_RESOURCE = memoized(unwrapped(logged(() => this.call({ method: 'SDEC_RESOURCE', context: ['SDECRPC'], ttl: 2592000 }), 'SDEC_RESOURCE'))); this.SDEC_CLINLET = unwrapped(logged((...args) => this.call({ method: 'SDEC_CLINLET', context: ['SDECRPC'], ttl: 30 }, ...args), 'SDEC_CLINLET')); this.SDEC_CRSCHED = unwrapped(logged((...args) => this.call({ method: 'SDEC_CRSCHED', context: ['SDECRPC'], ttl: 30 }, ...args), 'SDEC_CRSCHED')); this.ORWPT_FULLSSN = memoized(caretseparated(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWPT_FULLSSN', ...args), 'ORWPT_FULLSSN')), ['dfn', 'name', 'date', 'pid'])); this.ORWPT_LAST5 = memoized(caretseparated(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWPT_LAST5', ...args), 'ORWPT_LAST5')), ['dfn', 'name', 'date', 'pid'])); this.ORWPT_ID_INFO = memoized(caretseparated1(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWPT_ID_INFO', ...args), 'ORWPT_ID_INFO')), ['pid', 'dob', 'sex', 'vet', 'sc_percentage', 'ward', 'room_bed', 'name'])); this.ORWPT_SELCHK = memoized(converted_boolean(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWPT_SELCHK', ...args), 'ORWPT_SELCHK')))); this.ORWPT16_LOOKUP = memoized(caretseparated(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWPT16_LOOKUP', ...args), 'ORWPT16_LOOKUP')), ['dfn', 'name', 'pid'])); this.ORWPT16_ID_INFO = memoized(caretseparated1(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWPT16_ID_INFO', ...args), 'ORWPT16_ID_INFO')), ['pid', 'dob', 'age', 'sex', 'sc_percentage', 'type', 'ward', 'room_bed', 'name'])); this.ORQQVI_VITALS = memoized(caretseparated(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORQQVI_VITALS', ...args), 'ORQQVI_VITALS')), ['measurement_ien', 'type', 'value', 'datetime', 'value_american', 'value_metric'])); this.ORQQVI_VITALS_FOR_DATE_RANGE = memoized(caretseparated(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORQQVI_VITALS_FOR_DATE_RANGE', ...args), 'ORQQVI_VITALS_FOR_DATE_RANGE')), ['measurement_ien', 'type', 'value', 'datetime'])); this.GMV_EXTRACT_REC = memoized(async (dfn, oredt, orsdt) => measurement_parse(await unwrapped(logged((...args0) => this.callctx(['OR CPRS GUI CHART'], 'GMV_EXTRACT_REC', args0.join('^')), 'GMV_EXTRACT_REC'))(dfn, oredt, '', orsdt))); this.ORWLRR_INTERIM = memoized(labreportparsed(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWLRR_INTERIM', ...args), 'ORWLRR_INTERIM')))); this.ORWLRR_INTERIM_RESULTS = memoized(async (...args) => lab_reparse_results(await this.ORWLRR_INTERIM(...args))); this.ORWORDG_ALLTREE = memoized(caretseparated(unwrapped(logged(() => this.callctx(['OR CPRS GUI CHART'], 'ORWORDG_ALLTREE'), 'ORWORDG_ALLTREE')), ['ien', 'name', 'parent', 'has_children'])); this.ORWORDG_REVSTS = memoized(caretseparated(unwrapped(logged(() => this.callctx(['OR CPRS GUI CHART'], 'ORWORDG_REVSTS'), 'ORWORDG_REVSTS')), ['ien', 'name', 'parent', 'has_children'])); this.ORWORR_AGET = memoized(caretseparated(sliced(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWORR_AGET', ...args), 'ORWORR_AGET')), 1), ['ifn', 'dgrp', 'time'])); this.ORWORR_GET4LST = memoized(parsed_orderinfo(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWORR_GET4LST', ...args), 'ORWORR_GET4LST')))); this.TIU_TEMPLATE_GETROOTS = caretseparated(unwrapped(logged((...args) => this.call({ method: 'TIU_TEMPLATE_GETROOTS', context: ['OR CPRS GUI CHART'], ttl: 86400 }, ...args), 'TIU_TEMPLATE_GETROOTS')), ['IEN', 'type', 'status', 'name', 'exclude_from_group_boilerplate', 'blank_lines', 'personal_owner', 'has_children_flag', 'dialog', 'display_only', 'first_line', 'one_item_only', 'hide_dialog_items', 'hide_tree_items', 'indent_items', 'reminder_dialog_ien', 'reminder_dialog_name', 'locked', 'com_object_pointer', 'com_object_parameter', 'link_pointer', 'reminder_dialog_patient_specific_value']); this.TIU_TEMPLATE_GETPROOT = caretseparated(unwrapped(logged((...args) => this.call({ method: 'TIU_TEMPLATE_GETPROOT', context: ['OR CPRS GUI CHART'], ttl: 86400 }, ...args), 'TIU_TEMPLATE_GETPROOT')), ['IEN', 'type', 'status', 'name', 'exclude_from_group_boilerplate', 'blank_lines', 'personal_owner', 'has_children_flag', 'dialog', 'display_only', 'first_line', 'one_item_only', 'hide_dialog_items', 'hide_tree_items', 'indent_items', 'reminder_dialog_ien', 'reminder_dialog_name', 'locked', 'com_object_pointer', 'com_object_parameter', 'link_pointer', 'reminder_dialog_patient_specific_value']); this.TIU_TEMPLATE_GETBOIL = parsed_text(unwrapped(logged((...args) => this.call({ method: 'TIU_TEMPLATE_GETBOIL', context: ['OR CPRS GUI CHART'], ttl: 0, stale: false }, ...args), 'TIU_TEMPLATE_GETBOIL'))); this.TIU_TEMPLATE_GETITEMS = caretseparated(parsed_nullarray(unwrapped(logged((...args) => this.call({ method: 'TIU_TEMPLATE_GETITEMS', context: ['OR CPRS GUI CHART'], ttl: 0, stale: false }, ...args), 'TIU_TEMPLATE_GETITEMS'))), ['IEN', 'type', 'status', 'name', 'exclude_from_group_boilerplate', 'blank_lines', 'personal_owner', 'has_children_flag', 'dialog', 'display_only', 'first_line', 'one_item_only', 'hide_dialog_items', 'hide_tree_items', 'indent_items', 'reminder_dialog_ien', 'reminder_dialog_name', 'locked', 'com_object_pointer', 'com_object_parameter', 'link_pointer', 'reminder_dialog_patient_specific_value']); this.TIU_TEMPLATE_SET_ITEMS = unwrapped(logged((...args) => this.call({ method: 'TIU_TEMPLATE_SET_ITEMS', context: ['OR CPRS GUI CHART'], ttl: 0, stale: false }, ...args), 'TIU_TEMPLATE_SET_ITEMS')); this.TIU_TEMPLATE_CREATE_MODIFY = unwrapped(logged((...args) => this.call({ method: 'TIU_TEMPLATE_CREATE/MODIFY', context: ['OR CPRS GUI CHART'], ttl: 0, stale: false }, ...args), 'TIU_TEMPLATE_CREATE/MODIFY')); this.TIU_TEMPLATE_DELETE = unwrapped(logged((...args) => this.call({ method: 'TIU_TEMPLATE_DELETE', context: ['OR CPRS GUI CHART'], ttl: 0, stale: false }, ...args), 'TIU_TEMPLATE_DELETE')); this.TIU_TEMPLATE_LOCK = unwrapped(logged((...args) => this.call({ method: 'TIU_TEMPLATE_LOCK', context: ['OR CPRS GUI CHART'], ttl: 0, stale: false }, ...args), 'TIU_TEMPLATE_LOCK')); this.TIU_TEMPLATE_UNLOCK = unwrapped(logged((...args) => this.call({ method: 'TIU_TEMPLATE_UNLOCK', context: ['OR CPRS GUI CHART'], ttl: 0, stale: false }, ...args), 'TIU_TEMPLATE_UNLOCK')); this.ORWCV_VST = memoized(caretseparated(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWCV_VST', ...args), 'ORWCV_VST')), ['apptinfo', 'datetime', 'location', 'status'])); this.ORWU1_NEWLOC = memoized(caretseparated(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWU1_NEWLOC', ...args), 'ORWU1_NEWLOC')), ['IEN', 'name'])); this.ORWDX_DGNM = memoized(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDX_DGNM', ...args), 'ORWDX_DGNM'))); this.ORWDX_DGRP = memoized(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDX_DGRP', ...args), 'ORWDX_DGRP'))); this.ORWDX_WRLST = memoized(parsed_orderdialogs(unwrapped(logged(() => this.callctx(['OR CPRS GUI CHART'], 'ORWDX_WRLST'), 'ORWDX_WRLST')))); this.ORWDX_ORDITM = memoized(caretseparated(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDX_ORDITM', ...args), 'ORWDX_ORDITM')), ['IEN', 'synonym', 'name'])); this.ORWDX_DLGID = memoized(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDX_DLGID', ...args), 'ORWDX_DLGID'))); this.ORWDX_DLGDEF = memoized(mapped(caretseparated(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDX_DLGDEF', ...args), 'ORWDX_DLGDEF')), ['promptID', 'promptIEN', 'fmtSeq', 'fmtCode', 'omit', 'lead', 'trail', 'newLine', 'wrap', 'children', 'isChild']), 'promptID')); this.ORWDX_LOADRSP = memoized(mapped(parsed_orderoverrides(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDX_LOADRSP', ...args), 'ORWDX_LOADRSP')), ['promptID', 'promptIEN', 'fmtSeq', 'fmtCode', 'omit', 'lead', 'trail', 'newLine', 'wrap', 'children', 'isChild']), 'promptID')); this.ORWDX_SAVE = unwrapped(logged((...args) => this.call({ method: 'ORWDX_SAVE', context: ['OR CPRS GUI CHART'], ttl: 0, stale: false }, ...args), 'ORWDX_SAVE')); this.ORWDXM_MENU = memoized(parsed_ordermenu(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDXM_MENU', ...args), 'ORWDXM_MENU')))); this.ORWDXM_DLGNAME = memoized(caretseparated1(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDXM_DLGNAME', ...args), 'ORWDXM_DLGNAME')), ['InternalName', 'DisplayName', 'BaseDialogIEN', 'BaseDialogName'])); this.ORWDXM_PROMPTS = memoized(mapped(parsed_caretseparated_detail(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDXM_PROMPTS', ...args), 'ORWDXM_PROMPTS')), ['id', 'req', 'hid', 'prompt', 'type', 'domain', 'default', 'idflt', 'help']), 'id')); this.ORWDXM1_BLDQRSP = caretseparated(unwrapped(logged((...args) => this.call({ method: 'ORWDXM1_BLDQRSP', context: ['OR CPRS GUI CHART'], ttl: 0, stale: false }, ...args), 'ORWDXM1_BLDQRSP')), ['QuickLevel', 'ResponseID', 'Dialog', 'Type', 'FormID', 'DGrpLST']); this.ORWUL_FV4DG = memoized(caretseparated1(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWUL_FV4DG', ...args), 'ORWUL_FV4DG')), ['IEN', 'count'])); this.ORWUL_FVSUB = memoized(caretseparated(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWUL_FVSUB', ...args), 'ORWUL_FVSUB')), ['IEN', 'description'])); this.ORWUL_FVIDX = memoized(caretseparated1(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWUL_FVIDX', ...args), 'ORWUL_FVIDX')), ['index', 'description'])); this.ORWDSD1_ODSLCT = memoized(parsed_orderoptions_scheduling(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDSD1_ODSLCT', ...args), 'ORWDSD1_ODSLCT')))); this.ORWDLR32_DEF = memoized(parsed_orderoptions_labfacility(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDLR32_DEF', ...args), 'ORWDLR32_DEF')))); this.ORWDLR32_LOAD = memoized(parsed_orderoptions_labtest(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDLR32_LOAD', ...args), 'ORWDLR32_LOAD')))); this.ORWDPS1_SCHALL = memoized(mapped(caretseparated(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDPS1_SCHALL', ...args), 'ORWDPS1_SCHALL')), ['value', 'text', '_', 'times']), 'value')); this.ORWDPS1_ODSLCT = memoized(parsed_orderoptions_medfill(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDPS1_ODSLCT', ...args), 'ORWDPS1_ODSLCT')))); this.ORWDPS2_OISLCT = memoized(parsed_orderoptions_meddose(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDPS2_OISLCT', ...args), 'ORWDPS2_OISLCT')))); this.ORWDPS2_DAY2QTY = memoized(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDPS2_DAY2QTY', ...args), 'ORWDPS2_DAY2QTY'))); this.ORWDPS2_QTY2DAY = memoized(unwrapped(logged((...args) => this.callctx(['OR CPRS GUI CHART'], 'ORWDPS2_QTY2DAY', ...args), 'ORWDPS2_QTY2DAY'))); return this; } Client._registry = {}; Client.fromID = function(cid, secret) { if(Client._registry[cid]) return Client._registry[cid]; return Client._registry[cid] = new Client(cid, secret); }; Client.fromScratch = async function(secret, host='vista.northport.med.va.gov', port=19209) { var data = await vista.connect(secret, host, port); if(data.result) return Client.fromID(data.result, secret); }; Client.fromCookie = async function(secret, defaulthost='vista.northport.med.va.gov:19209') { if(!secret) secret = localstate.secret; if(secret) { var host = localstate.host; host = (host || defaulthost).split(':'); if(secret != localstate.secret) { console.log('Using new secret', secret); var client = await Client.fromScratch(secret, host[0], host[1]); if(client) { localstate.host = host.join(':'); localstate.secret = secret; localstate.cid = client.cid; console.log('Established connection', client.cid); return client; } else { delete localstate.secret; delete localstate.cid; console.log('Failed to connect'); return null; } } else if(!localstate.cid) { console.log('Using saved secret', secret); var client = await Client.fromScratch(secret, host[0], host[1]); if(client) { localstate.host = host.join(':'); localstate.secret = secret; localstate.cid = client.cid; console.log('Established connection', client.cid); return client; } else { delete localstate.secret; delete localstate.cid; console.log('Failed connection'); return null; } } else { console.log('Using saved secret and connection', secret); var cid = localstate.cid; var client = Client.fromID(cid, secret); if((await vista.call(cid, { method: 'XWB_IM_HERE', ttl: 0, stale: false, id: Date.now() })).result == '1') { var server = await client.serverinfo(); if((host[0] == server.result.host) && (host[1] == server.result.port)) { localstate.host = host.join(':'); return client; } else console.log('Rejecting previous connection to different server', server); } delete localstate.cid; return await Client.fromCookie(secret, host.join(':')); } } }; export default window.vistax = { localstate, RPCError, Client, connect: Client.fromCookie };