ftp.js 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. try { module.exports = {ftp:ftp}; } catch (e) { }
  2. // N2O File Transfer Protocol
  3. var ftp = {
  4. queue: [],
  5. init: function(file) {
  6. var item = {
  7. id: performance.now().toString(),
  8. status: 'init',
  9. status_block_id: ftp.status_block_id || 'ftp_status',
  10. autostart: ftp.autostart || false,
  11. name: ftp.filename || file.name,
  12. sid: ftp.sid || co(session),
  13. meta: ftp.meta || bin(''),
  14. other1: ftp.other1 || bin(''),
  15. other2: ftp.other2 || bin(''),
  16. other3: ftp.other3 || bin(''),
  17. offset: ftp.offset || 0,
  18. block: 1,
  19. total: file.size,
  20. file: file
  21. };
  22. ftp.queue.push(item);
  23. ftp.send(item, '', 1);
  24. return item.id;
  25. },
  26. start: function(id) {
  27. if(ftp.active) { id && ( ftp.item(id).autostart = true ); return false; }
  28. var item = id ? ftp.item(id) : ftp.next();
  29. if(item) { ftp.active = true; ftp.send_slice(item); }
  30. },
  31. stop: function(id) {
  32. var item = ftp.item(id);
  33. var index = ftp.queue.indexOf(item);
  34. ftp.queue.splice(index, 1);
  35. ftp.active = false;
  36. ftp.start();
  37. },
  38. send: function(item, data) {
  39. if(debug){
  40. console.log('item ', item);
  41. console.log('data ', data);
  42. }
  43. ws.send(enc(tuple(atom('ftp'),
  44. bin(item.id),
  45. bin(item.sid),
  46. bin(item.name),
  47. item.meta,
  48. item.other1,
  49. item.other2,
  50. item.other3,
  51. number(item.total),
  52. number(item.offset),
  53. number(item.block || data.byteLength),
  54. bin(data),
  55. bin(item.status || 'send')
  56. ))); },
  57. send_slice: function(item) {
  58. this.reader = new FileReader();
  59. this.reader.onloadend = function(e) {
  60. var res = e.target, data = e.target.result;
  61. if(res.readyState === FileReader.DONE && data.byteLength > 0) ftp.send(item,data);
  62. };
  63. this.reader.readAsArrayBuffer(item.file.slice(item.offset, item.offset + item.block)); },
  64. item: function(id) { return ftp.queue.find(function(item){ return item && item.id === id; }); },
  65. next: function() { return ftp.queue.find(function(next){ return next && next.autostart }); }
  66. };
  67. $file.do = function(rsp) {
  68. if(debug){ console.log('rsp ', rsp); }
  69. var offset = rsp.v[9].v,
  70. block = rsp.v[10].v,
  71. //status = utf8_dec(rsp.v[12].v);
  72. status = utf8_arr(rsp.v[12].v);
  73. switch (status) {
  74. case 'init':
  75. //var item = ftp.item(utf8_dec(rsp.v[1].v));
  76. var item = ftp.item(utf8_arr(rsp.v[1].v));
  77. item.offset = offset;
  78. item.block = block;
  79. //item.name = utf8_dec(rsp.v[3].v);
  80. item.name = utf8_arr(rsp.v[3].v);
  81. item.status = undefined;
  82. if(item.autostart) ftp.start(item.id);
  83. break;
  84. case 'send':
  85. //var item = ftp.item(utf8_dec(rsp.v[1].v));
  86. var item = ftp.item(utf8_arr(rsp.v[1].v));
  87. var x = qi(item.status_block_id); if(x) x.innerHTML = offset;
  88. item.offset = offset;
  89. item.block = block;
  90. (block > 0 && ftp.active) ? ftp.send_slice(item) : ftp.stop(item.id)
  91. break;
  92. case 'relay': if (typeof ftp.relay === 'function') ftp.relay(rsp); break;
  93. }
  94. };