move API-specific stuff to separate app-ig.ts file

This commit is contained in:
Helmut Merz 2023-03-27 10:15:20 +02:00
parent 45e66e5c3f
commit 9afe216068
8 changed files with 79 additions and 86 deletions

71
assets/js/app-ig.ts Normal file
View file

@ -0,0 +1,71 @@
// app-ig.ts - petite-vue application using integrator API
import { createApp } from 'petite-vue'
import { Config, register, handle, sleep } from './common'
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
}
// methods
async function sendMsg(basemsg: string[], data: any) {
const url = `${this.conf.apiurl}/${basemsg.join('/')}`
await send(url, this.conf, data)
}
// 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
})
}
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)
}
}
}

View file

@ -1,11 +1,8 @@
// 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 = {
export type Config = {
domain: string
itemid: string
sid: string
@ -26,43 +23,15 @@ export function config (api): Config {
}
}
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) {
export 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) {
export function handle(app, msg) {
const [ domain, action, class_, item ] = msg.path.split('/')
const comp = app.components[class_ || 'data']
if (domain && domain != comp.domain) {
@ -73,20 +42,6 @@ function handle(app, msg) {
}
}
// 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)
@ -109,28 +64,4 @@ function getSid(): string {
// 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))
export const sleep = (delay: number) => new Promise(r => setTimeout(r, delay))

View file

@ -1,10 +1,5 @@
// comp-data.ts - definition and methods of the Data component
import { sendMsg } from './common'
// Data component
//export function Data(name, action, domain: string): object {
export function Data(name: string, conf: any): object {
const domain = conf.domain || this.conf.domain
const comp = {
@ -51,7 +46,6 @@ function exec(action: string) {
for (const k of Object.keys(data)) {
value += `${k}: ${data[k]}, `
}
this.output += '\n' + value
console.log('exec:', value)
const msgbase = [this.domain, action, this.name]
if (this.state.mode !== 'new') {

View file

@ -1,10 +1,5 @@
// list-data.ts - definition and methods of the List component
import { sendMsg } from './common'
// List component
//export function List(name, action, domain: string): object {
export function List(name: string, conf: any): object {
const domain = conf.domain || this.conf.domain
const comp = {

View file

@ -1,5 +1,7 @@
import { api } from './settings'
import { config, pvapp } from './common'
import { pvapp } from './app-ig'
import { config } from './common'
import { Data } from './comp-data'
import { List } from './comp-list'

View file

@ -27,7 +27,7 @@ params:
api:
domain: demo
module: main.ts
module: main-ig.ts
taxonomies:
domain: domains