UNPKG

kitten-cloud-function

Version:

用于编程猫源码云功能(云变量、云列表等)的客户端工具

280 lines (279 loc) 11.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.KittenCloudDataUpdateManager = void 0; const signal_1 = require("../../../utils/signal"); const kitten_cloud_data_update_source_1 = require("./kitten-cloud-data-update-source"); const kitten_cloud_data_update_command_group_1 = require("./command/kitten-cloud-data-update-command-group"); const other_1 = require("../../../utils/other"); function configValueToNumber(value) { if (typeof value == "boolean") { return 0; } return value; } class KittenCloudDataUpdateManager { constructor(connection, data) { this.connection = connection; this.data = data; this.firstUnuploadedUpdateTime = 0; this.lastUploadTime = 0; this.uploadHandle = other_1.None; this.pauseUpdate = false; this.unuploadedUpdateCommand = new kitten_cloud_data_update_command_group_1.KittenCloudDataUpdateCommandGroup(); this.uploadingUpdateCommand = new kitten_cloud_data_update_command_group_1.KittenCloudDataUpdateCommandGroup(); this.uploadingStartTimeArray = []; this.uploadingTimeoutHandle = []; this.neededToUpload = new signal_1.Signal(); this.data.cacheTime.changed.connect(() => { this.setUploadHandle(); }); this.data.uploadIntervalTime.changed.connect(() => { this.setUploadHandle(); }); this.data.uploadTimeout.changed.connect(({ newValue: uploadTimeout }) => { var _a; for (const handle of this.uploadingTimeoutHandle) { clearTimeout(handle); } if (uploadTimeout > 0) { for (let i = 0; i < this.uploadingTimeoutHandle.length; i++) { this.uploadingTimeoutHandle[i] = setTimeout(() => { this.handleUploadingError(new Error("上传超时")); }, uploadTimeout + ((_a = this.uploadingStartTimeArray[i]) !== null && _a !== void 0 ? _a : 0) - Date.now()); } } }); this.data.localPreupdate.changed.connect(({ newValue: LocalPreupdate }) => { if (LocalPreupdate) { this.redoLocalPreUpdate(); } else { this.revokeLocalPreUpdate(); } }); this.pausedUpdateCommandArray = []; this.connection.opened.connect(() => { this.setUploadHandle(); }); this.connection.disconnected.connect(() => { if (this.uploadHandle != other_1.None) { clearTimeout(this.uploadHandle); this.uploadHandle = other_1.None; } if (this.data.localPreupdate.value) { this.uploadingUpdateCommand.revoke(); } for (const command of this.uploadingUpdateCommand) { command.fail(new Error("连接已断开")); } this.uploadingUpdateCommand = new kitten_cloud_data_update_command_group_1.KittenCloudDataUpdateCommandGroup(); this.uploadingStartTimeArray = []; for (const handle of this.uploadingTimeoutHandle) { clearTimeout(handle); } this.uploadingTimeoutHandle = []; }); this.connection.closed.connect(() => { if (this.uploadHandle != other_1.None) { clearTimeout(this.uploadHandle); this.uploadHandle = other_1.None; } if (this.data.localPreupdate.value) { this.redoLocalPreUpdate(); } for (const command of this.uploadingUpdateCommand) { command.fail(new Error("连接已关闭")); } for (const command of this.unuploadedUpdateCommand) { command.fail(new Error("连接已关闭")); } }); } withPauseUpdate(func) { if (this.pauseUpdate) { func(); return; } this.pauseUpdate = true; func(); this.pauseUpdate = false; for (let command of this.pausedUpdateCommandArray) { this.handleNewUpdateCommand(command); } this.pausedUpdateCommandArray = []; } withRevokeLocalPreUpdate(func) { this.revokeLocalPreUpdate(); func(); this.redoLocalPreUpdate(); } revokeLocalPreUpdate() { this.withPauseUpdate(() => { this.unuploadedUpdateCommand.revoke(); this.uploadingUpdateCommand.revoke(); }); } redoLocalPreUpdate() { this.withPauseUpdate(() => { this.uploadingUpdateCommand.execute(); let count = this.uploadingUpdateCommand.removeBackIneffective(); while (count--) { this.uploadingStartTimeArray.pop(); clearTimeout(this.uploadingTimeoutHandle.pop()); } this.unuploadedUpdateCommand.execute(); this.unuploadedUpdateCommand.removeBackIneffective(); }); } addUpdateCommand(command) { if (this.pauseUpdate) { this.pausedUpdateCommandArray.push(command); return; } this.handleNewUpdateCommand(command); } handleUploadingSuccess() { const firstUpdateCommand = this.uploadingUpdateCommand.shift(); if (firstUpdateCommand == other_1.None) { throw new Error("不存在更新命令"); } this.uploadingStartTimeArray.shift(); clearTimeout(this.uploadingTimeoutHandle.shift()); if (!this.data.localPreupdate.value) { firstUpdateCommand.execute(); } firstUpdateCommand.finish(); } handleUploadingError(error) { const firstUpdateCommand = this.uploadingUpdateCommand.shift(); if (firstUpdateCommand == other_1.None) { throw new Error("不存在更新命令"); } this.uploadingStartTimeArray.shift(); clearTimeout(this.uploadingTimeoutHandle.shift()); if (this.data.localPreupdate.value) { this.withRevokeLocalPreUpdate(() => { firstUpdateCommand.revoke(); }); } firstUpdateCommand.fail(error !== null && error !== void 0 ? error : new Error("更新上传失败")); } handleNewUpdateCommand(command) { this.withPauseUpdate(() => { switch (command.source) { case kitten_cloud_data_update_source_1.KittenCloudDataUpdateSource.LOCAL: if (!command.isLegal()) { command.fail(new Error("非法操作")); return; } if (this.data.localPreupdate.value) { if (!command.isEffective()) { command.finish(); return; } command.execute(); } this.unuploadedUpdateCommand.add(command); if (this.data.localPreupdate.value) { this.unuploadedUpdateCommand.removeBackIneffective(); } if (this.firstUnuploadedUpdateTime == 0) { this.firstUnuploadedUpdateTime = Date.now(); this.setUploadHandle(); } if (this.unuploadedUpdateCommand.isEmpty() && this.firstUnuploadedUpdateTime != 0) { this.firstUnuploadedUpdateTime = 0; if (this.uploadHandle != other_1.None) { clearTimeout(this.uploadHandle); } } break; case kitten_cloud_data_update_source_1.KittenCloudDataUpdateSource.CLOUD: const firstUploadingCommand = this.uploadingUpdateCommand.first(); if (firstUploadingCommand == other_1.None) { if (command.isLegal() && command.isEffective()) { command.execute(); } } else if ((0, other_1.equal)(command.toJSON(), firstUploadingCommand.toJSON())) { this.uploadingUpdateCommand.shift(); this.uploadingStartTimeArray.shift(); clearTimeout(this.uploadingTimeoutHandle.shift()); if (!this.data.localPreupdate.value) { firstUploadingCommand.execute(); let count = this.uploadingUpdateCommand.removeFrontIneffective(); while (count--) { this.uploadingStartTimeArray.shift(); clearTimeout(this.uploadingTimeoutHandle.shift()); } } firstUploadingCommand.finish(); } else { if (this.data.localPreupdate.value) { this.withRevokeLocalPreUpdate(() => { if (command.isLegal() && command.isEffective()) { command.execute(); } }); } else { if (command.isLegal() && command.isEffective()) { command.execute(); } } } break; } }); } setUploadHandle() { if (this.uploadHandle != null) { clearTimeout(this.uploadHandle); } if (this.firstUnuploadedUpdateTime == 0) { return; } let cacheTime = this.data.cacheTime.value; let uploadIntervalTime = this.data.uploadIntervalTime.value; let now = Date.now(); let cacheNow = this.firstUnuploadedUpdateTime + configValueToNumber(cacheTime); let uploadIntervalNow = this.lastUploadTime + configValueToNumber(uploadIntervalTime); if (cacheTime === false && uploadIntervalTime === false) { this.neededToUpload.emit(); } else if (cacheTime === false && uploadIntervalNow < now) { this.neededToUpload.emit(); } else if (uploadIntervalTime === false && cacheNow < now) { this.neededToUpload.emit(); } else { this.uploadHandle = setTimeout(() => { this.neededToUpload.emit(); }, Math.max(cacheNow, uploadIntervalNow) - now); } } upload() { if (this.uploadHandle != other_1.None) { clearTimeout(this.uploadHandle); this.uploadHandle = other_1.None; } this.firstUnuploadedUpdateTime = 0; this.lastUploadTime = Date.now(); const commandGroup = this.unuploadedUpdateCommand; this.unuploadedUpdateCommand = new kitten_cloud_data_update_command_group_1.KittenCloudDataUpdateCommandGroup(); this.uploadingUpdateCommand.addAll(commandGroup); for (const __command of commandGroup) { this.uploadingStartTimeArray.push(this.lastUploadTime); if (this.data.uploadTimeout.value > 0) { this.uploadingTimeoutHandle.push(setTimeout(() => { this.handleUploadingError(new Error("上传超时")); }, this.data.uploadTimeout.value)); } else { this.uploadingTimeoutHandle.push(0); } } return commandGroup; } } exports.KittenCloudDataUpdateManager = KittenCloudDataUpdateManager;