ftp.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. autostart: ftp.autostart || false,
  10. name: ftp.filename || file.name,
  11. sid: ftp.sid || co(session),
  12. meta: ftp.meta || bin(''),
  13. offset: ftp.offset || 0,
  14. block: 1,
  15. total: file.size,
  16. file: file
  17. };
  18. ftp.queue.push(item);
  19. ftp.send(item, '', 1);
  20. return item.id;
  21. },
  22. start: function(id) {
  23. if(ftp.active) { id && ( ftp.item(id).autostart = true ); return false; }
  24. var item = id ? ftp.item(id) : ftp.next();
  25. if(item) { ftp.active = true; ftp.send_slice(item); }
  26. },
  27. stop: function(id) {
  28. var item = ftp.item(id);
  29. var index = ftp.queue.indexOf(item);
  30. ftp.queue.splice(index, 1);
  31. ftp.active = false;
  32. ftp.start();
  33. },
  34. send: function(item, data) {
  35. ws.send(enc(tuple(atom('ftp'),
  36. bin(item.id),
  37. bin(item.sid),
  38. bin(item.name),
  39. item.meta,
  40. number(item.total),
  41. number(item.offset),
  42. number(item.block || data.byteLength),
  43. bin(data),
  44. bin(item.status || 'send')
  45. ))); },
  46. send_slice: function(item) {
  47. this.reader = new FileReader();
  48. this.reader.onloadend = function(e) {
  49. var res = e.target, data = e.target.result;
  50. if(res.readyState === FileReader.DONE && data.byteLength > 0) ftp.send(item,data);
  51. };
  52. this.reader.readAsArrayBuffer(item.file.slice(item.offset, item.offset + item.block)); },
  53. item: function(id) { return ftp.queue.find(function(item){ return item && item.id === id; }); },
  54. next: function() { return ftp.queue.find(function(next){ return next && next.autostart }); }
  55. };
  56. $file.do = function(rsp) {
  57. var offset = rsp.v[6].v, block = rsp.v[7].v, status = utf8_dec(rsp.v[9].v);
  58. switch (status) {
  59. case 'init':
  60. var item = ftp.item(utf8_dec(rsp.v[1].v));
  61. item.offset = offset;
  62. item.block = block;
  63. item.name = utf8_dec(rsp.v[3].v);
  64. item.status = undefined;
  65. if(item.autostart) ftp.start(item.id);
  66. break;
  67. case 'send':
  68. var x = qi('ftp_status'); if(x) x.innerHTML = offset;
  69. var item = ftp.item(utf8_dec(rsp.v[1].v));
  70. item.offset = offset;
  71. item.block = block;
  72. (block > 0 && ftp.active) ? ftp.send_slice(item) : ftp.stop(item.id)
  73. break;
  74. case 'relay': if (typeof ftp.relay === 'function') ftp.relay(rsp); break;
  75. }
  76. };