1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- try { module.exports = {ftp:ftp}; } catch (e) { }
- // N2O File Transfer Protocol
- var ftp = {
- queue: [],
- init: function(file) {
- var item = {
- id: performance.now().toString(),
- status: 'init',
- status_block_id: ftp.status_block_id || 'ftp_status',
- autostart: ftp.autostart || false,
- name: ftp.filename || file.name,
- sid: ftp.sid || co(session),
- meta: ftp.meta || bin(''),
- other1: ftp.other1 || bin(''),
- other2: ftp.other2 || bin(''),
- other3: ftp.other3 || bin(''),
- offset: ftp.offset || 0,
- block: 1,
- total: file.size,
- file: file
- };
- ftp.queue.push(item);
- ftp.send(item, '', 1);
- return item.id;
- },
- start: function(id) {
- if(ftp.active) { id && ( ftp.item(id).autostart = true ); return false; }
- var item = id ? ftp.item(id) : ftp.next();
- if(item) { ftp.active = true; ftp.send_slice(item); }
- },
- stop: function(id) {
- var item = ftp.item(id);
- var index = ftp.queue.indexOf(item);
- ftp.queue.splice(index, 1);
- ftp.active = false;
- ftp.start();
- },
- send: function(item, data) {
- if(debug){
- console.log('item ', item);
- console.log('data ', data);
- }
- ws.send(enc(tuple(atom('ftp'),
- bin(item.id),
- bin(item.sid),
- bin(item.name),
- item.meta,
- item.other1,
- item.other2,
- item.other3,
- number(item.total),
- number(item.offset),
- number(item.block || data.byteLength),
- bin(data),
- bin(item.status || 'send')
- ))); },
- send_slice: function(item) {
- this.reader = new FileReader();
- this.reader.onloadend = function(e) {
- var res = e.target, data = e.target.result;
- if(res.readyState === FileReader.DONE && data.byteLength > 0) ftp.send(item,data);
- };
- this.reader.readAsArrayBuffer(item.file.slice(item.offset, item.offset + item.block)); },
- item: function(id) { return ftp.queue.find(function(item){ return item && item.id === id; }); },
- next: function() { return ftp.queue.find(function(next){ return next && next.autostart }); }
- };
- $file.do = function(rsp) {
- if(debug){ console.log('rsp ', rsp); }
- var offset = rsp.v[9].v,
- block = rsp.v[10].v,
- //status = utf8_dec(rsp.v[12].v);
- status = utf8_arr(rsp.v[12].v);
- switch (status) {
- case 'init':
- //var item = ftp.item(utf8_dec(rsp.v[1].v));
- var item = ftp.item(utf8_arr(rsp.v[1].v));
- item.offset = offset;
- item.block = block;
- //item.name = utf8_dec(rsp.v[3].v);
- item.name = utf8_arr(rsp.v[3].v);
- item.status = undefined;
- if(item.autostart) ftp.start(item.id);
- break;
- case 'send':
- //var item = ftp.item(utf8_dec(rsp.v[1].v));
- var item = ftp.item(utf8_arr(rsp.v[1].v));
- var x = qi(item.status_block_id); if(x) x.innerHTML = offset;
- item.offset = offset;
- item.block = block;
- (block > 0 && ftp.active) ? ftp.send_slice(item) : ftp.stop(item.id)
- break;
- case 'relay': if (typeof ftp.relay === 'function') ftp.relay(rsp); break;
- }
- };
|