kitten-cloud-function
Version:
用于编程猫源码云功能(云变量、云列表等)的客户端工具
280 lines (279 loc) • 11.9 kB
JavaScript
"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;