UNPKG

w-comor-hapi

Version:

A http communicator in nodejs and browser. Mapping functions from nodejs to other end points, like a simple RPC.

272 lines (229 loc) 7.98 kB
import axios from 'axios' import get from 'lodash-es/get.js' import set from 'lodash-es/set.js' import genPm from 'wsemi/src/genPm.mjs' import isfun from 'wsemi/src/isfun.mjs' import haskey from 'wsemi/src/haskey.mjs' //import clearXSS from 'wsemi/src/clearXSS.mjs' import genID from 'wsemi/src/genID.mjs' /** * 建立http API使用者(Node.js與Browser)端物件 * * @param {Object} opt 輸入設定參數物件 * @param {String} [opt.url='http://localhost:8080/api'] 輸入http API伺服器網址,預設為'http://localhost:8080/api' * @param {String} [opt.token='*'] 輸入使用者認證用token,預設為'*' * @param {Function} opt.error 輸入監聽error函數 * @param {Function} opt.reconn 輸入監聽reconn函數 * @returns {Promise} 回傳Promise,resolve為映射伺服器端可用函數之物件,各函數輸入皆為單一物件,各函數回傳皆為Promise,用resolve與reject處理回傳結果 * @example * * import WComorHapiClient from 'w-comor-hapi/dist/ws-client-node.umd.js' * * //opt * let opt = { * url: 'http://localhost:8080/api', * token: '*', * error: function(err) { * console.log('client: error:', err) * }, * reconn: function() { * console.log('client: reconn') * }, * } * * //WComorHapiClient * new WComorHapiClient(opt) * .then(function(wo) { * console.log('client: funcs: ', wo) * * function core(ps) { * wo.group.plus(ps) * .then(function(r) { * console.log('client: plus(' + JSON.stringify(ps) + ')=' + r) * }) * .catch(function(err) { * console.log('client: plus: catch: ', err) * }) * wo.group.div(ps) * .then(function(r) { * console.log('client: div(' + JSON.stringify(ps) + ')=' + r) * }) * .catch(function(err) { * console.log('client: div: catch: ', err) * }) * wo.add(ps) * .then(function(r) { * console.log(`client: add(${JSON.stringify(ps)})=${r}`) * }) * .catch(function(err) { * console.log('client: add: catch: ', err) * }) * wo.minu(ps) * .then(function(r) { * console.log(`client: minu(${JSON.stringify(ps)})=${r}`) * }) * .catch(function(err) { * console.log('client: minu: catch: ', err) * }) * } * * let i = 100 * setInterval(function() { * i += 1 * core({ * p1: i, * p2: 10, * }) * }, 1000) * * }) * .catch(function(err) { * console.log('client: catch', err) * }) * */ function WComorHapiClient(opt) { let pm = genPm() let wo = {} //回傳操作物件 let clientId = genID() //供伺服器識別真實連線使用者 function core() { //default if (!opt.url) { opt.url = 'http://localhost:8080/api' } if (!opt.token) { opt.token = '*' } //aj function aj(data, mode) { let pmm = genPm() //data to json string // if (mode !== 'upload file') { // data = JSON.stringify(data) // } // //clearXSS // data = clearXSS(data) //s let s = { method: 'POST', url: opt.url, data, // onUploadProgress: function(ev) { // let p = ev.loaded // let r = 0 // if (ev.lengthComputable) { // r = (ev.loaded * 100) / ev.total // } // if (isfun(opt.onUploadProgress)) { // opt.onUploadProgress(Math.floor(r), r, p, 'upload') // } // }, // onDownloadProgress: function (ev) { // let p = ev.loaded // let r = 0 // if (ispint(opt.downloadFileSize)) { // r = (ev.loaded * 100) / (opt.downloadFileSize * 1024) // } // if (isfun(opt.onDownloadProgress)) { // opt.onDownloadProgress(Math.floor(r), r, p, 'download') // } // }, } //add Content-Type if (mode === 'upload file') { s['headers'] = { 'Content-Type': 'multipart/form-data' } } //add responseType if (mode === 'download file') { s['responseType'] = 'blob' } //axios axios(s) .then(function(res) { //console.log('aj then', res, res.data.output) pmm.resolve(res.data.output) }) .catch(function(res) { //console.log('aj catch', res) let err = get(res, 'response.data') if (err) { res = err } else { res = 'can not connection' } pmm.reject(res) }) return pmm } //execFunction function execFunction(func, input = null) { //data let data = { clientId, token: opt.token, func, input, } //mode let mode = '' if (get(input, 'mode')) { mode = input.mode } //aj return aj(data, mode) } //getFuncs execFunction('getFuncs') .then(function (data) { //get sys funcs if (get(data, 'sys') === 'sys' && haskey(data, 'funcs')) { //funcs let funcs = data['funcs'] //clear wo wo = {} //bind funcs for (let i = 0; i < funcs.length; i++) { //func let func = funcs[i] //add func let f = function(input) { return execFunction(func, input) } set(wo, func, f) } //resolve pm.resolve(wo) } else { let err = 'no funcs' if (isfun(opt.error)) { opt.error(err) } reconn() //pm.reject(err) //不能reject否則無法reconn } }) .catch(function(err) { if (isfun(opt.error)) { opt.error(err) } reconn() //pm.reject(err) //不能reject否則無法reconn }) } function reconn() { setTimeout(function() { if (isfun(opt.reconn)) { opt.reconn() } core() }, 1000) } //core core() return pm } export default WComorHapiClient