From 3bf011016485b8062d1ee46b2b6000539d6883e3 Mon Sep 17 00:00:00 2001 From: David Kebler Date: Tue, 27 Aug 2019 20:10:44 -0700 Subject: [PATCH] 0.1.26 refactored amend methods added transport validation changed default name spaces to all start with _ to avoid accidential namespace issues refactored examples to showcase all possibilities with a four in one (fio) example refactored ha hooks added matching websocket client all works changes made by one socket are pushed to all sockets where they do their updates including home assistant added a home assistant package file including lovelace yaml for matching HA interface. --- examples/dynamic.js | 43 -- examples/four-in-one.js | 62 +- examples/ha-mqtt.js | 99 +-- examples/mqtt.js | 66 -- examples/uci_base_fio.yaml | 74 ++ examples/web.js | 61 -- examples/ws-fio-client/.editorconfig | 9 + examples/ws-fio-client/.eslintignore | 1 + examples/ws-fio-client/.eslintrc.js | 55 ++ examples/ws-fio-client/.gitignore | 20 + examples/ws-fio-client/.postcssrc.js | 8 + examples/ws-fio-client/.stylintrc | 35 + examples/ws-fio-client/README.md | 26 + examples/ws-fio-client/babel.config.js | 5 + examples/ws-fio-client/package.json | 35 + examples/ws-fio-client/quasar.conf.js | 182 +++++ examples/ws-fio-client/src/App.vue | 14 + .../src/assets/quasar-logo-full.svg | 191 ++++++ examples/ws-fio-client/src/assets/sad.svg | 1 + examples/ws-fio-client/src/boot/.gitkeep | 0 examples/ws-fio-client/src/boot/socket.js | 11 + .../ws-fio-client/src/components/.gitkeep | 0 examples/ws-fio-client/src/css/app.styl | 59 ++ .../src/css/quasar.variables.styl | 21 + .../ws-fio-client/src/css/variables.styl.core | 639 ++++++++++++++++++ .../ws-fio-client/src/index.template.html | 22 + .../ws-fio-client/src/layouts/default.vue | 38 ++ examples/ws-fio-client/src/pages/Error404.vue | 22 + examples/ws-fio-client/src/pages/Index.vue | 167 +++++ examples/ws-fio-client/src/router/index.js | 26 + examples/ws-fio-client/src/router/routes.js | 20 + .../src/statics/app-logo-128x128.png | Bin 0 -> 9181 bytes .../src/statics/icons/apple-icon-120x120.png | Bin 0 -> 8350 bytes .../src/statics/icons/apple-icon-152x152.png | Bin 0 -> 10707 bytes .../src/statics/icons/apple-icon-167x167.png | Bin 0 -> 12058 bytes .../src/statics/icons/apple-icon-180x180.png | Bin 0 -> 12908 bytes .../src/statics/icons/favicon-16x16.png | Bin 0 -> 700 bytes .../src/statics/icons/favicon-32x32.png | Bin 0 -> 1836 bytes .../src/statics/icons/favicon-96x96.png | Bin 0 -> 6666 bytes .../src/statics/icons/favicon.ico | Bin 0 -> 5238 bytes .../src/statics/icons/icon-128x128.png | Bin 0 -> 9181 bytes .../src/statics/icons/icon-192x192.png | Bin 0 -> 13796 bytes .../src/statics/icons/icon-256x256.png | Bin 0 -> 18868 bytes .../src/statics/icons/icon-384x384.png | Bin 0 -> 28922 bytes .../src/statics/icons/icon-512x512.png | Bin 0 -> 39953 bytes .../src/statics/icons/ms-icon-144x144.png | Bin 0 -> 10204 bytes .../src/statics/icons/safari-pinned-tab.svg | 1 + nodemon.json | 4 + package.json | 11 +- src/base.js | 86 ++- src/processing.js | 24 +- 51 files changed, 1818 insertions(+), 320 deletions(-) delete mode 100644 examples/dynamic.js delete mode 100644 examples/mqtt.js create mode 100644 examples/uci_base_fio.yaml delete mode 100644 examples/web.js create mode 100644 examples/ws-fio-client/.editorconfig create mode 100644 examples/ws-fio-client/.eslintignore create mode 100644 examples/ws-fio-client/.eslintrc.js create mode 100644 examples/ws-fio-client/.gitignore create mode 100644 examples/ws-fio-client/.postcssrc.js create mode 100644 examples/ws-fio-client/.stylintrc create mode 100644 examples/ws-fio-client/README.md create mode 100644 examples/ws-fio-client/babel.config.js create mode 100644 examples/ws-fio-client/package.json create mode 100644 examples/ws-fio-client/quasar.conf.js create mode 100644 examples/ws-fio-client/src/App.vue create mode 100644 examples/ws-fio-client/src/assets/quasar-logo-full.svg create mode 100644 examples/ws-fio-client/src/assets/sad.svg create mode 100644 examples/ws-fio-client/src/boot/.gitkeep create mode 100644 examples/ws-fio-client/src/boot/socket.js create mode 100644 examples/ws-fio-client/src/components/.gitkeep create mode 100644 examples/ws-fio-client/src/css/app.styl create mode 100644 examples/ws-fio-client/src/css/quasar.variables.styl create mode 100644 examples/ws-fio-client/src/css/variables.styl.core create mode 100644 examples/ws-fio-client/src/index.template.html create mode 100644 examples/ws-fio-client/src/layouts/default.vue create mode 100644 examples/ws-fio-client/src/pages/Error404.vue create mode 100644 examples/ws-fio-client/src/pages/Index.vue create mode 100644 examples/ws-fio-client/src/router/index.js create mode 100644 examples/ws-fio-client/src/router/routes.js create mode 100644 examples/ws-fio-client/src/statics/app-logo-128x128.png create mode 100644 examples/ws-fio-client/src/statics/icons/apple-icon-120x120.png create mode 100644 examples/ws-fio-client/src/statics/icons/apple-icon-152x152.png create mode 100644 examples/ws-fio-client/src/statics/icons/apple-icon-167x167.png create mode 100644 examples/ws-fio-client/src/statics/icons/apple-icon-180x180.png create mode 100644 examples/ws-fio-client/src/statics/icons/favicon-16x16.png create mode 100644 examples/ws-fio-client/src/statics/icons/favicon-32x32.png create mode 100644 examples/ws-fio-client/src/statics/icons/favicon-96x96.png create mode 100644 examples/ws-fio-client/src/statics/icons/favicon.ico create mode 100644 examples/ws-fio-client/src/statics/icons/icon-128x128.png create mode 100644 examples/ws-fio-client/src/statics/icons/icon-192x192.png create mode 100644 examples/ws-fio-client/src/statics/icons/icon-256x256.png create mode 100644 examples/ws-fio-client/src/statics/icons/icon-384x384.png create mode 100644 examples/ws-fio-client/src/statics/icons/icon-512x512.png create mode 100644 examples/ws-fio-client/src/statics/icons/ms-icon-144x144.png create mode 100644 examples/ws-fio-client/src/statics/icons/safari-pinned-tab.svg create mode 100644 nodemon.json diff --git a/examples/dynamic.js b/examples/dynamic.js deleted file mode 100644 index 02a61da..0000000 --- a/examples/dynamic.js +++ /dev/null @@ -1,43 +0,0 @@ -import Base from '../src/base' - -// const USOCKET = __dirname + '/sample.sock' - -let dy = new Base({id:'dynamic'}) - -; -(async () => { - - - await dy.init() - console.log('started', dy.started) - await Promise.all([dy.addSocket('con','c','t'),dy.addSocket('ser','s','t')]) - - dy.good = { - bad: function(packet){ - return new Promise( async (resolve) => { - let res = {} - res.req = packet - res.cmd='good/ugly' - res.response='The Good The Bad and The Ugly' - return resolve(res) - }) - }, - ugly: function (packet) { - console.log('==============reply from Good Bad command =========') - console.log(packet.response) - console.log('===========================') - } - } - - let packet = {} - // console.log('=============sending============') - packet = {cmd:'good:bad'} - console.log(packet) - await dy.send(packet) - - process.kill(process.pid, 'SIGTERM') - -})().catch(err => { - console.error('FATAL: UNABLE TO START SYSTEM!\n',err) - process.kill(process.pid, 'SIGTERM') -}) diff --git a/examples/four-in-one.js b/examples/four-in-one.js index f75fabb..91666ac 100644 --- a/examples/four-in-one.js +++ b/examples/four-in-one.js @@ -1,38 +1,49 @@ import Base from '../src/base' - -// const USOCKET = __dirname + '/sample.sock' +import hahooks from './ha-mqtt' const socketfuncs = { switch: { - on: function(packet){ + status: function(packet){ return new Promise( async (resolve) => { packet.cmd='switch/status' - packet.status='on' + packet.state=this.switches[packet.id-1] packet.sender= packet.sender || (packet._header ? packet._header.sender.name : 'unknown') this.push(packet) // push to all active socket servers let res = { response:'status pushed on to all clients'} return resolve(res) // this goes back to sender }) }, + on: function(packet){ + return new Promise( async (resolve) => { + packet.cmd='switch/status' + packet.state='on' + this.switches[packet.id-1] = 'on' + packet.sender= packet.sender || (packet._header ? packet._header.sender.name : 'unknown') + this.push(packet) // push to all active socket servers + let res = { response:'status change - pushed on to all clients', id:packet.id} + return resolve(res) // this goes back to sender + }) + }, off: function(packet){ return new Promise( async (resolve) => { packet.cmd='switch/status' - packet.status='off' + packet.state='off' + this.switches[packet.id-1] = 'off' packet.sender= packet.sender || (packet._header ? packet._header.sender.name : 'unknown') this.push(packet) // push to all active socket servers - let res = { response:'status pushed off to all clients'} + let res = { response:'status change - pushed off to all clients'} return resolve(res) // this goes back to sender }) }, toggle: function(packet){ return new Promise( async (resolve) => { - // would check status before deciding what to push - if (packet.status===null) packet.status = Math.random()>=.5 ? 'on' : 'off' - else packet.status = (packet.status==='on' ? 'off' : 'on') + // console.log('toggle current status of ', packet.current_status || 'unknown, so random set') + this.switches[packet.id-1] = this.switches[packet.id-1]==='on' ? 'off' : 'on' + packet.state = this.switches[packet.id-1] packet.cmd ='switch/status' packet.sender= packet.sender || (packet._header ? packet._header.sender.name : 'unknown') this.push(packet) // push to all active socket servers - let res = { response:`command ${packet.cmd} with id:${packet.id} pushed to all consumers(clients)`} + let res = { response:'status change - pushed toggled state to all clients'} return resolve(res) // this goes back to sender }) } @@ -40,37 +51,40 @@ const socketfuncs = { } -function status(state,consumer) { +// client processing function +function status(transport) { return (packet) => { return new Promise( async (resolve) => { - // console.log('complete packet', packet, consumer) - console.log(`Switch ${packet.id} is ${packet.status}, sent by ${packet.sender || packet.data.sender} to ${consumer}`) + console.log('=== a by transport processor only function ====') + console.log(`Switch ${packet.id} is ${packet.state}, sent by ${packet.sender || packet.data.sender} to ${transport}`) + console.log('==================') return resolve() }) } } -let fio = new Base({sockets:'uc#c>n,us#s>n,tc#c>t,ts#s>t', tc:{port:8100}, ts:{port:8100}, webs:{ port:8090 }, mqtts:{ topics:['switch/on','switch/off','switch/toggle']}, mqtt:{ topics:['switch/status']}}) +let fio = new Base({sockets:'uc#c>n,us#s>n,tc#c>t,ts#s>t', tc:{port:8100}, ts:{port:8100}}) -fio.s = socketfuncs -fio.c = { reply: () => {return Promise.resolve()} } -fio.cn = {switch:{status:status('on','named')}} -fio.ct = {switch:{status:status('on','tcp')}} -fio.cm = {switch:{status:status('on','mqtt')}} +fio.switches = ['off','off','off','off'] // database to hold switch states +fio.actions = socketfuncs +fio.addNamespace('actions') +fio.amendConsumerCommands({switch: {status:status('tcp only processor function which superceeds the all transports')}},'t') +fio.amendConsumerCommands({switch: {status:status('default all transports function')}}) ; (async () => { - await fio.addSocket('mqtt','s','m',{ topics:['switch/on','switch/off','switch/toggle']}) + await fio.addSocket('mqtt','s','m',{ host:'nas.kebler.net',topics:['switch/on','switch/off','switch/toggle']}) + await fio.addSocket('ha','s','m',{ host:'nas.kebler.net',topics:['fio/switch/set/#']}) + hahooks.call(fio,'ha') + await fio.addSocket('web','s','w',{ port:8090 }) let res = await fio.init() console.log('initialize errors',res) - console.log('waiting for packets') - let packet = {} packet = {cmd:'switch/toggle', id:'1'} console.log('=====sending to socket uc======',packet) - console.log('this should get pushed to all listening') - console.log('response back to uc: ',(await fio.send('uc',packet)).response) + console.log('this should get pushed to all listening consumers') + console.log('direct response back to uc with await: ',(await fio.send('uc',packet)).response) })().catch(err => { diff --git a/examples/ha-mqtt.js b/examples/ha-mqtt.js index a370475..e2fbd59 100644 --- a/examples/ha-mqtt.js +++ b/examples/ha-mqtt.js @@ -1,108 +1,41 @@ -import Base from '../src/base' - -const BROKER = 'nas.kebler.net' -const TOPICS = ['set/testing/+'] // listen for a set command - -const commands = { - on: function(packet){ - return new Promise( async (resolve) => { - console.log(`turning switch on for id ${packet.id||packet.data}`) - console.log('entire packet',packet) - // call switch on here - let res = {} - res.cmd='status' - res.state='on' - res.id = packet.id - this.push(packet) - return resolve(res) - }) - }, - off: function(packet){ - return new Promise( async (resolve) => { - console.log(packet) - console.log(`turning switch off for id ${packet.id||packet.data}`) - // call switch on here - let res = {} - res.cmd='status' - res.state='off' - res.id = packet.id - return resolve(res) - }) - } -} - -let relays = new Base({id:'homeassistant-example'}) - -relays.commands = relays.bindFuncs(commands) - -; -(async () => { - await relays.addSocket('mqs','s','m', {host:BROKER, topics:TOPICS}) - relays.addNamespace('commands','s') - register.call(relays,'mqs') - await relays.init() - -})().catch(err => { - console.error('FATAL: UNABLE TO START SYSTEM!\n',err) - process.kill(process.pid, 'SIGTERM') -}) - - - - ///***************** HOME ASSISTANT ************************ -// formats incoming and outgoing packets for HA convention +// for use with four in one example +// reformats incoming and outgoing topic/payload from HA from/to a UCI json packet +// import this function then call it binding your instance of uci/base +// passing the name of the mqtt socket which will be getting packets from HA +// NOTE: using @uci/ha one can communicate with HA directly not via mqtt -const STATUS_TOPIC = 'status/testing' +const STATUS_TOPIC = 'fio/switch/status' -function register(name) { +export default function register(socketname) { this.beforeProcessHook(async (packet) => { console.log('incoming mqtt packet to modify') console.dir(packet) let modified = Object.assign({},packet) let cmd = packet.cmd.split('/') - modified.cmd = `${packet.data.toLowerCase()}` - modified.id = cmd[2] + modified.cmd = `${cmd[1]}/${packet.data.toLowerCase()}` + modified.id = cmd[3] delete modified.data console.log('translated to uci packet') console.dir(modified) return modified // return packet }, - {name:name}) + {name:socketname}) - this.afterProcessHook(async (packet) => { - console.log('processed packet available to modify again', packet) - if (packet.error) { - let npacket = {} - npacket.cmd = 'error' - npacket.payload = JSON.stringify(packet) - return npacket - } - if (packet.cmd === 'status') { + // will cover push sends which is how HA will know state changed + this.beforeSendHook(async (packet) => { + console.log('beforeSendHook', packet) + if (packet.cmd === 'switch/status') { packet.cmd = `${STATUS_TOPIC}/${packet.id}` - packet.payload = packet.state.toUpperCase() + packet.payload = packet.state console.log('=============modified packet sent to broker================') console.dir(packet) console.log('================') } return packet }, - {name:name}) - - // this.beforeSendHook(async (packet) => { - // console.log('beforeSendHook', packet) - // if (packet.cmd === 'status') { - // let num = Object.keys(packet.pins)[0] - // packet.cmd = `${STATUS_TOPIC}/${num}` - // packet.payload = packet.pins[num] ? 'ON' : 'OFF' - // console.log('=============modified packet sent to broker================') - // console.dir(packet) - // console.log('================') - // } - // return packet - // }, - // {name:name}) + {name:socketname}) } diff --git a/examples/mqtt.js b/examples/mqtt.js deleted file mode 100644 index 0d64923..0000000 --- a/examples/mqtt.js +++ /dev/null @@ -1,66 +0,0 @@ -import Base from '../src/base' - -let dy = new Base({id:'dynamic', useRootNS: true }) - -const HOST = 'nas.kebler.net' - -let sensor = true - -//dummy simulated push -dy.sensor = { - test: function(packet){ - return new Promise( async (resolve) => { - console.log(`doing a dumming sensor push for id ${packet.id||packet.data}`) - console.log('entire packet',packet) - if (sensor) dy.push({cmd:'sensor/on', id:packet.id}) - else dy.push({cmd:'sensor/off', id:packet.id}) - let res = {} - dy.push({cmd:'sensor/on', id:packet.id}) - res.cmd='sensor/test' - res.test=true - res.id = packet.id - return resolve(res) - }) - } -} - -dy.switch = { - on: function(packet){ - return new Promise( async (resolve) => { - console.log(`turning switch on for id ${packet.id||packet.data}`) - console.log('entire packet',packet) - // call switch on here - let res = {} - res.cmd='switch/status' - res.status='on' - res.id = packet.id - return resolve(res) - }) - }, - off: function(packet){ - return new Promise( async (resolve) => { - console.log(packet) - console.log(`turning switch off for id ${packet.id||packet.data}`) - // call switch on here - let res = {} - res.cmd='switch/status' - res.status='off' - res.id = packet.id - return resolve(res) - }) - } -} - - -; -(async () => { - - await dy.init() - await dy.addSocket('mqs','s','m',{host:HOST}) - dy.socket.mqs.subscribe(['lights/#']) - console.log('ready') - -})().catch(err => { - console.error('FATAL: UNABLE TO START SYSTEM!\n',err) - process.kill(process.pid, 'SIGTERM') -}) diff --git a/examples/uci_base_fio.yaml b/examples/uci_base_fio.yaml new file mode 100644 index 0000000..2f7e25e --- /dev/null +++ b/examples/uci_base_fio.yaml @@ -0,0 +1,74 @@ +# package of switches to interface the the fio (four in one) socket example of @uci/base +switch: + - platform: mqtt + name: "FIO Switch 1" + state_topic: "fio/switch/status/1" + command_topic: "fio/switch/set/1" + state_on: "on" + state_off: "off" + payload_on: "on" + payload_off: "off" + icon: mdi:lightbulb + - platform: mqtt + name: "FIO Switch 2" + state_topic: "fio/switch/status/2" + command_topic: "fio/switch/set/2" + state_on: "on" + state_off: "off" + payload_on: "on" + payload_off: "off" + icon: mdi:lightbulb + - platform: mqtt + name: "FIO Switch 3" + state_topic: "fio/switch/status/3" + command_topic: "fio/switch/set/3" + state_on: "on" + state_off: "off" + payload_on: "on" + payload_off: "off" + icon: mdi:lightbulb + - platform: mqtt + name: "FIO Switch 4" + state_topic: "fio/switch/status/4" + command_topic: "fio/switch/set/4" + state_on: "on" + state_off: "off" + payload_on: "on" + payload_off: "off" + icon: mdi:lightbulb + + + # copy and paste and uncomment below as a view under views: in ui-lovelace.yaml + # - title: UCI Base FIO Example + # cards: + # - type: vertical-stack + # cards: + # - type: markdown + # content: > + # # Four In One UCI Base Example + # - type: horizontal-stack + # cards: + # - type: entity-button + # entity: switch.fio_switch_1 + # icon: mdi:water + # name: Switch 1 + # tap_action: + # action: toggle + # - type: entity-button + # entity: switch.fio_switch_2 + # icon: mdi:water + # name: Switch 2 + # tap_action: + # action: toggle + # - type: entity-button + # entity: switch.fio_switch_3 + # icon: mdi:water + # name: Switch 3 + # tap_action: + # action: toggle + # - type: entity-button + # entity: switch.fio_switch_4 + # icon: mdi:water + # name: Switch 4 + # tap_action: + # action: toggle diff --git a/examples/web.js b/examples/web.js deleted file mode 100644 index a3b6d7c..0000000 --- a/examples/web.js +++ /dev/null @@ -1,61 +0,0 @@ -import Base from '../src/base' - -// const USOCKET = __dirname + '/sample.sock' - -let wss = new Base({id:'websocket', useRootNS: true}) - -wss.switch = { - on: function(packet){ - return new Promise( async (resolve) => { - console.log(`turning switch on for id ${packet.id||packet.payload.id}`) - // call switch on here - let res = {} - res.log = `turning switch on for id ${packet.id||packet.payload.id}` - res.cmd='switch/status' - res.status='on' - res.id = packet.id - return resolve(res) - }) - }, - off: function(packet){ - return new Promise( async (resolve) => { - console.log(`turning switch off for id ${packet.id||packet.data}`) - // call switch on here - let res = {} - res.cmd='switch/status' - res.status='off' - res.id = packet.id - return resolve(res) - }) - }, - toggle: function(packet){ - return new Promise( async (resolve) => { - console.log(`toggling switch for id ${packet.id||packet.data}`) - // call switch on here - let res = {} - res.cmd='switch/status' - res.status= (packet.status === 'on')?'off':'on' - res.id = packet.id - console.log('broadcast',res) - this.push(res) - // return only acknowledge to sender, packet went as push - res = { cmd:'ack'} - return resolve(res) - }) - } -} - - -; -(async () => { - - await wss.init() - await wss.addSocket('web','s','w') - wss.push({server:'started'}) - await wss.addSocket('mqs','s','m') - wss.socket.mqs.subscribe(['switch/on','switch/off','switch/toggle']) - -})().catch(err => { - console.error('FATAL: UNABLE TO START SYSTEM!\n',err) - process.kill(process.pid, 'SIGTERM') -}) diff --git a/examples/ws-fio-client/.editorconfig b/examples/ws-fio-client/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/examples/ws-fio-client/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/examples/ws-fio-client/.eslintignore b/examples/ws-fio-client/.eslintignore new file mode 100644 index 0000000..9b1c8b1 --- /dev/null +++ b/examples/ws-fio-client/.eslintignore @@ -0,0 +1 @@ +/dist diff --git a/examples/ws-fio-client/.eslintrc.js b/examples/ws-fio-client/.eslintrc.js new file mode 100644 index 0000000..a789acd --- /dev/null +++ b/examples/ws-fio-client/.eslintrc.js @@ -0,0 +1,55 @@ +module.exports = { + root: true, + + parserOptions: { + parser: 'babel-eslint', + sourceType: 'module' + }, + + env: { + browser: true + }, + + extends: [ + // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention + // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. + 'plugin:vue/essential', + '@vue/standard' + ], + + // required to lint *.vue files + plugins: [ + 'vue' + ], + + globals: { + 'ga': true, // Google Analytics + 'cordova': true, + '__statics': true, + 'process': true + }, + + // add your custom rules here + rules: { + // allow async-await + 'generator-star-spacing': 'off', + // allow paren-less arrow functions + 'arrow-parens': 'off', + 'one-var': 'off', + + 'import/first': 'off', + 'import/named': 'error', + 'import/namespace': 'error', + 'import/default': 'error', + 'import/export': 'error', + 'import/extensions': 'off', + 'import/no-unresolved': 'off', + 'import/no-extraneous-dependencies': 'off', + 'prefer-promise-reject-errors': 'off', + + // allow console.log during development only + 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + // allow debugger during development only + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' + } +} diff --git a/examples/ws-fio-client/.gitignore b/examples/ws-fio-client/.gitignore new file mode 100644 index 0000000..d7c7a2d --- /dev/null +++ b/examples/ws-fio-client/.gitignore @@ -0,0 +1,20 @@ +.quasar +.DS_Store +.thumbs.db +node_modules +/dist +/src-cordova/node_modules +/src-cordova/platforms +/src-cordova/plugins +/src-cordova/www +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/examples/ws-fio-client/.postcssrc.js b/examples/ws-fio-client/.postcssrc.js new file mode 100644 index 0000000..1174fe5 --- /dev/null +++ b/examples/ws-fio-client/.postcssrc.js @@ -0,0 +1,8 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + plugins: [ + // to edit target browsers: use "browserslist" field in package.json + require('autoprefixer') + ] +} diff --git a/examples/ws-fio-client/.stylintrc b/examples/ws-fio-client/.stylintrc new file mode 100644 index 0000000..ce38d77 --- /dev/null +++ b/examples/ws-fio-client/.stylintrc @@ -0,0 +1,35 @@ +{ + "blocks": "never", + "brackets": "never", + "colons": "never", + "colors": "always", + "commaSpace": "always", + "commentSpace": "always", + "cssLiteral": "never", + "depthLimit": false, + "duplicates": true, + "efficient": "always", + "extendPref": false, + "globalDupe": true, + "indentPref": 2, + "leadingZero": "never", + "maxErrors": false, + "maxWarnings": false, + "mixed": false, + "namingConvention": false, + "namingConventionStrict": false, + "none": "never", + "noImportant": false, + "parenSpace": "never", + "placeholder": false, + "prefixVarsWithDollar": "always", + "quotePref": "single", + "semicolons": "never", + "sortOrder": false, + "stackedProperties": "never", + "trailingWhitespace": "never", + "universal": "never", + "valid": true, + "zeroUnits": "never", + "zIndexNormalize": false +} diff --git a/examples/ws-fio-client/README.md b/examples/ws-fio-client/README.md new file mode 100644 index 0000000..0f7d653 --- /dev/null +++ b/examples/ws-fio-client/README.md @@ -0,0 +1,26 @@ +# Quasar App (test-client-new) + +a test websocket client for uci websocket server + +## Install the dependencies +```bash +yarn +``` + +### Start the app in development mode (hot-code reloading, error reporting, etc.) +```bash +quasar dev +``` + +### Lint the files +```bash +yarn run lint +``` + +### Build the app for production +```bash +quasar build +``` + +### Customize the configuration +See [Configuring quasar.conf.js](https://quasar.dev/quasar-cli/quasar-conf-js). diff --git a/examples/ws-fio-client/babel.config.js b/examples/ws-fio-client/babel.config.js new file mode 100644 index 0000000..9408c6c --- /dev/null +++ b/examples/ws-fio-client/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@quasar/babel-preset-app' + ] +} diff --git a/examples/ws-fio-client/package.json b/examples/ws-fio-client/package.json new file mode 100644 index 0000000..a1310c7 --- /dev/null +++ b/examples/ws-fio-client/package.json @@ -0,0 +1,35 @@ +{ + "name": "fio-client", + "version": "0.0.1", + "description": "a websocket client for use with the fiod example", + "productName": "Websocket Client", + "cordovaId": "org.cordova.quasar.app", + "author": "David Kebler ", + "private": true, + "scripts": { + "lint": "eslint --ext .js,.vue src", + "client": "WSS=ws://localhost:8090 ./node_modules/.bin/quasar dev" + }, + "dependencies": { + "@quasar/extras": "^1.2.0", + "@uci/websocket-client": "^0.1.7", + "quasar": "^1.0.0", + "rfs": "^8.0.4" + }, + "devDependencies": { + "@quasar/app": "^1.0.0", + "@vue/eslint-config-standard": "^4.0.0", + "babel-eslint": "^10.0.1", + "eslint": "^5.10.0", + "eslint-loader": "^2.1.1", + "eslint-plugin-vue": "^5.0.0" + }, + "engines": { + "node": ">= 8.9.0", + "npm": ">= 5.6.0", + "yarn": ">= 1.6.0" + }, + "browserslist": [ + "last 1 version, not dead, ie >= 11" + ] +} diff --git a/examples/ws-fio-client/quasar.conf.js b/examples/ws-fio-client/quasar.conf.js new file mode 100644 index 0000000..be3bca9 --- /dev/null +++ b/examples/ws-fio-client/quasar.conf.js @@ -0,0 +1,182 @@ +// Configuration for your app +// https://quasar.dev/quasar-cli/quasar-conf-js + +module.exports = function (ctx) { + return { + // app boot file (/src/boot) + // --> boot files are part of "main.js" + // boot used to be plugins + boot: ['socket'], // uci-consumer-client websocket + css: [ + 'app.styl' + ], + + extras: [ + // 'ionicons-v4', + // 'mdi-v3', + // 'fontawesome-v5', + // 'eva-icons', + // 'themify', + // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both! + // 'roboto-font', // optional, you are not bound to it + 'material-icons' // optional, you are not bound to it + ], + + framework: { + // iconSet: 'ionicons-v4', + // lang: 'de', // Quasar language + + // all: true, // --- includes everything; for dev only! + + components: [ + 'QLayout', + 'QHeader', + 'QDrawer', + 'QPageContainer', + 'QPage', + 'QToolbar', + 'QToolbarTitle', + 'QBtn', + 'QIcon', + 'QList', + 'QItem', + 'QItemSection', + 'QItemLabel', + 'QInput', + 'QSelect', + 'QField', + 'QFooter', + 'QTooltip' + ], + + directives: [ + 'Ripple' + ], + + // Quasar plugins + plugins: [ + 'Notify' + ] + }, + + supportIE: false, + + build: { + // added to support communication with websocket and backend database + env: ctx.dev + // pass environment variable to browser client + ? { // so on dev we'll have + DBURL: JSON.stringify(process.env.DBURL || 'ws://localhost:3030'), + WSS: JSON.stringify(process.env.WSS || 'ws://localhost:8090') + } + : { // and on build (production): + DBURL: JSON.stringify(process.env.DBURL || 'ws://switches.kebler.net:3030'), + WSS: JSON.stringify(process.env.WSS || 'ws://relays.kebler.net:8090') + }, + scopeHoisting: true, + vueRouterMode: 'history', + // vueCompiler: true, + // gzip: true, + // analyze: true, + // extractCSS: false, + extendWebpack (cfg) { + cfg.module.rules.push({ + enforce: 'pre', + test: /\.(js|vue)$/, + loader: 'eslint-loader', + exclude: /node_modules/, + options: { + formatter: require('eslint').CLIEngine.getFormatter('stylish') + } + }) + } + }, + + devServer: { + // https: true, + // port: 8080, + open: true // opens browser window automatically + }, + + // animations: 'all', // --- includes all animations + animations: [], + + ssr: { + pwa: false + }, + + pwa: { + // workboxPluginMode: 'InjectManifest', + // workboxOptions: {}, // only for NON InjectManifest + manifest: { + // name: 'Quasar App', + // short_name: 'Quasar App', + // description: 'a test websocket client for uci websocket server', + display: 'standalone', + orientation: 'portrait', + background_color: '#ffffff', + theme_color: '#027be3', + icons: [ + { + 'src': 'statics/icons/icon-128x128.png', + 'sizes': '128x128', + 'type': 'image/png' + }, + { + 'src': 'statics/icons/icon-192x192.png', + 'sizes': '192x192', + 'type': 'image/png' + }, + { + 'src': 'statics/icons/icon-256x256.png', + 'sizes': '256x256', + 'type': 'image/png' + }, + { + 'src': 'statics/icons/icon-384x384.png', + 'sizes': '384x384', + 'type': 'image/png' + }, + { + 'src': 'statics/icons/icon-512x512.png', + 'sizes': '512x512', + 'type': 'image/png' + } + ] + } + }, + + cordova: { + // id: 'org.cordova.quasar.app', + // noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing + }, + + electron: { + // bundler: 'builder', // or 'packager' + + extendWebpack (cfg) { + // do something with Electron main process Webpack cfg + // chainWebpack also available besides this extendWebpack + }, + + packager: { + // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options + + // OS X / Mac App Store + // appBundleId: '', + // appCategoryType: '', + // osxSign: '', + // protocol: 'myapp://path', + + // Windows only + // win32metadata: { ... } + }, + + builder: { + // https://www.electron.build/configuration/configuration + + // appId: 'test-client-new' + } + } + } +} diff --git a/examples/ws-fio-client/src/App.vue b/examples/ws-fio-client/src/App.vue new file mode 100644 index 0000000..3fa5037 --- /dev/null +++ b/examples/ws-fio-client/src/App.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/examples/ws-fio-client/src/assets/quasar-logo-full.svg b/examples/ws-fio-client/src/assets/quasar-logo-full.svg new file mode 100644 index 0000000..281d072 --- /dev/null +++ b/examples/ws-fio-client/src/assets/quasar-logo-full.svg @@ -0,0 +1,191 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/ws-fio-client/src/assets/sad.svg b/examples/ws-fio-client/src/assets/sad.svg new file mode 100644 index 0000000..628136f --- /dev/null +++ b/examples/ws-fio-client/src/assets/sad.svg @@ -0,0 +1 @@ + diff --git a/examples/ws-fio-client/src/boot/.gitkeep b/examples/ws-fio-client/src/boot/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/ws-fio-client/src/boot/socket.js b/examples/ws-fio-client/src/boot/socket.js new file mode 100644 index 0000000..0c1f8bd --- /dev/null +++ b/examples/ws-fio-client/src/boot/socket.js @@ -0,0 +1,11 @@ +// import WebSocket from '@uci/websocket-client' +import WebSocket from '@uci/websocket-client' + +const ws = new WebSocket(process.env.WSS || 'ws://0.0.0.0:8090') + +export { ws } + +// leave the export, even if you don't use it +export default ({ Vue }) => { + Vue.prototype.$socket = ws +} diff --git a/examples/ws-fio-client/src/components/.gitkeep b/examples/ws-fio-client/src/components/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/ws-fio-client/src/css/app.styl b/examples/ws-fio-client/src/css/app.styl new file mode 100644 index 0000000..c1c263e --- /dev/null +++ b/examples/ws-fio-client/src/css/app.styl @@ -0,0 +1,59 @@ +// app global css +// from https://github.com/quasarframework/quasar/tree/dev/ui/src/css + + +@import "../../node_modules/rfs/stylus" + +$rfs-base-font-size = 1.25rem +// $rfs-font-size-unit = rem +$rfs-breakpoint = 1400px +// $rfs-breakpoint-unit = px +// $rfs-factor = 10 +// $rfs-rem-value = 16 +$rfs-two-dimensional = true +// $rfs-class = false + +$field-font-factor = 1.3 +$field-label-font-factor = 1 + +.q-field__native +.q-item__label + rfs($rfs-base-font-size * $field-font-factor) + +.q-field__label + &.no-pointer-events + rfs($rfs-base-font-size * $field-font-factor) + +.q-field__label + rfs($rfs-base-font-size * $field-label-font-factor) + padding-bottom .3em // needs to be dynamic based on font size + +.q-field__control + // height +??px // needs to be computed based on font size. + + +.q-page-container + background $accent + display: flex; + justify-content: center; +.q-page + width 80% +.q-field + padding 0 +.q-input +.q-select + background white + padding 0 .2em + margin .2em +.response + .q-textarea + .q-input + background $secondary + padding 0 1em +.q-item + padding 0 + margin 0 +.greyedout + opacity 0.5 +input + fontsize-12 diff --git a/examples/ws-fio-client/src/css/quasar.variables.styl b/examples/ws-fio-client/src/css/quasar.variables.styl new file mode 100644 index 0000000..e7b9d78 --- /dev/null +++ b/examples/ws-fio-client/src/css/quasar.variables.styl @@ -0,0 +1,21 @@ +// Quasar Stylus Variables +// -------------------------------------------------- +// To customize the look and feel of this app, you can override +// the Stylus variables found in Quasar's source Stylus files. + +// Check documentation for full list of Quasar variables + +// It's highly recommended to change the default colors +// to match your app's branding. +// Tip: Use the "Theme Builder" on Quasar's documentation website. +// https://quasar.dev/style/theme-builder + + +$primary = #006cd6 +$secondary = #26A69A +$accent = #278eb0 + +$positive = #21BA45 +$negative = #C10015 +$info = #31CCEC +$warning = #F2C037 diff --git a/examples/ws-fio-client/src/css/variables.styl.core b/examples/ws-fio-client/src/css/variables.styl.core new file mode 100644 index 0000000..cdcfd51 --- /dev/null +++ b/examples/ws-fio-client/src/css/variables.styl.core @@ -0,0 +1,639 @@ +$space-base ?= 16px +$space-x-base ?= $space-base +$space-y-base ?= $space-base +$spaces ?= { + none: { + x: 0, + y: 0 + }, + xs: { + x: ($space-x-base * .25), + y: ($space-y-base * .25) + }, + sm: { + x: ($space-x-base * .5), + y: ($space-y-base * .5) + }, + md: { + x: $space-x-base, + y: $space-y-base + }, + lg: { + x: ($space-x-base * 1.5), + y: ($space-y-base * 1.5) + }, + xl: { + x: ($space-x-base * 3), + y: ($space-y-base * 3) + } +} + +// Max width at which point +// current size ends +$breakpoint-xs ?= 599px +$breakpoint-sm ?= 1023px +$breakpoint-md ?= 1439px +$breakpoint-lg ?= 1919px + +$flex-cols ?= 12 +$flex-gutter-xs ?= ($space-base * .25) +$flex-gutter-sm ?= ($space-base * .5) +$flex-gutter-md ?= $space-base +$flex-gutter-lg ?= ($space-base * 1.5) +$flex-gutter-xl ?= ($space-base * 3) + +$body-font-size ?= 14px +$body-line-height ?= 1.5 + +$flex-gutter ?= { + none: 0, + xs: $flex-gutter-xs, + sm: $flex-gutter-sm, + md: $flex-gutter-md, + lg: $flex-gutter-lg, + xl: $flex-gutter-xl +} +$sizes ?= { + xs: 0, // Extra small screen + sm: $breakpoint-xs + 1, // Small screen + md: $breakpoint-sm + 1, // Medium screen + lg: $breakpoint-md + 1, // Large screen + xl: $breakpoint-lg + 1 // Extra large screen +} + +$breakpoint-xs-min ?= 0 +$breakpoint-xs-max ?= $breakpoint-xs + +$breakpoint-sm-min ?= $sizes.sm +$breakpoint-sm-max ?= $breakpoint-sm + +$breakpoint-md-min ?= $sizes.md +$breakpoint-md-max ?= $breakpoint-md + +$breakpoint-lg-min ?= $sizes.lg +$breakpoint-lg-max ?= $breakpoint-lg + +$breakpoint-xl-min ?= $sizes.xl +$breakpoint-xl-max ?= 9999px + +$headings ?= { + h1: { + size: 6rem, + line-height: 6rem, + weight: 300, + letter-spacing: -.01562em + }, + h2: { + size: 3.75rem, + line-height: 3.75rem, + letter-spacing: -.00833em, + weight: 300 + }, + h3: { + size: 3rem, + line-height: 3.125rem, + letter-spacing: normal, + weight: 400 + }, + h4: { + size: 2.125rem, + line-height: 2.5rem, + letter-spacing: .00735em, + weight: 400 + }, + h5: { + size: 1.5rem, + line-height: 2rem, + letter-spacing: normal, + weight: 400 + }, + h6: { + size: 1.25rem, + line-height: 2rem, + letter-spacing: .0125em, + weight: 500 + }, + subtitle1: { + size: 1rem, + line-height: 1.75rem, + letter-spacing: .00937em, + weight: 400 + }, + subtitle2: { + size: .875rem, + line-height: 1.375rem, + letter-spacing: .00714em, + weight: 500 + }, + body1: { + size: 1rem, + line-height: 1.5rem, + letter-spacing: .03125em, + weight: 400 + }, + body2: { + size: .875rem, + line-height: 1.25rem, + letter-spacing: .01786em, + weight: 400 + }, + overline: { + size: .75rem, + line-height: 2rem, + letter-spacing: .16667em, + weight: 500 + }, + caption: { + size: .75rem, + line-height: 1.25rem, + letter-spacing: .03333em, + weight: 400 + } +} + +$h-tags ?= { + h1: $headings.h1, + h2: $headings.h2, + h3: $headings.h3, + h4: $headings.h4, + h5: $headings.h5, + h6: $headings.h6 +} + +$text-weights ?= { + thin: 100, + light: 300, + regular: 400, + medium: 500, + bold: 700, + bolder: 900 +} + +$primary ?= #027BE3 +$secondary ?= #26A69A +$accent ?= #9C27B0 + +$positive ?= #21BA45 +$negative ?= #C10015 +$info ?= #31CCEC +$warning ?= #F2C037 + +$light ?= #bdbdbd +$dark ?= #424242 +$faded ?= #777 + +$dimmed-background ?= rgba(0, 0, 0, .4) +$light-dimmed-background ?= rgba(255, 255, 255, .6) + +$separator-color ?= rgba(0, 0, 0, .12) +$separator-dark-color ?= rgba(255, 255, 255, .48) + +$red ?= #f44336 +$red-1 ?= #ffebee +$red-2 ?= #ffcdd2 +$red-3 ?= #ef9a9a +$red-4 ?= #e57373 +$red-5 ?= #ef5350 +$red-6 ?= #f44336 +$red-7 ?= #e53935 +$red-8 ?= #d32f2f +$red-9 ?= #c62828 +$red-10 ?= #b71c1c +$red-11 ?= #ff8a80 +$red-12 ?= #ff5252 +$red-13 ?= #ff1744 +$red-14 ?= #d50000 +$pink ?= #e91e63 +$pink-1 ?= #fce4ec +$pink-2 ?= #f8bbd0 +$pink-3 ?= #f48fb1 +$pink-4 ?= #f06292 +$pink-5 ?= #ec407a +$pink-6 ?= #e91e63 +$pink-7 ?= #d81b60 +$pink-8 ?= #c2185b +$pink-9 ?= #ad1457 +$pink-10 ?= #880e4f +$pink-11 ?= #ff80ab +$pink-12 ?= #ff4081 +$pink-13 ?= #f50057 +$pink-14 ?= #c51162 +$purple ?= #9c27b0 +$purple-1 ?= #f3e5f5 +$purple-2 ?= #e1bee7 +$purple-3 ?= #ce93d8 +$purple-4 ?= #ba68c8 +$purple-5 ?= #ab47bc +$purple-6 ?= #9c27b0 +$purple-7 ?= #8e24aa +$purple-8 ?= #7b1fa2 +$purple-9 ?= #6a1b9a +$purple-10 ?= #4a148c +$purple-11 ?= #ea80fc +$purple-12 ?= #e040fb +$purple-13 ?= #d500f9 +$purple-14 ?= #aa00ff +$deep-purple ?= #673ab7 +$deep-purple-1 ?= #ede7f6 +$deep-purple-2 ?= #d1c4e9 +$deep-purple-3 ?= #b39ddb +$deep-purple-4 ?= #9575cd +$deep-purple-5 ?= #7e57c2 +$deep-purple-6 ?= #673ab7 +$deep-purple-7 ?= #5e35b1 +$deep-purple-8 ?= #512da8 +$deep-purple-9 ?= #4527a0 +$deep-purple-10 ?= #311b92 +$deep-purple-11 ?= #b388ff +$deep-purple-12 ?= #7c4dff +$deep-purple-13 ?= #651fff +$deep-purple-14 ?= #6200ea +$indigo ?= #3f51b5 +$indigo-1 ?= #e8eaf6 +$indigo-2 ?= #c5cae9 +$indigo-3 ?= #9fa8da +$indigo-4 ?= #7986cb +$indigo-5 ?= #5c6bc0 +$indigo-6 ?= #3f51b5 +$indigo-7 ?= #3949ab +$indigo-8 ?= #303f9f +$indigo-9 ?= #283593 +$indigo-10 ?= #1a237e +$indigo-11 ?= #8c9eff +$indigo-12 ?= #536dfe +$indigo-13 ?= #3d5afe +$indigo-14 ?= #304ffe +$blue ?= #2196f3 +$blue-1 ?= #e3f2fd +$blue-2 ?= #bbdefb +$blue-3 ?= #90caf9 +$blue-4 ?= #64b5f6 +$blue-5 ?= #42a5f5 +$blue-6 ?= #2196f3 +$blue-7 ?= #1e88e5 +$blue-8 ?= #1976d2 +$blue-9 ?= #1565c0 +$blue-10 ?= #0d47a1 +$blue-11 ?= #82b1ff +$blue-12 ?= #448aff +$blue-13 ?= #2979ff +$blue-14 ?= #2962ff +$light-blue ?= #03a9f4 +$light-blue-1 ?= #e1f5fe +$light-blue-2 ?= #b3e5fc +$light-blue-3 ?= #81d4fa +$light-blue-4 ?= #4fc3f7 +$light-blue-5 ?= #29b6f6 +$light-blue-6 ?= #03a9f4 +$light-blue-7 ?= #039be5 +$light-blue-8 ?= #0288d1 +$light-blue-9 ?= #0277bd +$light-blue-10 ?= #01579b +$light-blue-11 ?= #80d8ff +$light-blue-12 ?= #40c4ff +$light-blue-13 ?= #00b0ff +$light-blue-14 ?= #0091ea +$cyan ?= #00bcd4 +$cyan-1 ?= #e0f7fa +$cyan-2 ?= #b2ebf2 +$cyan-3 ?= #80deea +$cyan-4 ?= #4dd0e1 +$cyan-5 ?= #26c6da +$cyan-6 ?= #00bcd4 +$cyan-7 ?= #00acc1 +$cyan-8 ?= #0097a7 +$cyan-9 ?= #00838f +$cyan-10 ?= #006064 +$cyan-11 ?= #84ffff +$cyan-12 ?= #18ffff +$cyan-13 ?= #00e5ff +$cyan-14 ?= #00b8d4 +$teal ?= #009688 +$teal-1 ?= #e0f2f1 +$teal-2 ?= #b2dfdb +$teal-3 ?= #80cbc4 +$teal-4 ?= #4db6ac +$teal-5 ?= #26a69a +$teal-6 ?= #009688 +$teal-7 ?= #00897b +$teal-8 ?= #00796b +$teal-9 ?= #00695c +$teal-10 ?= #004d40 +$teal-11 ?= #a7ffeb +$teal-12 ?= #64ffda +$teal-13 ?= #1de9b6 +$teal-14 ?= #00bfa5 +$green ?= #4caf50 +$green-1 ?= #e8f5e9 +$green-2 ?= #c8e6c9 +$green-3 ?= #a5d6a7 +$green-4 ?= #81c784 +$green-5 ?= #66bb6a +$green-6 ?= #4caf50 +$green-7 ?= #43a047 +$green-8 ?= #388e3c +$green-9 ?= #2e7d32 +$green-10 ?= #1b5e20 +$green-11 ?= #b9f6ca +$green-12 ?= #69f0ae +$green-13 ?= #00e676 +$green-14 ?= #00c853 +$light-green ?= #8bc34a +$light-green-1 ?= #f1f8e9 +$light-green-2 ?= #dcedc8 +$light-green-3 ?= #c5e1a5 +$light-green-4 ?= #aed581 +$light-green-5 ?= #9ccc65 +$light-green-6 ?= #8bc34a +$light-green-7 ?= #7cb342 +$light-green-8 ?= #689f38 +$light-green-9 ?= #558b2f +$light-green-10 ?= #33691e +$light-green-11 ?= #ccff90 +$light-green-12 ?= #b2ff59 +$light-green-13 ?= #76ff03 +$light-green-14 ?= #64dd17 +$lime ?= #cddc39 +$lime-1 ?= #f9fbe7 +$lime-2 ?= #f0f4c3 +$lime-3 ?= #e6ee9c +$lime-4 ?= #dce775 +$lime-5 ?= #d4e157 +$lime-6 ?= #cddc39 +$lime-7 ?= #c0ca33 +$lime-8 ?= #afb42b +$lime-9 ?= #9e9d24 +$lime-10 ?= #827717 +$lime-11 ?= #f4ff81 +$lime-12 ?= #eeff41 +$lime-13 ?= #c6ff00 +$lime-14 ?= #aeea00 +$yellow ?= #ffeb3b +$yellow-1 ?= #fffde7 +$yellow-2 ?= #fff9c4 +$yellow-3 ?= #fff59d +$yellow-4 ?= #fff176 +$yellow-5 ?= #ffee58 +$yellow-6 ?= #ffeb3b +$yellow-7 ?= #fdd835 +$yellow-8 ?= #fbc02d +$yellow-9 ?= #f9a825 +$yellow-10 ?= #f57f17 +$yellow-11 ?= #ffff8d +$yellow-12 ?= #ffff00 +$yellow-13 ?= #ffea00 +$yellow-14 ?= #ffd600 +$amber ?= #ffc107 +$amber-1 ?= #fff8e1 +$amber-2 ?= #ffecb3 +$amber-3 ?= #ffe082 +$amber-4 ?= #ffd54f +$amber-5 ?= #ffca28 +$amber-6 ?= #ffc107 +$amber-7 ?= #ffb300 +$amber-8 ?= #ffa000 +$amber-9 ?= #ff8f00 +$amber-10 ?= #ff6f00 +$amber-11 ?= #ffe57f +$amber-12 ?= #ffd740 +$amber-13 ?= #ffc400 +$amber-14 ?= #ffab00 +$orange ?= #ff9800 +$orange-1 ?= #fff3e0 +$orange-2 ?= #ffe0b2 +$orange-3 ?= #ffcc80 +$orange-4 ?= #ffb74d +$orange-5 ?= #ffa726 +$orange-6 ?= #ff9800 +$orange-7 ?= #fb8c00 +$orange-8 ?= #f57c00 +$orange-9 ?= #ef6c00 +$orange-10 ?= #e65100 +$orange-11 ?= #ffd180 +$orange-12 ?= #ffab40 +$orange-13 ?= #ff9100 +$orange-14 ?= #ff6d00 +$deep-orange ?= #ff5722 +$deep-orange-1 ?= #fbe9e7 +$deep-orange-2 ?= #ffccbc +$deep-orange-3 ?= #ffab91 +$deep-orange-4 ?= #ff8a65 +$deep-orange-5 ?= #ff7043 +$deep-orange-6 ?= #ff5722 +$deep-orange-7 ?= #f4511e +$deep-orange-8 ?= #e64a19 +$deep-orange-9 ?= #d84315 +$deep-orange-10 ?= #bf360c +$deep-orange-11 ?= #ff9e80 +$deep-orange-12 ?= #ff6e40 +$deep-orange-13 ?= #ff3d00 +$deep-orange-14 ?= #dd2c00 +$brown ?= #795548 +$brown-1 ?= #efebe9 +$brown-2 ?= #d7ccc8 +$brown-3 ?= #bcaaa4 +$brown-4 ?= #a1887f +$brown-5 ?= #8d6e63 +$brown-6 ?= #795548 +$brown-7 ?= #6d4c41 +$brown-8 ?= #5d4037 +$brown-9 ?= #4e342e +$brown-10 ?= #3e2723 +$brown-11 ?= #d7ccc8 +$brown-12 ?= #bcaaa4 +$brown-13 ?= #8d6e63 +$brown-14 ?= #5d4037 +$grey ?= #9e9e9e +$grey-1 ?= #fafafa +$grey-2 ?= #f5f5f5 +$grey-3 ?= #eeeeee +$grey-4 ?= #e0e0e0 +$grey-5 ?= #bdbdbd +$grey-6 ?= #9e9e9e +$grey-7 ?= #757575 +$grey-8 ?= #616161 +$grey-9 ?= #424242 +$grey-10 ?= #212121 +$grey-11 ?= #f5f5f5 +$grey-12 ?= #eeeeee +$grey-13 ?= #bdbdbd +$grey-14 ?= #616161 +$blue-grey ?= #607d8b +$blue-grey-1 ?= #eceff1 +$blue-grey-2 ?= #cfd8dc +$blue-grey-3 ?= #b0bec5 +$blue-grey-4 ?= #90a4ae +$blue-grey-5 ?= #78909c +$blue-grey-6 ?= #607d8b +$blue-grey-7 ?= #546e7a +$blue-grey-8 ?= #455a64 +$blue-grey-9 ?= #37474f +$blue-grey-10 ?= #263238 +$blue-grey-11 ?= #cfd8dc +$blue-grey-12 ?= #b0bec5 +$blue-grey-13 ?= #78909c +$blue-grey-14 ?= #455a64 + +$ios-statusbar-height ?= 20px + +$z-fab ?= 990 +$z-side ?= 1000 +$z-marginals ?= 2000 +$z-fixed-drawer ?= 3000 +$z-fullscreen ?= 6000 +$z-menu ?= 6000 +$z-top ?= 7000 +$z-tooltip ?= 9000 +$z-notify ?= 9500 +$z-max ?= 9998 + +$shadow-color ?= black +$shadow-transition ?= box-shadow .28s cubic-bezier(.4, 0, .2, 1) +$inset-shadow ?= 0 7px 9px -7px rgba($shadow-color, .7) inset + +$elevation-umbra ?= rgba($shadow-color, .2) +$elevation-penumbra ?= rgba($shadow-color, .14) +$elevation-ambient ?= rgba($shadow-color, .12) + +$shadow-0 ?= 0 0 0 $elevation-umbra, 0 0 0 $elevation-penumbra, 0 0 0 $elevation-ambient +$shadow-1 ?= 0 1px 3px $elevation-umbra, 0 1px 1px $elevation-penumbra, 0 2px 1px -1px $elevation-ambient +$shadow-2 ?= 0 1px 5px $elevation-umbra, 0 2px 2px $elevation-penumbra, 0 3px 1px -2px $elevation-ambient +$shadow-3 ?= 0 1px 8px $elevation-umbra, 0 3px 4px $elevation-penumbra, 0 3px 3px -2px $elevation-ambient +$shadow-4 ?= 0 2px 4px -1px $elevation-umbra, 0 4px 5px $elevation-penumbra, 0 1px 10px $elevation-ambient +$shadow-5 ?= 0 3px 5px -1px $elevation-umbra, 0 5px 8px $elevation-penumbra, 0 1px 14px $elevation-ambient +$shadow-6 ?= 0 3px 5px -1px $elevation-umbra, 0 6px 10px $elevation-penumbra, 0 1px 18px $elevation-ambient +$shadow-7 ?= 0 4px 5px -2px $elevation-umbra, 0 7px 10px 1px $elevation-penumbra, 0 2px 16px 1px $elevation-ambient +$shadow-8 ?= 0 5px 5px -3px $elevation-umbra, 0 8px 10px 1px $elevation-penumbra, 0 3px 14px 2px $elevation-ambient +$shadow-9 ?= 0 5px 6px -3px $elevation-umbra, 0 9px 12px 1px $elevation-penumbra, 0 3px 16px 2px $elevation-ambient +$shadow-10 ?= 0 6px 6px -3px $elevation-umbra, 0 10px 14px 1px $elevation-penumbra, 0 4px 18px 3px $elevation-ambient +$shadow-11 ?= 0 6px 7px -4px $elevation-umbra, 0 11px 15px 1px $elevation-penumbra, 0 4px 20px 3px $elevation-ambient +$shadow-12 ?= 0 7px 8px -4px $elevation-umbra, 0 12px 17px 2px $elevation-penumbra, 0 5px 22px 4px $elevation-ambient +$shadow-13 ?= 0 7px 8px -4px $elevation-umbra, 0 13px 19px 2px $elevation-penumbra, 0 5px 24px 4px $elevation-ambient +$shadow-14 ?= 0 7px 9px -4px $elevation-umbra, 0 14px 21px 2px $elevation-penumbra, 0 5px 26px 4px $elevation-ambient +$shadow-15 ?= 0 8px 9px -5px $elevation-umbra, 0 15px 22px 2px $elevation-penumbra, 0 6px 28px 5px $elevation-ambient +$shadow-16 ?= 0 8px 10px -5px $elevation-umbra, 0 16px 24px 2px $elevation-penumbra, 0 6px 30px 5px $elevation-ambient +$shadow-17 ?= 0 8px 11px -5px $elevation-umbra, 0 17px 26px 2px $elevation-penumbra, 0 6px 32px 5px $elevation-ambient +$shadow-18 ?= 0 9px 11px -5px $elevation-umbra, 0 18px 28px 2px $elevation-penumbra, 0 7px 34px 6px $elevation-ambient +$shadow-19 ?= 0 9px 12px -6px $elevation-umbra, 0 19px 29px 2px $elevation-penumbra, 0 7px 36px 6px $elevation-ambient +$shadow-20 ?= 0 10px 13px -6px $elevation-umbra, 0 20px 31px 3px $elevation-penumbra, 0 8px 38px 7px $elevation-ambient +$shadow-21 ?= 0 10px 13px -6px $elevation-umbra, 0 21px 33px 3px $elevation-penumbra, 0 8px 40px 7px $elevation-ambient +$shadow-22 ?= 0 10px 14px -6px $elevation-umbra, 0 22px 35px 3px $elevation-penumbra, 0 8px 42px 7px $elevation-ambient +$shadow-23 ?= 0 11px 14px -7px $elevation-umbra, 0 23px 36px 3px $elevation-penumbra, 0 9px 44px 8px $elevation-ambient +$shadow-24 ?= 0 11px 15px -7px $elevation-umbra, 0 24px 38px 3px $elevation-penumbra, 0 9px 46px 8px $elevation-ambient + +$shadow-up-0 ?= 0 0 0 $elevation-umbra, 0 0 0 $elevation-penumbra, 0 0 0 $elevation-ambient +$shadow-up-1 ?= 0 -1px 3px $elevation-umbra, 0 -1px 1px $elevation-penumbra, 0 -2px 1px -1px $elevation-ambient +$shadow-up-2 ?= 0 -1px 5px $elevation-umbra, 0 -2px 2px $elevation-penumbra, 0 -3px 1px -2px $elevation-ambient +$shadow-up-3 ?= 0 -1px 8px $elevation-umbra, 0 -3px 4px $elevation-penumbra, 0 -3px 3px -2px $elevation-ambient +$shadow-up-4 ?= 0 -2px 4px -1px $elevation-umbra, 0 -4px 5px $elevation-penumbra, 0 -1px 10px $elevation-ambient +$shadow-up-5 ?= 0 -3px 5px -1px $elevation-umbra, 0 -5px 8px $elevation-penumbra, 0 -1px 14px $elevation-ambient +$shadow-up-6 ?= 0 -3px 5px -1px $elevation-umbra, 0 -6px 10px $elevation-penumbra, 0 -1px 18px $elevation-ambient +$shadow-up-7 ?= 0 -4px 5px -2px $elevation-umbra, 0 -7px 10px 1px $elevation-penumbra, 0 -2px 16px 1px $elevation-ambient +$shadow-up-8 ?= 0 -5px 5px -3px $elevation-umbra, 0 -8px 10px 1px $elevation-penumbra, 0 -3px 14px 2px $elevation-ambient +$shadow-up-9 ?= 0 -5px 6px -3px $elevation-umbra, 0 -9px 12px 1px $elevation-penumbra, 0 -3px 16px 2px $elevation-ambient +$shadow-up-10 ?= 0 -6px 6px -3px $elevation-umbra, 0 -10px 14px 1px $elevation-penumbra, 0 -4px 18px 3px $elevation-ambient +$shadow-up-11 ?= 0 -6px 7px -4px $elevation-umbra, 0 -11px 15px 1px $elevation-penumbra, 0 -4px 20px 3px $elevation-ambient +$shadow-up-12 ?= 0 -7px 8px -4px $elevation-umbra, 0 -12px 17px 2px $elevation-penumbra, 0 -5px 22px 4px $elevation-ambient +$shadow-up-13 ?= 0 -7px 8px -4px $elevation-umbra, 0 -13px 19px 2px $elevation-penumbra, 0 -5px 24px 4px $elevation-ambient +$shadow-up-14 ?= 0 -7px 9px -4px $elevation-umbra, 0 -14px 21px 2px $elevation-penumbra, 0 -5px 26px 4px $elevation-ambient +$shadow-up-15 ?= 0 -8px 9px -5px $elevation-umbra, 0 -15px 22px 2px $elevation-penumbra, 0 -6px 28px 5px $elevation-ambient +$shadow-up-16 ?= 0 -8px 10px -5px $elevation-umbra, 0 -16px 24px 2px $elevation-penumbra, 0 -6px 30px 5px $elevation-ambient +$shadow-up-17 ?= 0 -8px 11px -5px $elevation-umbra, 0 -17px 26px 2px $elevation-penumbra, 0 -6px 32px 5px $elevation-ambient +$shadow-up-18 ?= 0 -9px 11px -5px $elevation-umbra, 0 -18px 28px 2px $elevation-penumbra, 0 -7px 34px 6px $elevation-ambient +$shadow-up-19 ?= 0 -9px 12px -6px $elevation-umbra, 0 -19px 29px 2px $elevation-penumbra, 0 -7px 36px 6px $elevation-ambient +$shadow-up-20 ?= 0 -10px 13px -6px $elevation-umbra, 0 -20px 31px 3px $elevation-penumbra, 0 -8px 38px 7px $elevation-ambient +$shadow-up-21 ?= 0 -10px 13px -6px $elevation-umbra, 0 -21px 33px 3px $elevation-penumbra, 0 -8px 40px 7px $elevation-ambient +$shadow-up-22 ?= 0 -10px 14px -6px $elevation-umbra, 0 -22px 35px 3px $elevation-penumbra, 0 -8px 42px 7px $elevation-ambient +$shadow-up-23 ?= 0 -11px 14px -7px $elevation-umbra, 0 -23px 36px 3px $elevation-penumbra, 0 -9px 44px 8px $elevation-ambient +$shadow-up-24 ?= 0 -11px 15px -7px $elevation-umbra, 0 -24px 38px 3px $elevation-penumbra, 0 -9px 46px 8px $elevation-ambient + + +$generic-border-radius ?= 4px +$generic-hover-transition ?= .3s cubic-bezier(.25, .8, .5, 1) +$typography-font-family ?= 'Roboto', '-apple-system', 'Helvetica Neue', Helvetica, Arial, sans-serif +$min-line-height ?= 1.12 + +$button-border-radius ?= 3px +$button-padding ?= 4px 16px +$button-dense-padding ?= .285em +$button-transition ?= $generic-hover-transition +$button-font-size ?= 14px +$button-line-height ?= 1.718em +$button-font-weight ?= 500 +$button-shadow ?= $shadow-2 +$button-shadow-active ?= $shadow-5 +$button-rounded-border-radius ?= 28px +$button-push-border-radius ?= 7px + +$chat-message-received-color ?= black +$chat-message-received-bg ?= $green-4 +$chat-message-sent-color ?= black +$chat-message-sent-bg ?= $grey-4 +$chat-message-avatar-size ?= 48px +$chat-message-border-radius ?= $generic-border-radius +$chat-message-distance ?= 8px +$chat-message-text-padding ?= 8px + +$item-base-color ?= $grey-5 + +$editor-border-color ?= $separator-color +$editor-content-padding ?= 10px +$editor-content-min-height ?= 10em +$editor-toolbar-padding ?= 4px +$editor-hr-color ?= $editor-border-color +$editor-button-gutter ?= 4px + +$fab-margin ?= 5px + +$table-transition ?= $generic-hover-transition +$table-border-radius ?= $generic-border-radius +$table-box-shadow ?= $shadow-2 + +$table-border-color ?= $separator-color +$table-hover-background ?= rgba(0, 0, 0, .03) +$table-selected-background ?= rgba(0, 0, 0, .06) + +$table-dark-border-color ?= $separator-dark-color +$table-dark-hover-background ?= rgba(255, 255, 255, .07) +$table-dark-selected-background ?= rgba(255, 255, 255, .1) + +$toolbar-min-height ?= 50px +$toolbar-padding ?= 0 12px +$toolbar-inset-size ?= 58px +$toolbar-title-font-size ?= 21px +$toolbar-title-font-weight ?= normal +$toolbar-title-letter-spacing ?= .01em +$toolbar-title-padding ?= 0 12px + +$layout-border ?= 1px solid $separator-color +$layout-shadow ?= 0 0 10px 2px rgba(0,0,0,0.2), 0 0px 10px rgba(0,0,0,0.24) + +$menu-background ?= white +$menu-box-shadow ?= $shadow-2 +$menu-max-width ?= 95vw + +$rating-grade-color ?= $yellow +$rating-shadow ?= 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24) + +$tooltip-color ?= #fafafa +$tooltip-background ?= $grey-7 +$tooltip-padding ?= 6px 10px +$tooltip-border-radius ?= $generic-border-radius +$tooltip-fontsize ?= 10px +$tooltip-mobile-padding ?= 8px 16px +$tooltip-mobile-fontsize ?= 14px + +$option-focus-transition ?= .22s cubic-bezier(0,0,.2,1) + +$input-font-size ?= 14px +$input-text-color ?= rgba(0,0,0,.87) +$input-label-color ?= rgba(0,0,0,.6) +$input-autofill-color ?= inherit + +$img-width ?= 100% +$img-background-repeat ?= no-repeat +$img-loading-font-size ?= 50px +$img-content-position ?= absolute +$img-content-padding ?= 16px +$img-content-color ?= white +$img-content-background ?= rgba(0, 0, 0, .47) diff --git a/examples/ws-fio-client/src/index.template.html b/examples/ws-fio-client/src/index.template.html new file mode 100644 index 0000000..c0e888f --- /dev/null +++ b/examples/ws-fio-client/src/index.template.html @@ -0,0 +1,22 @@ + + + + <%= htmlWebpackPlugin.options.productName %> + + + + + + + + + + + + + + + +
+ + diff --git a/examples/ws-fio-client/src/layouts/default.vue b/examples/ws-fio-client/src/layouts/default.vue new file mode 100644 index 0000000..f0176f9 --- /dev/null +++ b/examples/ws-fio-client/src/layouts/default.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/examples/ws-fio-client/src/pages/Error404.vue b/examples/ws-fio-client/src/pages/Error404.vue new file mode 100644 index 0000000..cfaab5f --- /dev/null +++ b/examples/ws-fio-client/src/pages/Error404.vue @@ -0,0 +1,22 @@ + + + diff --git a/examples/ws-fio-client/src/pages/Index.vue b/examples/ws-fio-client/src/pages/Index.vue new file mode 100644 index 0000000..8e9c96f --- /dev/null +++ b/examples/ws-fio-client/src/pages/Index.vue @@ -0,0 +1,167 @@ + + + + diff --git a/examples/ws-fio-client/src/router/index.js b/examples/ws-fio-client/src/router/index.js new file mode 100644 index 0000000..46c6d54 --- /dev/null +++ b/examples/ws-fio-client/src/router/index.js @@ -0,0 +1,26 @@ +import Vue from 'vue' +import VueRouter from 'vue-router' + +import routes from './routes' + +Vue.use(VueRouter) + +/* + * If not building with SSR mode, you can + * directly export the Router instantiation + */ + +export default function (/* { store, ssrContext } */) { + const Router = new VueRouter({ + scrollBehavior: () => ({ x: 0, y: 0 }), + routes, + + // Leave these as is and change from quasar.conf.js instead! + // quasar.conf.js -> build -> vueRouterMode + // quasar.conf.js -> build -> publicPath + mode: process.env.VUE_ROUTER_MODE, + base: process.env.VUE_ROUTER_BASE + }) + + return Router +} diff --git a/examples/ws-fio-client/src/router/routes.js b/examples/ws-fio-client/src/router/routes.js new file mode 100644 index 0000000..24155d3 --- /dev/null +++ b/examples/ws-fio-client/src/router/routes.js @@ -0,0 +1,20 @@ + +const routes = [ + { + path: '/', + component: () => import('layouts/default.vue'), + children: [ + { path: '', component: () => import('pages/Index.vue') } + ] + } +] + +// Always leave this as last one +if (process.env.MODE !== 'ssr') { + routes.push({ + path: '*', + component: () => import('pages/Error404.vue') + }) +} + +export default routes diff --git a/examples/ws-fio-client/src/statics/app-logo-128x128.png b/examples/ws-fio-client/src/statics/app-logo-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3012a9e56cdff12b2f235565a6437a2a938beb GIT binary patch literal 9181 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 literal 0 HcmV?d00001 diff --git a/examples/ws-fio-client/src/statics/icons/apple-icon-120x120.png b/examples/ws-fio-client/src/statics/icons/apple-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..387499a813a9b33f7fac93f5ed118c10a984b337 GIT binary patch literal 8350 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 literal 0 HcmV?d00001 diff --git a/examples/ws-fio-client/src/statics/icons/apple-icon-152x152.png b/examples/ws-fio-client/src/statics/icons/apple-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..5b76f91cd8478af43b235aae011f34ab083f167e GIT binary patch literal 10707 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 FV1j+5WEB7a literal 0 HcmV?d00001 diff --git a/examples/ws-fio-client/src/statics/icons/apple-icon-167x167.png b/examples/ws-fio-client/src/statics/icons/apple-icon-167x167.png new file mode 100644 index 0000000000000000000000000000000000000000..0d743a6597133586541921e2014b7cca1034b99f GIT binary patch literal 12058 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

YR5<)yc0dan{z4esPi0 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

LyEn^rm*h4&4KMFwcDTtSm0%Cw6X(0925 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 literal 0 HcmV?d00001 diff --git a/examples/ws-fio-client/src/statics/icons/icon-128x128.png b/examples/ws-fio-client/src/statics/icons/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3012a9e56cdff12b2f235565a6437a2a938beb GIT binary patch literal 9181 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 literal 0 HcmV?d00001 diff --git a/examples/ws-fio-client/src/statics/icons/icon-192x192.png b/examples/ws-fio-client/src/statics/icons/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..144d4749439af2ac430f65fa8820f729619cbee9 GIT binary patch literal 13796 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 Hu0mjfpFzLp literal 0 HcmV?d00001 diff --git a/examples/ws-fio-client/src/statics/icons/icon-384x384.png b/examples/ws-fio-client/src/statics/icons/icon-384x384.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb494e1aac6658d18290530a8aebce8c1e190ba GIT binary patch literal 28922 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 ID_MpAAJb&Qr~m)} literal 0 HcmV?d00001 diff --git a/examples/ws-fio-client/src/statics/icons/icon-512x512.png b/examples/ws-fio-client/src/statics/icons/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..9b9ff56cbcb856b6d0aea10cba29606dd55d0809 GIT binary patch literal 39953 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%0AVgFg{~wtAvLMmfciFg&w!9b|;m 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 W&wCf4qu0~`0000 \ No newline at end of file diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000..7044a6f --- /dev/null +++ b/nodemon.json @@ -0,0 +1,4 @@ +{ + "ignoreRoot": [".git","examples/ws-fio-client"], + "watch": ["node_modules/@uci/","node_modules/@uci-utils/","src/","index.js","examples/"] +} diff --git a/package.json b/package.json index 28719c3..c8c9bd1 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,17 @@ { "name": "@uci/base", - "version": "0.1.25", + "version": "0.1.26", "description": "Multi type and transport JSON packet communication base class. Used in UCI extended classes", "main": "src/base", "scripts": { - "fiod": "UCI_ENV=dev ./node_modules/.bin/nodemon -r esm examples/four-in-one", + "fiod": "UCI_ENV=dev ./node_modules/.bin/nodemon -r esm --preserve-symlinks examples/four-in-one", "fio": "nodemon -r esm examples/four-in-one", "dy": "node -r esm examples/dynamic", "web": "UCI_DEV=true nodemon -r esm examples/web", "mqtt": "nodemon -r esm examples/mqtt", "ha-mqtt": "nodemon -r esm examples/ha-mqtt", - "testw": "mocha -r esm test/*.test.mjs --watch --recurse --watch-extensions mjs", - "test": "mocha -r esm test/*.test.mjs", - "testci": "istanbul cover ./node_modules/.bin/_mocha --report lcovonly -- -R spec --recursive && codecov || true" + "testw": "mocha -r esm test/*.test.mjs --watch --recurse ", + "test": "mocha -r esm test/*.test.mjs" }, "author": "David Kebler", "license": "MIT", @@ -40,7 +39,7 @@ "@uci-utils/bind-funcs": "^0.2.4", "@uci-utils/logger": "^0.0.15", "@uci/mqtt": "^0.1.12", - "@uci/socket": "^0.2.17", + "@uci/socket": "^0.2.19", "@uci/websocket": "^0.3.8", "await-to-js": "^2.1.1", "p-settle": "^3.1.0" diff --git a/src/base.js b/src/base.js index feb1505..97010d4 100644 --- a/src/base.js +++ b/src/base.js @@ -304,25 +304,35 @@ class Base extends EventEmitter { // add set of functions to class prop/space and then register with this addNamespace(space, type, trans) { + if (type !=='c' || type !=='s') { + trans = type + type = 's' } + trans = this._validateTransport(trans) if (trans) return this._namespaces[type + trans].unshift(space) else return this._namespaces[type].unshift(space) } // TODO confirm Object.assign will be ok as it is not a deep copy // one off add a command function or two to basic namespaces which is called before default - amendConsumerCommands(funcs, trans) { - if (trans) { - if (!this._c[trans]) this._c[trans] = {} - Object.assign(this._c[trans], funcs) + + amendCommands(funcs, trans, type) { + if (!trans && !type) type = 's' + if (trans ==='c' || trans ==='s') { + type = trans + trans = '' } - Object.assign(this._c, funcs) + trans = this._validateTransport(trans) + if (!this['_'+type+trans]) this['_'+type+trans] = {} + Object.assign(this['_'+type+trans], funcs) // trans is type here + log.debug({msg:'amended namespace', default_key:'_'+type+trans, functions:this['_'+type+trans]}) } + + amendConsumerCommands(funcs, trans) { + this.amendCommands(funcs,trans,'c') + } + amendSocketCommands(funcs, trans) { - if (trans) { - if (!this._s[trans]) this._s[trans] = {} - Object.assign(this._s[trans], funcs) - } - Object.assign(this._s, funcs) + this.amendCommands(funcs,trans) } // func should take and return a packet. if type @@ -338,21 +348,6 @@ class Base extends EventEmitter { this._packetHook('afterProcess', func,opts) } - _packetHook(hook,func,opts) { - log.debug({msg:'hooking a socket(s)', method:'_packetHook', line:334, hook:hook, function:func, options:opts}) - let {name,type,trans,all} = opts - if (name) this._socket[name][hook] = func - else { - log.debug({msg:'sockets available to hook', method:'_packetHook', line:338, sockets: Object.keys(this._socket)}) - for (let name of Object.keys(this._socket)) { - if (this._socket[name].type === type) this._socket[name][hook] = func - if (this._socket[name].transport === trans) this._socket[name][hook] = func - if (all) this._socket[name][hook] = func - if (this._socket[name][hook]) log.debug({msg:'hooked socket', method:'_packetHook', line:343, name:name, type:this._socket[name].type, trans:this._socket[name].transport}) - } - } - } - // A Big Hammer - use only if necessary - default with hooks should suffice // these three will pre-empt default processor to be called in ._packetProcess @@ -388,6 +383,24 @@ class Base extends EventEmitter { * */ + + + _packetHook(hook,func,opts) { + log.debug({msg:'hooking a socket(s)', method:'_packetHook', line:334, hook:hook, function:func, options:opts}) + let {name,type,trans,all} = opts + if (name) this._socket[name][hook] = func + else { + log.debug({msg:'sockets available to hook', method:'_packetHook', line:338, sockets: Object.keys(this._socket)}) + for (let name of Object.keys(this._socket)) { + if (this._socket[name].type === type) this._socket[name][hook] = func + if (this._socket[name].transport === trans) this._socket[name][hook] = func + if (all) this._socket[name][hook] = func + if (this._socket[name][hook]) log.debug({msg:'hooked socket', method:'_packetHook', line:343, name:name, type:this._socket[name].type, trans:this._socket[name].transport}) + } + } + } + + /* **********default packet processor for all sockets * this can be hooked or replaced all together @@ -436,6 +449,27 @@ class Base extends EventEmitter { } } + _validateTransport(trans, type='s') { + const valids = { + w:'w', + web:'w', + n:'n', + named:'n', + unix:'n', + pipe:'n', + t:'t', + tcp:'t', + net:'t', + network:'t', + m:'m', + mqtt:'m', + } + trans = valids[trans] || '' + if (type !== 'c' && trans ==='w') trans = '' + return trans + } + + _transport(name) { return this._socket[name].transport } //getter for socket transport @@ -457,7 +491,7 @@ class Base extends EventEmitter { return cmd_func } - // takes command and returns corresponding function in a hash + // takes command and returns corresponding function in a hash, recurisve walk _getCmdFunc(cmd, obj) { if (typeof cmd === 'string') { if (!obj) obj = this diff --git a/src/processing.js b/src/processing.js index 4db0920..af4dce2 100644 --- a/src/processing.js +++ b/src/processing.js @@ -45,16 +45,18 @@ const _process = { } } +// default name spaces const namespaces = { - s: ['_s'], - c: ['_c'], - cn: ['cn'], - ct: ['ct'], - sn: ['sn'], - st: ['st'], - cm: ['cm'], - sm: ['sm'], - sw: ['sw'], + s: ['_s'], // default command functions below + c: ['_c'], // default command functions below + cn: ['_cn'], + ct: ['_ct'], + cm: ['_cm'], + // no cw because websocket client runs in browser only + sn: ['_sn'], + st: ['_st'], + sm: ['_sm'], + sw: ['_sw'], } /* @@ -67,14 +69,14 @@ const defaultCmds ={ s:{ echo: async packet => { packet.processed = true - packet.info = 'default socket echo' + packet.msg = 'default socket echo' return packet }, // add sedning along an ack to any consumers and or pushing to other sockets on this device ack: async packet => { packet.cmd = 'reply' packet.ack = true - packet.info = 'this is the base default ack, superceed in your extended class' + packet.msg = 'this is the base default ack, superceed in your extended class' return packet } },