diff --git a/hunks/hunks.js b/hunks/hunks.js index 9d127b65132f87d46f046a167ba6ee318287895d..14ccdc9ecabd0084bbb1d915d81fea851d5bf481 100644 --- a/hunks/hunks.js +++ b/hunks/hunks.js @@ -238,12 +238,12 @@ function deepCopy(obj) { } function isOKType(type){ - // etc, - return (type === 'Number' - || type === 'Boolean' - || type === 'String' - || type === 'Object' - || type === 'Any' + // etc, lowecase to match with typeof ~ queeeries ~ + return (type === 'number' + || type === 'boolean' + || type === 'string' + || type === 'object' + || type === 'any' || type === 'byte' || type === 'byteArray' || type === 'uint8' diff --git a/hunks/link.js b/hunks/link.js index 399f9a6d501a0fff5343a676c632e0d4b5280cc0..642d95c4e1ee5645ea0578fff4312708edc49e93 100644 --- a/hunks/link.js +++ b/hunks/link.js @@ -25,8 +25,8 @@ function Link() { this.outputs.push(dtout) // default messages -> manager, besides also data link - let inputList = new State('String', 'inputList', "mgrMsgs (byteArray)") - let outputList = new State('String', 'outputList', "mgrMsgs (byteArray)") + let inputList = new State('string', 'inputList', "mgrMsgs (byteArray)") + let outputList = new State('string', 'outputList', "mgrMsgs (byteArray)") this.state.push(inputList, outputList) /* --------------------------- ---------------------------- */ diff --git a/hunks/manager.js b/hunks/manager.js index fa8cad8b3fcc803afb75ae2a04ccf0fbd562369c..0839b2946c7e389461de9cfd6fcfb62e06edffe1 100644 --- a/hunks/manager.js +++ b/hunks/manager.js @@ -8,6 +8,7 @@ import { import { TSET, MK, + HK, MSGS } from '../typeset.js' @@ -43,7 +44,7 @@ function Manager() { let msg = new Array() msg.push(MK.ERR) MSGS.writeTo(msg, message, 'string') - writemessage(msg) + writeMessage(msg) } /* --------------------------- ---------------------------- */ @@ -74,10 +75,41 @@ function Manager() { this.sendHunkAsDef = (hunk) => { let def = writeDefinition(hunk) if (msgverbose) this.log('msg: putdef', def) - writemessage('putdef', def) + writeMessage('putdef', def) } let serializeHunk = (hunk, bytes) => { + // write the hunk into this array + bytes.push(HK.ID) + MSGS.writeTo(bytes, hunk.id, 'string') + bytes.push(HK.NAME) + MSGS.writeTo(bytes, hunk.name, 'string') + // write inputs, + if(hunk.inputs.length > 0){ + for(let ip of hunk.inputs){ + bytes.push(HK.INPUT) + MSGS.writeTo(bytes, ip.name, 'string') + MSGS.writeTo(bytes, ip.type, 'string') + } + } + // write outputs, + if(hunk.outputs.length > 0){ + for(let op of hunk.outputs){ + bytes.push(HK.OUTPUT) + MSGS.writeTo(bytes, op.name, 'string') + MSGS.writeTo(bytes, op.type, 'string') + } + } + // write state, + if(hunk.state.length > 0){ + for(let st of hunk.state){ + bytes.push(HK.STATE) + MSGS.writeTo(bytes, st.name, 'string') + MSGS.writeTo(bytes, st.type, 'string') + // yarr, last is a debug flag + MSGS.writeTo(bytes, st.value, st.type, true) + } + } // HERE you r at this ... name / id / inputs / outputs / state } @@ -214,7 +246,7 @@ function Manager() { for (let st in hunk.state) { hunk.state[st].hookup = (value) => { // console.log('MGR -> VIEW STATECHANGE') - writemessage('putstate', { + writeMessage('putstate', { id: hunk.id, name: hunk.state[st].name, value: value @@ -239,7 +271,7 @@ function Manager() { //console.log('SETTING', state[sn]) so.value = state[sn] } else { - writemessage('error', 'problematic state content in program, object not found') + writeMessage('error', 'problematic state content in program, object not found') } } } @@ -321,7 +353,7 @@ function Manager() { if (verbose) this.log(`hooking ${outHunk.id}, ${otp.name} to ${inHunk.id}, ${inp.name}`) otp.attach(inp, inHunk.id) // should be verbatim, so - writemessage('putlink', { + writeMessage('putlink', { outId: outHunkId, outName: outputName, inId: inHunkId, @@ -358,7 +390,7 @@ function Manager() { } else { this.log(`unhooking ${outHunk.id} to ${inHunk.id}`) if (outHunk.outputs[outputName].remove(inHunk.inputs[inputName], inHunk.id)) { - writemessage('removelink', { + writeMessage('removelink', { outId: outHunkId, outName: outputName, inId: inHunkId, @@ -478,19 +510,19 @@ function Manager() { if (msgsin.io) { let msg = msgsin.get() if (msgverbose) this.log(`gets msg ${header}`) - if (!Array.isArray(msg)) throw new Error('hello pls messages by array only now') + if (!Array.isArray(msg)) throw new Error(`manager throwing object message, having header ${msg.header}`) // once let resp = new Array() // rules: bytes in this switch, objects elsewhere ? switch (msg[0]) { case MK.HELLO: - writemessage([MK.HELLORESPONSE]) + writeMessage([MK.HELLORESPONSE]) break case MK.DESCRIBESELF: resp.push(MK.BRIEF) MSGS.writeTo(resp, this.id, 'string') MSGS.writeTo(resp, GG.interpretername, 'string') - writemessage(resp) + writeMessage(resp) break case MK.REQLISTAVAIL: // allow for error path, @@ -501,7 +533,7 @@ function Manager() { // console.log('writing item', item) MSGS.writeTo(resp, item, 'string') } - writemessage(resp) + writeMessage(resp) // for item in list add to resp as string, // what of top level designation as list-of-strings ? lengths! }).catch((err) => { @@ -516,13 +548,16 @@ function Manager() { // then do, // a meta comment is that this add promise doesn't fail for // things like path-loading errors, that would be inside of gogetter.js + // i.e. pulling a hunk loads it into that import script hack, that just + // gets evaluated into the dom ... console.log('manager to add', strname) this.addHunk(strname).then((hunk) => { console.log('successfully added hunk', hunk) // serialize resp.push(MK.HUNKALIVE) serializeHunk(hunk, resp) - console.log('TERM serialization', resp) + // ok then, + writeMessage(resp) }).catch((err) => { console.log('addhunk err', err) }) @@ -536,7 +571,7 @@ function Manager() { switch (false) { case 'hello': let options = this.getHelloResponses() - writemessage('putcontextoptions', options) + writeMessage('putcontextoptions', options) break case 'listhunks': getListOfAvailableComponents().then((list) => { @@ -550,9 +585,9 @@ function Manager() { } options.push(option) } - writemessage('putcontextoptions', options) + writeMessage('putcontextoptions', options) }).catch((err) => { - writemessage('error', 'ERR while getting list of available' + err) + writeMessage('error', 'ERR while getting list of available' + err) }) break case 'addprogram': @@ -562,7 +597,7 @@ function Manager() { // newhunks are automatically reported on msgs, and so are new links // so we just want a catch block here }).catch((err) => { - writemessage('error', 'ERR while adding program: ' + err) + writeMessage('error', 'ERR while adding program: ' + err) }) break case 'addhunk': @@ -572,28 +607,28 @@ function Manager() { this.log('added hunk with id', hunk.id) }).catch((err) => { this.log('ERR while adding hunk', err) - writemessage('error', 'ERR on adding hunk: ' + err) + writeMessage('error', 'ERR on adding hunk: ' + err) }) break case 'removehunk': if (this.removeHunk(content)) { - writemessage('removedef', content.id) + writeMessage('removedef', content.id) } else { - writemessage('error', 'could not remove hunk as requested') + writeMessage('error', 'could not remove hunk as requested') } break case 'addlink': if (this.addLink(content.outId, content.outName, content.inId, content.inName)) { // gr8 success, and addlink automatically updates with a message to the view } else { - writemessage('error', 'could not add link as requested') + writeMessage('error', 'could not add link as requested') } break case 'removelink': if (this.removeLink(content.outId, content.outName, content.inId, content.inName)) { // gr8 success, continue } else { - writemessage('error', 'cannot remove link as requested') + writeMessage('error', 'cannot remove link as requested') } break case 'statechange': @@ -601,12 +636,12 @@ function Manager() { // no response for this, message should pass from hunk }).catch((err) => { this.log('ERR at statechange', err) - writemessage('error', 'could not change state as requested') + writeMessage('error', 'could not change state as requested') }) break default: - writemessage('error', 'manager receives message with no switch!') + writeMessage('error', 'manager receives message with no switch!') this.log('MGR: msg with no switch') break } @@ -693,7 +728,7 @@ function Manager() { let outmsgbuffer = new Array() - let writemessage = (bytes) => { + let writeMessage = (bytes) => { if (!msgsout.io && outmsgbuffer.length < 1) { // str8 shooters if (msgverbose) this.log('msg out', bytes) diff --git a/hunks/view.js b/hunks/view.js index 0be6a41035e8b2a685242727a8a0661f768929df..7af3876f829df15c6375f2fe9afd455104d7c49a 100644 --- a/hunks/view.js +++ b/hunks/view.js @@ -22,6 +22,7 @@ import { import { TSET, // typset MK, // manager keys, + HK, // hunk keys, MSGS // messaging } from '../typeset.js' @@ -573,6 +574,73 @@ function View() { /* -------------------- DEFS in the DOM ---------------------- */ /* --------------------------- ---------------------------- */ + let deserializeNameType = (arr, bytes, i) => { + let nameresp = MSGS.readFrom(bytes, i, 'string') + let typeresp = MSGS.readFrom(bytes, i + nameresp.increment, 'string') + arr.push({ + name: nameresp.item, + type: typeresp.item + }) + return nameresp.increment + typeresp.increment + } + + let defBySerial = (bytes) => { + // deserialize + let def = {} + // inputs, outputs, state + def.inputs = new Array() + def.outputs = new Array() + def.state = new Array() + // hold, + let temp + // starting at 2, msgs[0] is 'hnkalive' + let i = 1 + // ripperoni, + outer: while(i < bytes.length){ + switch (bytes[i]){ + case HK.ID: + i += 1 + temp = MSGS.readFrom(bytes, i, 'string') + def.id = temp.item + i += temp.increment + break + case HK.NAME: + i += 1 + temp = MSGS.readFrom(bytes, i, 'string') + def.name = temp.item + i += temp.increment + break + case HK.INPUT: + i += 1 + // expecting two strings here, name and then type + i += deserializeNameType(def.inputs, bytes, i) + break + case HK.OUTPUT: + i += 1 + i += deserializeNameType(def.outputs, bytes, i) + break + case HK.STATE: + i += 1 + i += deserializeNameType(def.state, bytes, i) + // ok, and the value should trail + // we don't *need* to know the type, could just read by the key, but, + temp = MSGS.readFrom(bytes, i, def.state[def.state.length - 1].type) + def.state[def.state.length - 1].value = temp.item + i += temp.increment + break + default: + throw new Error(`unexpected key encountered in hunk deserialization at ${i}: ${bytes[i]}`) + break outer + } + } + // a check, + console.log(`broke outer, len at ${bytes.length}, i at ${i}`) + // we should be able to kind of pick-thru and append based on, + console.log('def apres deserialize', def) + // we gucc ? + return def + } + let putDef = (def) => { // hmmm ok, if (verbose) console.log('ready write', def.id) @@ -629,7 +697,7 @@ function View() { writeToMessageBox(`native hunk attach fails ${err}`) } } - + // writeTransform(de, mt) // rm menu if it's around if (menu !== undefined) $(menu).remove() @@ -1007,7 +1075,7 @@ function View() { let msg = msgsin.get() // at view, read in and deserialize list if(msgverbose) console.log('VIEW MSG:', msg) - if(!Array.isArray(msg)) throw new Error('hello pls msgs by array only now') + if(!Array.isArray(msg)) throw new Error(`view throwing object message, having header ${msg.header}`) // ok, switch(msg[0]) { @@ -1019,6 +1087,11 @@ function View() { let stringlist = MSGS.readListFrom(msg, 1, 'string') addContextOptions(stringlist) break + case MK.HUNKALIVE: + console.log('hunk alive, going to deserialize') + let def = defBySerial(msg) + putDef(def) + break default: throw new Error(`view receives message with no switch: ${msg[0]}`) } diff --git a/typeset.js b/typeset.js index 9d173f6c6dab39049d7a29033b7ae404d1fcab34..8ee267c09c8a559176cf01794ed758554e9d15be 100644 --- a/typeset.js +++ b/typeset.js @@ -117,7 +117,7 @@ const writeLenBytes = (len) => { } if(i > 2) throw new Error('suspiciously long len cast', bts) } - console.log(`for len ${len}, wrote bytes`, bts) + //console.log(`for len ${len}, wrote bytes`, bts) return bts } @@ -151,7 +151,7 @@ const MSGS = { writeTo: function(bytes, thing, type, debug){ let phy = findPhy(type) let block = phy.write(thing) - if(debug) console.log('writing block in:', block) + if(debug) console.log(`writing for type ${type} and thing '${thing}' the following block of bytes`, block) // write-in to msg like this block.forEach((byte) => { bytes.push(byte) @@ -193,25 +193,35 @@ const MK = { HELLO: 253, // (eom) HELLORESPONSE: 252, // (eom) ? // request a top-level description - DESCRIBESELF: 251, // (eom) - BRIEF: 250, // (str) name of interpreter, # hunks, # links (and then begin firing list back) + //DESCRIBESELF: 251, // (eom) + //BRIEF: 250, // (str) name of interpreter, # hunks, # links (and then begin firing list back) // please show what is available REQLISTAVAIL: 249, // (eom) LISTOFAVAIL: 248, // (list)(str) names 'dirs/like/this' (includes programs ?) (this might be multiple packets?) - // business, + // business ... we should be able to centralize all control w/i view.js if we can write these REQADDHUNK: 247, // (str) name HUNKALIVE: 246, // (hunkdescription): name, id, inputlist, outputlist, statelist - REQRMHUNK: 245, // (str) id - HUNKREMOVED: 244, // (str) id - REQADDLINK: 243, // (str) id, (str) outname, (str) id, (str) inname - LINKALIVE: 242, // (str) id, (str) outname, (str) id, (str) inname - REQRMLINK: 241, // (str) id, (str) outname, (str) id, (str) inname - LINKREMOVED: 240, // (str) id, (str) outname, (str) id, (str) inname + //REQRMHUNK: 245, // (str) id + //HUNKREMOVED: 244, // (str) id + //REQADDLINK: 243, // (str) id, (str) outname, (str) id, (str) inname + //LINKALIVE: 242, // (str) id, (str) outname, (str) id, (str) inname + //REQRMLINK: 241, // (str) id, (str) outname, (str) id, (str) inname + //LINKREMOVED: 240, // (str) id, (str) outname, (str) id, (str) inname +} + +// hunk description keys, +const HK = { + NAME: 253, + ID: 252, + DESCR: 251, + INPUT: 249, + OUTPUT: 247, + STATE: 245, } // should write out as list of pairs ? // or write fn to do key(stringtype) export { - TSET, MSGKEY_ACK, MK, MSGS + TSET, MSGKEY_ACK, MK, HK, MSGS }