PageRenderTime 46ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/server/files.js

https://bitbucket.org/mpuckett/iostudio-whiteboard
JavaScript | 92 lines | 85 code | 6 blank | 1 comment | 5 complexity | 891a2aa64914ebd9d695b6bf64b12068 MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause, MIT
  1. // Files
  2. exports.init = function(d) {
  3. var _ = d._
  4. , Backbone = d.Backbone
  5. , fs = d.fs;
  6. var FileModel = Backbone.Model.extend({
  7. defaults: {
  8. 'name': 'no-file.txt',
  9. 'user': 0,
  10. 'isOnDisk': false,
  11. 'timestamp': 'New Date',
  12. 'location': {
  13. 'offsetX': 0,
  14. 'offsetY': 0
  15. }
  16. },
  17. initialize: function () {
  18. this.set('id',this.cid);
  19. this.on('change:isOnDisk', function (isOnDisk) {
  20. if (isOnDisk) {
  21. this.unset('data');
  22. console.log( 'File data removed from memory: ' + this.get('name') );
  23. }
  24. });
  25. }
  26. });
  27. var FilesCollection = Backbone.Collection.extend({
  28. model: FileModel
  29. });
  30. return FilesController = Backbone.Controller.extend({
  31. initialize: function () {
  32. var t = this;
  33. var filesCollection = this.filesCollection = new FilesCollection();
  34. this.on('fileAdded', function (file) {
  35. filesCollection.add(file); // store in memory
  36. });
  37. filesCollection.on('add', function (file) {
  38. t.writeToDisk(file);
  39. });
  40. this.on('writeToDisk', function (data) {
  41. if (data.success) {
  42. console.log('File was written to disk: ' + data.file.get('name'));
  43. data.file.set('isOnDisk', true);
  44. this.trigger( '_newFile', data.file );
  45. } else {
  46. console.log('Error writing file to disk: ' + data.file.get('name'));
  47. this.trigger( '_error', { user: data.file.get('user'), error: t.messages.uploadError(data.file) });
  48. }
  49. });
  50. },
  51. messages: {
  52. uploadError: function (file) {
  53. return 'Oh no! Our computer choked on your file: ' + file.get('name') + '. You can try again or let us know about the issue.';
  54. }
  55. },
  56. add: function (file) {
  57. var data = file.data;
  58. this.filesCollection.add(file);
  59. },
  60. render: function () {
  61. var render = [];
  62. var filesOnDisk = this.filesCollection.where({isOnDisk:true});
  63. _.each(filesOnDisk, function (file) {
  64. render.push(file.toJSON());
  65. });
  66. return render;
  67. },
  68. writeToDisk: function (file) {
  69. var t = this;
  70. var data = this.convertFileToBinary(file.get('data'));
  71. fs.writeFile('./public/files/'+file.get('name'), data, function (error) {
  72. if (error) {
  73. t.trigger('writeToDisk', { success: false, error: error, file: file } );
  74. } else {
  75. t.trigger('writeToDisk', { success: true, file: file })
  76. }
  77. });
  78. },
  79. convertFileToBinary: function (data) {
  80. var index = 'base64,';
  81. var trim = data.indexOf(index) + index.length;
  82. var base64 = data.substring(trim);
  83. return binary = new Buffer(base64, 'base64');
  84. }
  85. });
  86. };