Showing
6 changed files
with
449 additions
and
5 deletions
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
| ... | @@ -120,6 +120,436 @@ var NodeFileHandler = (function (_super) { | ... | @@ -120,6 +120,436 @@ var NodeFileHandler = (function (_super) { |
| 120 | return NodeFileHandler; | 120 | return NodeFileHandler; |
| 121 | }(events.EventEmitter)); | 121 | }(events.EventEmitter)); |
| 122 | 122 | ||
| 123 | +var ElectronFileHandler = (function (_super) { | ||
| 124 | + __extends(ElectronFileHandler, _super); | ||
| 125 | + function ElectronFileHandler(ipcRenderer) { | ||
| 126 | + _super.call(this); | ||
| 127 | + this.ipcRenderer = ipcRenderer; | ||
| 128 | + } | ||
| 129 | + ElectronFileHandler.prototype.download = function (source, target) { | ||
| 130 | + var _this = this; | ||
| 131 | + this.ipcRenderer.once('bsync-download-complete', function () { | ||
| 132 | + _this.ipcRenderer.removeAllListeners('bsync-download-progress'); | ||
| 133 | + _this.ipcRenderer.removeAllListeners('bsync-download-error'); | ||
| 134 | + _this.emit('complete'); | ||
| 135 | + }); | ||
| 136 | + this.ipcRenderer.on('bsync-download-progress', function (progress) { | ||
| 137 | + _this.emit('progress', progress); | ||
| 138 | + }); | ||
| 139 | + this.ipcRenderer.once('bsync-download-error', function (error) { | ||
| 140 | + _this.ipcRenderer.removeAllListeners('bsync-download-progress'); | ||
| 141 | + _this.ipcRenderer.removeAllListeners('bsync-download-complete'); | ||
| 142 | + _this.emit('error', error); | ||
| 143 | + }); | ||
| 144 | + this.ipcRenderer.send('bsync-download', { | ||
| 145 | + source: source, | ||
| 146 | + target: target | ||
| 147 | + }); | ||
| 148 | + return this; | ||
| 149 | + }; | ||
| 150 | + ElectronFileHandler.prototype.cleanup = function (files) { | ||
| 151 | + var _this = this; | ||
| 152 | + return new Promise(function (resolve, reject) { | ||
| 153 | + _this.ipcRenderer.once('bsync-cleanup-complete', function () { | ||
| 154 | + _this.emit('cleanup-complete'); | ||
| 155 | + resolve(); | ||
| 156 | + }); | ||
| 157 | + _this.ipcRenderer.send('bsync-cleanup', files); | ||
| 158 | + }); | ||
| 159 | + }; | ||
| 160 | + return ElectronFileHandler; | ||
| 161 | +}(events.EventEmitter)); | ||
| 162 | + | ||
| 163 | +var CordovaFileHandler = (function (_super) { | ||
| 164 | + __extends(CordovaFileHandler, _super); | ||
| 165 | + function CordovaFileHandler() { | ||
| 166 | + _super.apply(this, arguments); | ||
| 167 | + } | ||
| 168 | + CordovaFileHandler.prototype.triggerFileTransfer = function (source, target) { | ||
| 169 | + var _this = this; | ||
| 170 | + var fileTransfer = new window['FileTransfer'](); | ||
| 171 | + fileTransfer.onprogress = function (progress) { | ||
| 172 | + _this.emit('progress', progress.loaded / progress.total); | ||
| 173 | + }; | ||
| 174 | + fileTransfer.download(source, target, function (entry) { | ||
| 175 | + _this.emit('complete', entry); | ||
| 176 | + }, function (error) { | ||
| 177 | + _this.emit('error', error); | ||
| 178 | + }, true); | ||
| 179 | + }; | ||
| 180 | + CordovaFileHandler.prototype.download = function (source, target) { | ||
| 181 | + var _this = this; | ||
| 182 | + if (!window['FileTransfer']) { | ||
| 183 | + this.emit('error', 'Cordova FileTransfer object undefined'); | ||
| 184 | + } | ||
| 185 | + window['resolveLocalFileSystemURL'](target, function (entry) { | ||
| 186 | + entry.getMetadata(function (metadata) { | ||
| 187 | + if (metadata.size > 0) { | ||
| 188 | + _this.emit('complete', entry); | ||
| 189 | + } | ||
| 190 | + else { | ||
| 191 | + // file empty trigger transfer | ||
| 192 | + _this.triggerFileTransfer(source, target); | ||
| 193 | + } | ||
| 194 | + }, function () { | ||
| 195 | + // cannot read metadata trigger transfer | ||
| 196 | + _this.triggerFileTransfer(source, target); | ||
| 197 | + }); | ||
| 198 | + }, function () { | ||
| 199 | + // file not found, so download it | ||
| 200 | + _this.triggerFileTransfer(source, target); | ||
| 201 | + }); | ||
| 202 | + return this; | ||
| 203 | + }; | ||
| 204 | + CordovaFileHandler.prototype.cleanup = function (files, basePath) { | ||
| 205 | + var _this = this; | ||
| 206 | + var filesForCleanup = []; | ||
| 207 | + return new Promise(function (resolve, reject) { | ||
| 208 | + if (window['resolveLocalFileSystemURL']) { | ||
| 209 | + window['resolveLocalFileSystemURL'](basePath, function (entry) { | ||
| 210 | + var reader = entry.createReader(); | ||
| 211 | + reader.readEntries(function (entries) { | ||
| 212 | + for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) { | ||
| 213 | + var e = entries_1[_i]; | ||
| 214 | + if (e && e.isFile) { | ||
| 215 | + if (Util.getFileIndex(files, e.name) < 0) { | ||
| 216 | + filesForCleanup.push(e); | ||
| 217 | + } | ||
| 218 | + } | ||
| 219 | + } | ||
| 220 | + var index = 0; | ||
| 221 | + var error = false; | ||
| 222 | + var cleanupError = function (error) { | ||
| 223 | + _this.emit('cleanup-error', error); | ||
| 224 | + reject(); | ||
| 225 | + error = true; | ||
| 226 | + }; | ||
| 227 | + var cleanupNext = function () { | ||
| 228 | + if (index < filesForCleanup.length && !error) { | ||
| 229 | + filesForCleanup[index].remove(cleanupNext, cleanupError); | ||
| 230 | + index += 1; | ||
| 231 | + } | ||
| 232 | + else if (!error) { | ||
| 233 | + _this.emit('cleanup-complete', filesForCleanup); | ||
| 234 | + resolve(); | ||
| 235 | + } | ||
| 236 | + }; | ||
| 237 | + cleanupNext(); | ||
| 238 | + }, function (error) { _this.emit('cleanup-error', error); reject(); }); | ||
| 239 | + }); | ||
| 240 | + } | ||
| 241 | + }); | ||
| 242 | + }; | ||
| 243 | + return CordovaFileHandler; | ||
| 244 | +}(events.EventEmitter)); | ||
| 245 | + | ||
| 246 | +var FileReplicator = (function (_super) { | ||
| 247 | + __extends(FileReplicator, _super); | ||
| 248 | + function FileReplicator() { | ||
| 249 | + _super.call(this); | ||
| 250 | + this._files = []; | ||
| 251 | + this._itemValidator = null; | ||
| 252 | + this._fileHandler = null; | ||
| 253 | + this._retryTimeout = 100; | ||
| 254 | + this._retries = 10; | ||
| 255 | + this._itemKey = "type"; | ||
| 256 | + this._itemValue = "asset"; | ||
| 257 | + this._itemSourceAttribute = "source"; | ||
| 258 | + this._itemTargetAttribute = "target"; | ||
| 259 | + this._targetDirectory = ""; | ||
| 260 | + } | ||
| 261 | + Object.defineProperty(FileReplicator.prototype, "files", { | ||
| 262 | + get: function () { | ||
| 263 | + return this._files; | ||
| 264 | + }, | ||
| 265 | + enumerable: true, | ||
| 266 | + configurable: true | ||
| 267 | + }); | ||
| 268 | + Object.defineProperty(FileReplicator.prototype, "fileHandler", { | ||
| 269 | + get: function () { | ||
| 270 | + return this._fileHandler; | ||
| 271 | + }, | ||
| 272 | + set: function (handler) { | ||
| 273 | + this._fileHandler = handler; | ||
| 274 | + }, | ||
| 275 | + enumerable: true, | ||
| 276 | + configurable: true | ||
| 277 | + }); | ||
| 278 | + Object.defineProperty(FileReplicator.prototype, "retryTimeout", { | ||
| 279 | + set: function (timeout) { | ||
| 280 | + this._retryTimeout = timeout; | ||
| 281 | + }, | ||
| 282 | + enumerable: true, | ||
| 283 | + configurable: true | ||
| 284 | + }); | ||
| 285 | + Object.defineProperty(FileReplicator.prototype, "itemValidator", { | ||
| 286 | + set: function (validator) { | ||
| 287 | + this._itemValidator = validator; | ||
| 288 | + }, | ||
| 289 | + enumerable: true, | ||
| 290 | + configurable: true | ||
| 291 | + }); | ||
| 292 | + Object.defineProperty(FileReplicator.prototype, "itemKey", { | ||
| 293 | + get: function () { | ||
| 294 | + return this._itemKey; | ||
| 295 | + }, | ||
| 296 | + set: function (key) { | ||
| 297 | + this._itemKey = key; | ||
| 298 | + }, | ||
| 299 | + enumerable: true, | ||
| 300 | + configurable: true | ||
| 301 | + }); | ||
| 302 | + Object.defineProperty(FileReplicator.prototype, "itemValue", { | ||
| 303 | + get: function () { | ||
| 304 | + return this._itemValue; | ||
| 305 | + }, | ||
| 306 | + set: function (value) { | ||
| 307 | + this._itemValue = value; | ||
| 308 | + }, | ||
| 309 | + enumerable: true, | ||
| 310 | + configurable: true | ||
| 311 | + }); | ||
| 312 | + Object.defineProperty(FileReplicator.prototype, "itemSourceAttribute", { | ||
| 313 | + get: function () { | ||
| 314 | + return this._itemSourceAttribute; | ||
| 315 | + }, | ||
| 316 | + set: function (sourceAttribute) { | ||
| 317 | + this._itemSourceAttribute = sourceAttribute; | ||
| 318 | + }, | ||
| 319 | + enumerable: true, | ||
| 320 | + configurable: true | ||
| 321 | + }); | ||
| 322 | + Object.defineProperty(FileReplicator.prototype, "itemTargetAttribute", { | ||
| 323 | + get: function () { | ||
| 324 | + return this._itemTargetAttribute; | ||
| 325 | + }, | ||
| 326 | + set: function (targetAttribute) { | ||
| 327 | + this._itemTargetAttribute = targetAttribute; | ||
| 328 | + }, | ||
| 329 | + enumerable: true, | ||
| 330 | + configurable: true | ||
| 331 | + }); | ||
| 332 | + Object.defineProperty(FileReplicator.prototype, "targetDirectory", { | ||
| 333 | + get: function () { | ||
| 334 | + return this._targetDirectory; | ||
| 335 | + }, | ||
| 336 | + set: function (targetDirectory) { | ||
| 337 | + this._targetDirectory = targetDirectory; | ||
| 338 | + }, | ||
| 339 | + enumerable: true, | ||
| 340 | + configurable: true | ||
| 341 | + }); | ||
| 342 | + FileReplicator.prototype.clear = function (files) { | ||
| 343 | + if (files === void 0) { files = []; } | ||
| 344 | + this._files = files; | ||
| 345 | + }; | ||
| 346 | + /** | ||
| 347 | + * change from pouchdb replicate | ||
| 348 | + */ | ||
| 349 | + FileReplicator.prototype.pushChanges = function (docs) { | ||
| 350 | + var items = []; | ||
| 351 | + if (docs && docs.length > 0) { | ||
| 352 | + for (var _i = 0, docs_1 = docs; _i < docs_1.length; _i++) { | ||
| 353 | + var item = docs_1[_i]; | ||
| 354 | + if (item[this._itemKey] && item[this._itemKey] === this._itemValue) { | ||
| 355 | + items.push(item); | ||
| 356 | + } | ||
| 357 | + } | ||
| 358 | + } | ||
| 359 | + var files = this.prepareFiles(items); | ||
| 360 | + for (var _a = 0, files_1 = files; _a < files_1.length; _a++) { | ||
| 361 | + var file = files_1[_a]; | ||
| 362 | + this._files.push(file); | ||
| 363 | + } | ||
| 364 | + }; | ||
| 365 | + FileReplicator.prototype.downloadFiles = function (files, fileHandler, index) { | ||
| 366 | + var _this = this; | ||
| 367 | + if (index === void 0) { index = 0; } | ||
| 368 | + if (index >= files.length) { | ||
| 369 | + return; | ||
| 370 | + } | ||
| 371 | + this.emit('start', { progress: 0, index: index, length: files.length }); | ||
| 372 | + fileHandler | ||
| 373 | + .on('progress', function (progress) { | ||
| 374 | + _this.emit('file-progress', { progress: progress, index: index, length: files.length }); | ||
| 375 | + }) | ||
| 376 | + .once('error', function (error) { | ||
| 377 | + _this.emit('file-error', { progress: 0, index: index, length: files.length, error: error }); | ||
| 378 | + fileHandler.removeAllListeners(); | ||
| 379 | + }) | ||
| 380 | + .once('complete', function () { | ||
| 381 | + _this.emit('file-complete', { progress: 100, index: index, length: files.length }); | ||
| 382 | + fileHandler.removeAllListeners(); | ||
| 383 | + _this.downloadFiles(files, fileHandler, index + 1); | ||
| 384 | + }) | ||
| 385 | + .download(files[index].source, this.targetDirectory + files[index].target); | ||
| 386 | + }; | ||
| 387 | + FileReplicator.prototype.prepareFiles = function (items) { | ||
| 388 | + var output = []; | ||
| 389 | + for (var _i = 0, items_1 = items; _i < items_1.length; _i++) { | ||
| 390 | + var item = items_1[_i]; | ||
| 391 | + if (item[this._itemSourceAttribute] && (!this._itemValidator || this._itemValidator(item))) { | ||
| 392 | + var file = { source: item[this._itemSourceAttribute], target: '' }; | ||
| 393 | + if (item[this._itemTargetAttribute]) { | ||
| 394 | + file.target = item[this._itemTargetAttribute]; | ||
| 395 | + } | ||
| 396 | + else { | ||
| 397 | + file.target = Util.getNameHash(file.source); | ||
| 398 | + } | ||
| 399 | + output.push(file); | ||
| 400 | + } | ||
| 401 | + } | ||
| 402 | + return output; | ||
| 403 | + }; | ||
| 404 | + FileReplicator.prototype.start = function (retries) { | ||
| 405 | + var _this = this; | ||
| 406 | + if (retries === void 0) { retries = 10; } | ||
| 407 | + this._retries = retries; | ||
| 408 | + this.on('file-complete', function (event) { | ||
| 409 | + if ((event.index + 1) >= event.length) { | ||
| 410 | + _this.replicationFinalized(event.index); | ||
| 411 | + } | ||
| 412 | + }); | ||
| 413 | + this.on('file-error', function (event) { | ||
| 414 | + _this.replicationFinalized(event.index); | ||
| 415 | + }); | ||
| 416 | + if (this._fileHandler && this._files.length > 0) { | ||
| 417 | + this.downloadFiles(this._files, this._fileHandler); | ||
| 418 | + } | ||
| 419 | + else { | ||
| 420 | + this.emit('complete'); | ||
| 421 | + } | ||
| 422 | + }; | ||
| 423 | + FileReplicator.prototype.cleanup = function () { | ||
| 424 | + var _this = this; | ||
| 425 | + this.fileHandler | ||
| 426 | + .cleanup(this._files, this._targetDirectory) | ||
| 427 | + .then(function () { | ||
| 428 | + _this.emit('cleanup-complete'); | ||
| 429 | + }).catch(function () { | ||
| 430 | + _this.emit('cleanup-error'); | ||
| 431 | + }); | ||
| 432 | + }; | ||
| 433 | + FileReplicator.prototype.replicationFinalized = function (lastIndex) { | ||
| 434 | + var _this = this; | ||
| 435 | + if (lastIndex + 1 >= this._files.length) { | ||
| 436 | + this.emit('complete'); | ||
| 437 | + } | ||
| 438 | + else if (this._retries > 0) { | ||
| 439 | + this._files.splice(0, lastIndex); | ||
| 440 | + setTimeout(function () { | ||
| 441 | + _this._retries = -1; | ||
| 442 | + _this.downloadFiles(_this._files, _this._fileHandler); | ||
| 443 | + }, this._retryTimeout); | ||
| 444 | + } | ||
| 445 | + else { | ||
| 446 | + this.emit('error'); | ||
| 447 | + } | ||
| 448 | + }; | ||
| 449 | + return FileReplicator; | ||
| 450 | +}(events.EventEmitter)); | ||
| 451 | + | ||
| 452 | +var CONFIG_ITEM_KEY = "itemKey"; | ||
| 453 | +var CONFIG_ITEM_VALUE = "itemValue"; | ||
| 454 | +var CONFIG_ITEM_SOURCE_ATTRIBUTE = "itemSourceAttribute"; | ||
| 455 | +var CONFIG_ITEM_TARGET_ATTRIBUTE = "itemTargetAttribute"; | ||
| 456 | + | ||
| 457 | +var CONFIG_RETRY_TIMEOUT = "retryTimeout"; | ||
| 458 | + | ||
| 459 | +var CONFIG_TARGET_DIRECTORY = "targetDirectory"; | ||
| 460 | +var Config = (function () { | ||
| 461 | + function Config() { | ||
| 462 | + this.config = {}; | ||
| 463 | + } | ||
| 464 | + Config.prototype.hasConfig = function (key) { | ||
| 465 | + if (this.config[key]) { | ||
| 466 | + return true; | ||
| 467 | + } | ||
| 468 | + return false; | ||
| 469 | + }; | ||
| 470 | + Config.prototype.getConfig = function (key) { | ||
| 471 | + return this.config[key]; | ||
| 472 | + }; | ||
| 473 | + Config.prototype.setConfig = function (key, value) { | ||
| 474 | + this.config[key] = value; | ||
| 475 | + return this; | ||
| 476 | + }; | ||
| 477 | + return Config; | ||
| 478 | +}()); | ||
| 479 | + | ||
| 480 | +var ENV_NODE = "node"; | ||
| 481 | +var ENV_ELECTRON = "electron"; | ||
| 482 | +var ENV_CORDOVA = "cordova"; | ||
| 483 | +var ENV_UNKNOWN = "unknown"; | ||
| 484 | +var ServiceLocator = (function () { | ||
| 485 | + function ServiceLocator() { | ||
| 486 | + } | ||
| 487 | + ServiceLocator.addFileHandler = function (environment, fileHandler) { | ||
| 488 | + ServiceLocator.fileHandlers[environment] = fileHandler; | ||
| 489 | + }; | ||
| 490 | + ServiceLocator.getConfig = function () { | ||
| 491 | + if (!ServiceLocator.config) { | ||
| 492 | + ServiceLocator.config = new Config(); | ||
| 493 | + } | ||
| 494 | + return ServiceLocator.config; | ||
| 495 | + }; | ||
| 496 | + ServiceLocator.getEnvironment = function () { | ||
| 497 | + if (typeof window != 'undefined' && typeof window['require'] === 'function' && window['require']('electron')) { | ||
| 498 | + return ENV_ELECTRON; | ||
| 499 | + } | ||
| 500 | + if (typeof window != 'undefined' && typeof window['FileTransfer'] === 'function') { | ||
| 501 | + return ENV_CORDOVA; | ||
| 502 | + } | ||
| 503 | + if (typeof process != 'undefined' && typeof process === 'object') { | ||
| 504 | + return ENV_NODE; | ||
| 505 | + } | ||
| 506 | + return ENV_UNKNOWN; | ||
| 507 | + }; | ||
| 508 | + ServiceLocator.getFileHandler = function () { | ||
| 509 | + var environment = ServiceLocator.getEnvironment(); | ||
| 510 | + if (ServiceLocator.fileHandlers[environment]) { | ||
| 511 | + return ServiceLocator.fileHandlers[environment]; | ||
| 512 | + } | ||
| 513 | + if (environment === ENV_ELECTRON) { | ||
| 514 | + return new ElectronFileHandler(window['require']('electron').ipcRenderer); | ||
| 515 | + } | ||
| 516 | + if (environment === ENV_CORDOVA) { | ||
| 517 | + return new CordovaFileHandler(); | ||
| 518 | + } | ||
| 519 | + if (environment === ENV_NODE) { | ||
| 520 | + return new NodeFileHandler(); | ||
| 521 | + } | ||
| 522 | + return null; | ||
| 523 | + }; | ||
| 524 | + ServiceLocator.getFileReplicator = function () { | ||
| 525 | + if (!ServiceLocator.fileReplicator) { | ||
| 526 | + ServiceLocator.fileReplicator = new FileReplicator(); | ||
| 527 | + ServiceLocator.fileReplicator.fileHandler = ServiceLocator.getFileHandler(); | ||
| 528 | + } | ||
| 529 | + if (ServiceLocator.getConfig().hasConfig(CONFIG_RETRY_TIMEOUT)) { | ||
| 530 | + ServiceLocator.fileReplicator.retryTimeout = ServiceLocator.getConfig().getConfig(CONFIG_RETRY_TIMEOUT); | ||
| 531 | + } | ||
| 532 | + if (ServiceLocator.getConfig().hasConfig(CONFIG_ITEM_KEY)) { | ||
| 533 | + ServiceLocator.fileReplicator.itemKey = ServiceLocator.getConfig().getConfig(CONFIG_ITEM_KEY); | ||
| 534 | + } | ||
| 535 | + if (ServiceLocator.getConfig().hasConfig(CONFIG_ITEM_VALUE)) { | ||
| 536 | + ServiceLocator.fileReplicator.itemValue = ServiceLocator.getConfig().getConfig(CONFIG_ITEM_VALUE); | ||
| 537 | + } | ||
| 538 | + if (ServiceLocator.getConfig().hasConfig(CONFIG_ITEM_SOURCE_ATTRIBUTE)) { | ||
| 539 | + ServiceLocator.fileReplicator.itemSourceAttribute = ServiceLocator.getConfig().getConfig(CONFIG_ITEM_SOURCE_ATTRIBUTE); | ||
| 540 | + } | ||
| 541 | + if (ServiceLocator.getConfig().hasConfig(CONFIG_ITEM_TARGET_ATTRIBUTE)) { | ||
| 542 | + ServiceLocator.fileReplicator.itemTargetAttribute = ServiceLocator.getConfig().getConfig(CONFIG_ITEM_TARGET_ATTRIBUTE); | ||
| 543 | + } | ||
| 544 | + if (ServiceLocator.getConfig().hasConfig(CONFIG_TARGET_DIRECTORY)) { | ||
| 545 | + ServiceLocator.fileReplicator.targetDirectory = ServiceLocator.getConfig().getConfig(CONFIG_TARGET_DIRECTORY); | ||
| 546 | + } | ||
| 547 | + return ServiceLocator.fileReplicator; | ||
| 548 | + }; | ||
| 549 | + ServiceLocator.fileHandlers = {}; | ||
| 550 | + return ServiceLocator; | ||
| 551 | +}()); | ||
| 552 | + | ||
| 123 | var Bsync = (function () { | 553 | var Bsync = (function () { |
| 124 | function Bsync() { | 554 | function Bsync() { |
| 125 | } | 555 | } |
| ... | @@ -137,6 +567,8 @@ var Bsync = (function () { | ... | @@ -137,6 +567,8 @@ var Bsync = (function () { |
| 137 | event.sender.send('bsync-cleanup-complete'); | 567 | event.sender.send('bsync-cleanup-complete'); |
| 138 | }); | 568 | }); |
| 139 | }; | 569 | }; |
| 570 | + Bsync.NodeFileHandler = NodeFileHandler; | ||
| 571 | + Bsync.ServiceLocator = ServiceLocator; | ||
| 140 | return Bsync; | 572 | return Bsync; |
| 141 | }()); | 573 | }()); |
| 142 | 574 | ... | ... |
| 1 | -{"version":3,"file":null,"sources":["../src/util.ts","../src/file-handler/node-file-handler.ts","../src/node-main.ts"],"sourcesContent":["import { File } from './api/file';\n\nexport class Util {\n\n static getNameHash(path:string) {\n for(var r=0,i=0;i<path.length;i++) {\n r=(r<<5)-r+path.charCodeAt(i),r&=r;\n }\n return \"bsync_\" + Math.abs(r);\n }\n\n /**\n * index >= 0, localFile is in files\n * index < 0, localFile is not in files\n */\n static getFileIndex(files:Array<File>, localFile:string) : number {\n for (let i = 0; i < files.length; i++) {\n if (localFile == files[i].target) {\n return i;\n }\n }\n return -1;\n }\n\n static getFilesForCleanup(files:Array<File>, localFiles:Array<string>) : Array<string> {\n let filesForCleanup = [];\n\n for (let localFile of localFiles) {\n let index = -1;\n\n index = Util.getFileIndex(files, localFile);\n \n if (index < 0) {\n filesForCleanup.push(localFile);\n } else {\n // splice for performance improvement only\n files.splice(index,1);\n }\n }\n\n return filesForCleanup;\n }\n\n}","import { Util } from './../util';\nimport { EventEmitter } from 'events';\nimport { FileHandler } from '../api/file-handler';\nimport { File } from '../api/file';\nimport * as http from 'http';\nimport * as https from 'https';\nimport * as fs from 'fs';\n\nexport class NodeFileHandler extends EventEmitter implements FileHandler {\n\n selectProtocol(url:string) : any {\n if (url.search(/^http:\\/\\//) === 0) {\n return http;\n } else if (url.search(/^https:\\/\\//) === 0) {\n return https;\n } else {\n return null;\n }\n }\n\n download(source:string, target:string) {\n\n let handler = this.selectProtocol(source);\n\n if (!handler) {\n this.emit(\"error\",\"No handler for source: \" + source);\n return this;\n }\n\n // file already exists and is not empty\n if (fs.existsSync(target) && (fs.statSync(target)['size'] > 0)) {\n this.emit(\"complete\");\n return this;\n } else {\n let file = fs.createWriteStream(target, {'flags': 'a'});\n\n handler.get(source, (response) => {\n let size = response.headers['content-length']; // in bytes\n let prog = 0; // already downloaded\n let progCounts = 100; // how many progress events should be triggerd (1-100 %)\n let nextProg = (1/progCounts);\n \n response.on('data', (chunk) => {\n prog += chunk.length;\n file.write(chunk, 'binary');\n\n if ((prog / size) > nextProg) {\n this.emit('progress',prog / size);\n nextProg += (1 / progCounts);\n } \n });\n\n response.once('end', () => {\n file.end();\n this.emit('complete');\n }); \n\n }).on('error', (error) => {\n fs.unlink(target);\n this.emit(\"error\", \"Error while downloading: \" + error);\n });\n\n return this;\n } \n }\n\n cleanup(files:Array<File>, basePath?:string) {\n try {\n let localFiles = fs.readdirSync(basePath);\n Util.getFilesForCleanup(files, localFiles)\n .forEach((file) => {\n fs.unlinkSync(basePath + \"/\" + file);\n }); \n } catch (e) {\n }\n \n return this;\n }\n\n}","import { NodeFileHandler } from './file-handler/node-file-handler';\n\nexport default class Bsync {\n\n static configIpcMain(ipcMain: any, basePath: string) { \n \n ipcMain.on('bsync-download', (event, args) => {\n let nodeFileHander = new NodeFileHandler();\n nodeFileHander.download(args.source, basePath + \"/\" + args.target)\n .on('progress', (progress:number) => { event.sender.send('bsync-download-progress', progress); })\n .once('error', (error) => { nodeFileHander.removeAllListeners(); event.sender.send('bsync-download-error', error); })\n .once('complete', () => { nodeFileHander.removeAllListeners(); event.sender.send('bsync-download-complete'); });\n });\n\n ipcMain.on('bsync-cleanup', (event, args) => {\n let nodeFileHandler = new NodeFileHandler();\n nodeFileHandler.cleanup(args.files, basePath);\n event.sender.send('bsync-cleanup-complete');\n });\n\n }\n\n}"],"names":["fs.existsSync","fs.statSync","fs.createWriteStream","fs.unlink","fs.readdirSync","fs.unlinkSync","EventEmitter"],"mappings":"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"} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | +{"version":3,"file":null,"sources":["../src/util.ts","../src/file-handler/node-file-handler.ts","../src/file-handler/electron-file-handler.ts","../src/file-handler/cordova-file-handler.ts","../src/file-replicator.ts","../src/config.ts","../src/service-locator.ts","../src/node-main.ts"],"sourcesContent":["import { File } from './api/file';\n\nexport class Util {\n\n static getNameHash(path:string) {\n for(var r=0,i=0;i<path.length;i++) {\n r=(r<<5)-r+path.charCodeAt(i),r&=r;\n }\n return \"bsync_\" + Math.abs(r);\n }\n\n /**\n * index >= 0, localFile is in files\n * index < 0, localFile is not in files\n */\n static getFileIndex(files:Array<File>, localFile:string) : number {\n for (let i = 0; i < files.length; i++) {\n if (localFile == files[i].target) {\n return i;\n }\n }\n return -1;\n }\n\n static getFilesForCleanup(files:Array<File>, localFiles:Array<string>) : Array<string> {\n let filesForCleanup = [];\n\n for (let localFile of localFiles) {\n let index = -1;\n\n index = Util.getFileIndex(files, localFile);\n \n if (index < 0) {\n filesForCleanup.push(localFile);\n } else {\n // splice for performance improvement only\n files.splice(index,1);\n }\n }\n\n return filesForCleanup;\n }\n\n}","import { Util } from './../util';\nimport { EventEmitter } from 'events';\nimport { FileHandler } from '../api/file-handler';\nimport { File } from '../api/file';\nimport * as http from 'http';\nimport * as https from 'https';\nimport * as fs from 'fs';\n\nexport class NodeFileHandler extends EventEmitter implements FileHandler {\n\n selectProtocol(url:string) : any {\n if (url.search(/^http:\\/\\//) === 0) {\n return http;\n } else if (url.search(/^https:\\/\\//) === 0) {\n return https;\n } else {\n return null;\n }\n }\n\n download(source:string, target:string) {\n\n let handler = this.selectProtocol(source);\n\n if (!handler) {\n this.emit(\"error\",\"No handler for source: \" + source);\n return this;\n }\n\n // file already exists and is not empty\n if (fs.existsSync(target) && (fs.statSync(target)['size'] > 0)) {\n this.emit(\"complete\");\n return this;\n } else {\n let file = fs.createWriteStream(target, {'flags': 'a'});\n\n handler.get(source, (response) => {\n let size = response.headers['content-length']; // in bytes\n let prog = 0; // already downloaded\n let progCounts = 100; // how many progress events should be triggerd (1-100 %)\n let nextProg = (1/progCounts);\n \n response.on('data', (chunk) => {\n prog += chunk.length;\n file.write(chunk, 'binary');\n\n if ((prog / size) > nextProg) {\n this.emit('progress',prog / size);\n nextProg += (1 / progCounts);\n } \n });\n\n response.once('end', () => {\n file.end();\n this.emit('complete');\n }); \n\n }).on('error', (error) => {\n fs.unlink(target);\n this.emit(\"error\", \"Error while downloading: \" + error);\n });\n\n return this;\n } \n }\n\n cleanup(files:Array<File>, basePath?:string) {\n try {\n let localFiles = fs.readdirSync(basePath);\n Util.getFilesForCleanup(files, localFiles)\n .forEach((file) => {\n fs.unlinkSync(basePath + \"/\" + file);\n }); \n } catch (e) {\n }\n \n return this;\n }\n\n}","import { EventEmitter } from 'events';\nimport { FileHandler } from '../api/file-handler';\nimport { File } from '../api/file';\n\nexport class ElectronFileHandler extends EventEmitter implements FileHandler {\n\n constructor (private ipcRenderer:any) {\n super();\n }\n\n download(source:string, target:string) {\n this.ipcRenderer.once('bsync-download-complete', () => {\n this.ipcRenderer.removeAllListeners('bsync-download-progress');\n this.ipcRenderer.removeAllListeners('bsync-download-error');\n this.emit('complete');\n });\n\n this.ipcRenderer.on('bsync-download-progress', (progress:number) => {\n this.emit('progress', progress);\n });\n\n this.ipcRenderer.once('bsync-download-error', (error:any) => {\n this.ipcRenderer.removeAllListeners('bsync-download-progress');\n this.ipcRenderer.removeAllListeners('bsync-download-complete');\n this.emit('error', error);\n });\n\n this.ipcRenderer.send('bsync-download', {\n source : source ,\n target : target\n });\n\n return this; \n }\n\n cleanup(files:Array<File>) : Promise<void> {\n return new Promise<void>((resolve, reject) => {\n\n this.ipcRenderer.once('bsync-cleanup-complete', () => {\n this.emit('cleanup-complete');\n resolve();\n });\n\n this.ipcRenderer.send('bsync-cleanup', files);\n\n });\n }\n\n}","import { Util } from './../util';\nimport { EventEmitter } from 'events';\nimport { FileHandler } from '../api/file-handler';\nimport { File } from '../api/file';\n\nexport class CordovaFileHandler extends EventEmitter implements FileHandler {\n\n triggerFileTransfer(source:string, target:string) {\n let fileTransfer = new window['FileTransfer']();\n\n fileTransfer.onprogress = (progress:ProgressEvent) => {\n this.emit('progress', progress.loaded / progress.total);\n };\n\n fileTransfer.download(\n source ,\n target ,\n (entry:any) => {\n this.emit('complete', entry);\n } ,\n (error:any) => {\n this.emit('error', error);\n },\n true\n );\n }\n\n download(source:string, target:string) {\n if (!window['FileTransfer']) {\n this.emit('error','Cordova FileTransfer object undefined');\n }\n\n window['resolveLocalFileSystemURL'](target, (entry:any) => {\n entry.getMetadata((metadata) => {\n if (metadata.size > 0) {\n this.emit('complete', entry);\n } else {\n // file empty trigger transfer\n this.triggerFileTransfer(source,target);\n }\n }, () => {\n // cannot read metadata trigger transfer\n this.triggerFileTransfer(source,target);\n });\n }, () => {\n // file not found, so download it\n this.triggerFileTransfer(source,target);\n });\n\n return this; \n }\n\n cleanup(files:Array<File>, basePath:string) : Promise<void> {\n let filesForCleanup = [];\n\n return new Promise<void>((resolve, reject) => {\n\n if (window['resolveLocalFileSystemURL']) {\n window['resolveLocalFileSystemURL'](basePath, (entry) => {\n let reader = entry.createReader();\n reader.readEntries((entries) => {\n\n for (let e of entries) {\n if (e && e.isFile) {\n if (Util.getFileIndex(files, e.name) < 0) {\n filesForCleanup.push(e);\n }\n }\n }\n \n let index = 0;\n let error = false;\n\n let cleanupError = (error) => {\n this.emit('cleanup-error', error);\n reject();\n error = true;\n };\n\n let cleanupNext = () => {\n if (index < filesForCleanup.length && !error) {\n filesForCleanup[index].remove(cleanupNext, cleanupError);\n index += 1;\n } else if (!error) { \n this.emit('cleanup-complete', filesForCleanup);\n resolve();\n }\n };\n \n cleanupNext();\n\n }, (error) => { this.emit('cleanup-error', error); reject(); });\n });\n }\n\n });\n }\n\n}","import { FileHandler } from './api/file-handler';\nimport { File } from './api/file';\nimport { Util } from './util';\nimport { EventEmitter } from 'events';\n\nexport class FileReplicator extends EventEmitter {\n\n constructor() {\n super();\n }\n\n protected _files: Array<File> = [];\n\n protected _itemValidator: (item: any) => boolean = null;\n protected _fileHandler: FileHandler = null;\n protected _retryTimeout: number = 100;\n protected _retries: number = 10;\n\n protected _itemKey = \"type\";\n protected _itemValue = \"asset\";\n protected _itemSourceAttribute = \"source\";\n protected _itemTargetAttribute = \"target\";\n protected _targetDirectory = \"\";\n\n get files(): Array<File> {\n return this._files;\n }\n\n set fileHandler(handler: FileHandler) {\n this._fileHandler = handler;\n }\n\n get fileHandler() : FileHandler {\n return this._fileHandler;\n }\n\n set retryTimeout(timeout: number) {\n this._retryTimeout = timeout;\n }\n\n set itemValidator(validator: (item: any) => boolean) {\n this._itemValidator = validator;\n }\n\n set itemKey(key: string) {\n this._itemKey = key;\n }\n\n set itemValue(value: string) {\n this._itemValue = value;\n }\n\n set itemSourceAttribute(sourceAttribute: string) {\n this._itemSourceAttribute = sourceAttribute;\n }\n\n set itemTargetAttribute(targetAttribute: string) {\n this._itemTargetAttribute = targetAttribute;\n }\n\n get itemKey() {\n return this._itemKey;\n }\n\n get itemValue() {\n return this._itemValue;\n }\n\n get itemSourceAttribute() {\n return this._itemSourceAttribute;\n }\n\n get itemTargetAttribute() {\n return this._itemTargetAttribute;\n }\n\n set targetDirectory(targetDirectory: string) {\n this._targetDirectory = targetDirectory;\n }\n\n get targetDirectory() {\n return this._targetDirectory;\n }\n\n clear(files: Array<File> = []) {\n this._files = files;\n }\n\n /**\n * change from pouchdb replicate\n */\n pushChanges(docs: Array<any>) {\n let items: Array<any> = [];\n\n if (docs && docs.length > 0) {\n for (let item of docs) {\n if (item[this._itemKey] && item[this._itemKey] === this._itemValue) {\n items.push(item);\n }\n }\n }\n\n let files = this.prepareFiles(items);\n\n for (let file of files) {\n this._files.push(file);\n }\n }\n\n downloadFiles(files: Array<File>, fileHandler: FileHandler, index: number = 0) {\n if (index >= files.length) {\n return;\n }\n\n this.emit('start', { progress: 0, index: index, length: files.length });\n \n fileHandler\n .on('progress', (progress) => {\n this.emit('file-progress', { progress: progress, index: index, length: files.length })\n })\n .once('error', error => {\n this.emit('file-error', { progress: 0, index: index, length: files.length, error: error });\n fileHandler.removeAllListeners();\n })\n .once('complete', () => {\n this.emit('file-complete', { progress: 100, index: index, length: files.length });\n fileHandler.removeAllListeners();\n this.downloadFiles(files, fileHandler, index + 1);\n })\n .download(files[index].source, this.targetDirectory + files[index].target); \n }\n\n prepareFiles(items: Array<any>): Array<File> {\n let output = [];\n\n for (let item of items) {\n if (item[this._itemSourceAttribute] && (!this._itemValidator || this._itemValidator(item))) {\n let file = { source: item[this._itemSourceAttribute], target: '' };\n\n if (item[this._itemTargetAttribute]) {\n file.target = item[this._itemTargetAttribute];\n } else {\n file.target = Util.getNameHash(file.source);\n }\n\n output.push(file);\n }\n }\n\n return output;\n }\n\n start(retries:number = 10) {\n this._retries = retries;\n\n this.on('file-complete', (event: any) => {\n if ((event.index + 1) >= event.length) {\n this.replicationFinalized(event.index);\n }\n });\n\n this.on('file-error', (event: any) => {\n this.replicationFinalized(event.index);\n });\n\n if (this._fileHandler && this._files.length > 0) {\n this.downloadFiles(this._files, this._fileHandler);\n } else {\n this.emit('complete');\n } \n }\n\n cleanup() {\n this.fileHandler\n .cleanup(this._files, this._targetDirectory)\n .then(() => {\n this.emit('cleanup-complete');\n }).catch(() => {\n this.emit('cleanup-error');\n });\n }\n\n replicationFinalized(lastIndex: number) {\n if (lastIndex + 1 >= this._files.length) { // all finished\n this.emit('complete');\n } else if (this._retries > 0) { // restart after last success \n this._files.splice(0, lastIndex);\n setTimeout(() => {\n this._retries =- 1;\n this.downloadFiles(this._files, this._fileHandler);\n }, this._retryTimeout);\n } else {\n this.emit('error');\n }\n }\n\n}","export const CONFIG_ITEM_KEY = \"itemKey\";\nexport const CONFIG_ITEM_VALUE = \"itemValue\";\nexport const CONFIG_ITEM_SOURCE_ATTRIBUTE = \"itemSourceAttribute\";\nexport const CONFIG_ITEM_TARGET_ATTRIBUTE = \"itemTargetAttribute\";\nexport const CONFIG_ITEM_VALIDATOR = \"itemValidator\";\nexport const CONFIG_RETRY_TIMEOUT = \"retryTimeout\";\nexport const CONFIG_FILE_HANDLER = \"fileHandler\";\nexport const CONFIG_TARGET_DIRECTORY = \"targetDirectory\";\n\nexport class Config {\n\n protected config:any = {};\n\n hasConfig(key:string) : boolean {\n if (this.config[key]) {\n return true;\n }\n return false;\n }\n\n getConfig(key:string) : any {\n return this.config[key];\n }\n\n setConfig(key:string, value:any) : Config {\n this.config[key] = value;\n return this;\n }\n\n}","import {NodeFileHandler} from './file-handler/node-file-handler';\nimport {FileHandler} from './api/file-handler';\nimport {ElectronFileHandler} from './file-handler/electron-file-handler';\nimport {CordovaFileHandler} from './file-handler/cordova-file-handler';\nimport {FileReplicator} from './file-replicator';\nimport {\n Config,\n CONFIG_RETRY_TIMEOUT,\n CONFIG_ITEM_KEY,\n CONFIG_ITEM_VALUE,\n CONFIG_ITEM_TARGET_ATTRIBUTE,\n CONFIG_ITEM_SOURCE_ATTRIBUTE,\n CONFIG_TARGET_DIRECTORY\n} from './config';\n\nexport const ENV_NODE = \"node\";\nexport const ENV_ELECTRON = \"electron\";\nexport const ENV_CORDOVA = \"cordova\";\nexport const ENV_UNKNOWN = \"unknown\";\n\nexport class ServiceLocator {\n\n protected static fileHandlers:any = {};\n protected static fileReplicator: FileReplicator;\n protected static config: Config;\n\n static addFileHandler(environment:string, fileHandler:FileHandler) {\n ServiceLocator.fileHandlers[environment] = fileHandler;\n }\n\n static getConfig() : Config {\n if (!ServiceLocator.config) {\n ServiceLocator.config = new Config();\n }\n\n return ServiceLocator.config;\n }\n\n static getEnvironment() {\n if (typeof window != 'undefined' && typeof window['require'] === 'function' && window['require']('electron')) {\n return ENV_ELECTRON;\n }\n if (typeof window != 'undefined' && typeof window['FileTransfer'] === 'function') {\n return ENV_CORDOVA;\n }\n if (typeof process != 'undefined' && typeof process === 'object') {\n return ENV_NODE;\n }\n\n return ENV_UNKNOWN;\n }\n\n static getFileHandler() : FileHandler {\n let environment = ServiceLocator.getEnvironment();\n\n if (ServiceLocator.fileHandlers[environment]) {\n return ServiceLocator.fileHandlers[environment];\n }\n\n if (environment === ENV_ELECTRON) {\n return new ElectronFileHandler(window['require']('electron').ipcRenderer);\n }\n if (environment === ENV_CORDOVA) {\n return new CordovaFileHandler();\n }\n if (environment === ENV_NODE) {\n return new NodeFileHandler();\n }\n\n return null;\n }\n\n static getFileReplicator() : FileReplicator {\n if (!ServiceLocator.fileReplicator) {\n ServiceLocator.fileReplicator = new FileReplicator();\n ServiceLocator.fileReplicator.fileHandler = ServiceLocator.getFileHandler();\n }\n\n if (ServiceLocator.getConfig().hasConfig(CONFIG_RETRY_TIMEOUT)) {\n ServiceLocator.fileReplicator.retryTimeout = ServiceLocator.getConfig().getConfig(CONFIG_RETRY_TIMEOUT);\n }\n if (ServiceLocator.getConfig().hasConfig(CONFIG_ITEM_KEY)) {\n ServiceLocator.fileReplicator.itemKey = ServiceLocator.getConfig().getConfig(CONFIG_ITEM_KEY);\n }\n if (ServiceLocator.getConfig().hasConfig(CONFIG_ITEM_VALUE)) {\n ServiceLocator.fileReplicator.itemValue = ServiceLocator.getConfig().getConfig(CONFIG_ITEM_VALUE);\n }\n if (ServiceLocator.getConfig().hasConfig(CONFIG_ITEM_SOURCE_ATTRIBUTE)) {\n ServiceLocator.fileReplicator.itemSourceAttribute = ServiceLocator.getConfig().getConfig(CONFIG_ITEM_SOURCE_ATTRIBUTE);\n }\n if (ServiceLocator.getConfig().hasConfig(CONFIG_ITEM_TARGET_ATTRIBUTE)) {\n ServiceLocator.fileReplicator.itemTargetAttribute = ServiceLocator.getConfig().getConfig(CONFIG_ITEM_TARGET_ATTRIBUTE);\n }\n if (ServiceLocator.getConfig().hasConfig(CONFIG_TARGET_DIRECTORY)) {\n ServiceLocator.fileReplicator.targetDirectory = ServiceLocator.getConfig().getConfig(CONFIG_TARGET_DIRECTORY);\n }\n \n return ServiceLocator.fileReplicator;\n }\n\n}","import { ServiceLocator } from './service-locator';\nimport { NodeFileHandler } from './file-handler/node-file-handler';\n\nexport default class Bsync {\n\n static NodeFileHandler = NodeFileHandler;\n\n static ServiceLocator = ServiceLocator;\n\n static configIpcMain(ipcMain: any, basePath: string) { \n \n ipcMain.on('bsync-download', (event, args) => {\n let nodeFileHander = new NodeFileHandler();\n nodeFileHander.download(args.source, basePath + \"/\" + args.target)\n .on('progress', (progress:number) => { event.sender.send('bsync-download-progress', progress); })\n .once('error', (error) => { nodeFileHander.removeAllListeners(); event.sender.send('bsync-download-error', error); })\n .once('complete', () => { nodeFileHander.removeAllListeners(); event.sender.send('bsync-download-complete'); });\n });\n\n ipcMain.on('bsync-cleanup', (event, args) => {\n let nodeFileHandler = new NodeFileHandler();\n nodeFileHandler.cleanup(args.files, basePath);\n event.sender.send('bsync-cleanup-complete');\n });\n\n }\n\n}"],"names":["fs.existsSync","fs.statSync","fs.createWriteStream","fs.unlink","fs.readdirSync","fs.unlinkSync","EventEmitter"],"mappings":"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"} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| 1 | +import { ServiceLocator } from './service-locator'; | ||
| 1 | import { NodeFileHandler } from './file-handler/node-file-handler'; | 2 | import { NodeFileHandler } from './file-handler/node-file-handler'; |
| 2 | 3 | ||
| 3 | export default class Bsync { | 4 | export default class Bsync { |
| 4 | 5 | ||
| 6 | + static NodeFileHandler = NodeFileHandler; | ||
| 7 | + | ||
| 8 | + static ServiceLocator = ServiceLocator; | ||
| 9 | + | ||
| 5 | static configIpcMain(ipcMain: any, basePath: string) { | 10 | static configIpcMain(ipcMain: any, basePath: string) { |
| 6 | 11 | ||
| 7 | ipcMain.on('bsync-download', (event, args) => { | 12 | ipcMain.on('bsync-download', (event, args) => { | ... | ... |
| 1 | +import {NodeFileHandler} from './file-handler/node-file-handler'; | ||
| 1 | import {FileHandler} from './api/file-handler'; | 2 | import {FileHandler} from './api/file-handler'; |
| 2 | import {ElectronFileHandler} from './file-handler/electron-file-handler'; | 3 | import {ElectronFileHandler} from './file-handler/electron-file-handler'; |
| 3 | import {CordovaFileHandler} from './file-handler/cordova-file-handler'; | 4 | import {CordovaFileHandler} from './file-handler/cordova-file-handler'; |
| ... | @@ -12,6 +13,7 @@ import { | ... | @@ -12,6 +13,7 @@ import { |
| 12 | CONFIG_TARGET_DIRECTORY | 13 | CONFIG_TARGET_DIRECTORY |
| 13 | } from './config'; | 14 | } from './config'; |
| 14 | 15 | ||
| 16 | +export const ENV_NODE = "node"; | ||
| 15 | export const ENV_ELECTRON = "electron"; | 17 | export const ENV_ELECTRON = "electron"; |
| 16 | export const ENV_CORDOVA = "cordova"; | 18 | export const ENV_CORDOVA = "cordova"; |
| 17 | export const ENV_UNKNOWN = "unknown"; | 19 | export const ENV_UNKNOWN = "unknown"; |
| ... | @@ -35,12 +37,15 @@ export class ServiceLocator { | ... | @@ -35,12 +37,15 @@ export class ServiceLocator { |
| 35 | } | 37 | } |
| 36 | 38 | ||
| 37 | static getEnvironment() { | 39 | static getEnvironment() { |
| 38 | - if (typeof window['require'] === 'function' && window['require']('electron')) { | 40 | + if (typeof window != 'undefined' && typeof window['require'] === 'function' && window['require']('electron')) { |
| 39 | return ENV_ELECTRON; | 41 | return ENV_ELECTRON; |
| 40 | } | 42 | } |
| 41 | - if (typeof window['FileTransfer'] === 'function') { | 43 | + if (typeof window != 'undefined' && typeof window['FileTransfer'] === 'function') { |
| 42 | return ENV_CORDOVA; | 44 | return ENV_CORDOVA; |
| 43 | } | 45 | } |
| 46 | + if (typeof process != 'undefined' && typeof process === 'object') { | ||
| 47 | + return ENV_NODE; | ||
| 48 | + } | ||
| 44 | 49 | ||
| 45 | return ENV_UNKNOWN; | 50 | return ENV_UNKNOWN; |
| 46 | } | 51 | } |
| ... | @@ -55,11 +60,13 @@ export class ServiceLocator { | ... | @@ -55,11 +60,13 @@ export class ServiceLocator { |
| 55 | if (environment === ENV_ELECTRON) { | 60 | if (environment === ENV_ELECTRON) { |
| 56 | return new ElectronFileHandler(window['require']('electron').ipcRenderer); | 61 | return new ElectronFileHandler(window['require']('electron').ipcRenderer); |
| 57 | } | 62 | } |
| 58 | - | ||
| 59 | if (environment === ENV_CORDOVA) { | 63 | if (environment === ENV_CORDOVA) { |
| 60 | return new CordovaFileHandler(); | 64 | return new CordovaFileHandler(); |
| 61 | } | 65 | } |
| 62 | - | 66 | + if (environment === ENV_NODE) { |
| 67 | + return new NodeFileHandler(); | ||
| 68 | + } | ||
| 69 | + | ||
| 63 | return null; | 70 | return null; |
| 64 | } | 71 | } |
| 65 | 72 | ... | ... |
-
Please register or login to post a comment