@platform/cell.client
Version:
A strongly typed HTTP client for operating with a CellOS service end-point.
153 lines (152 loc) • 6.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.saveMonitor = void 0;
var tslib_1 = require("tslib");
var rxjs_1 = require("rxjs");
var operators_1 = require("rxjs/operators");
var common_1 = require("../common");
function saveMonitor(args) {
var _this = this;
var client = args.client;
var http = client.http;
var debounce = common_1.defaultValue(args.debounce, 300);
var queue = common_1.MemoryQueue.create();
var dispose$ = new rxjs_1.Subject();
var changed$ = client.changes.changed$.pipe(operators_1.takeUntil(dispose$));
var subject$ = args.event$ || new rxjs_1.Subject();
var event$ = subject$.pipe(operators_1.takeUntil(dispose$), operators_1.share());
var fire = function (e) { return subject$.next(e); };
var pending = {};
changed$.pipe(operators_1.debounceTime(debounce)).subscribe(function (e) { return api.save(); });
changed$.subscribe(function (e) {
var sheet = e.sheet;
var ns = sheet.uri.toString();
var changes = pending[ns] || {};
Object.keys(e.changes).forEach(function (key) {
var _a;
changes = tslib_1.__assign(tslib_1.__assign({}, changes), (_a = {}, _a[key] = tslib_1.__assign(tslib_1.__assign({}, changes[key]), e.changes[key]), _a));
});
pending[ns] = changes;
});
var save = function (changes) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var target, sheets, findSheet, changeSet, wait, res;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
target = client.http.origin;
sheets = client.changes.watching;
findSheet = function (ns) {
return sheets.find(function (sheet) { return sheet.uri.toString() === ns; });
};
changeSet = Object.keys(changes)
.map(function (ns) { return ({
ns: ns,
changes: changes[ns],
sheet: findSheet(ns),
}); })
.filter(function (sheet) { return Boolean(sheet); });
changeSet.forEach(function (_a) {
var sheet = _a.sheet, changes = _a.changes;
fire({ type: 'SHEET/saving', payload: { target: target, sheet: sheet, changes: changes } });
});
wait = changeSet.map(function (_a) {
var ns = _a.ns, changes = _a.changes;
return saveSheet({ ns: ns, http: http, changes: changes });
});
return [4, Promise.all(wait)];
case 1:
res = _a.sent();
res
.filter(function (_a) {
var ok = _a.ok;
return ok;
})
.map(function (_a) {
var ns = _a.ns;
return findSheet(ns);
})
.filter(function (sheet) { return Boolean(sheet); })
.forEach(function (sheet) { return sheet.state.clear.changes('SAVE'); });
changeSet.forEach(function (_a) {
var sheet = _a.sheet, changes = _a.changes;
var ns = sheet.uri.toString();
var errors = res
.filter(function (res) { return res.ns === ns; })
.filter(function (res) { return Boolean(res.error); })
.map(function (res) { return ({ ns: ns, error: res.error }); });
var ok = errors.length === 0;
fire({ type: 'SHEET/saved', payload: { ok: ok, target: target, sheet: sheet, changes: changes, errors: errors } });
fire({ type: 'SHEET/sync', payload: { ns: ns, changes: changes } });
});
return [2];
}
});
}); };
var api = {
event$: event$,
saving$: event$.pipe(operators_1.filter(function (e) { return e.type === 'SHEET/saving'; }), operators_1.map(function (e) { return e.payload; }), operators_1.share()),
saved$: event$.pipe(operators_1.filter(function (e) { return e.type === 'SHEET/saved'; }), operators_1.map(function (e) { return e.payload; }), operators_1.share()),
get debounce() {
return debounce;
},
get isDisposed() {
return !dispose$.isStopped;
},
dispose: function () {
dispose$.next();
dispose$.complete();
},
save: function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var changes;
return tslib_1.__generator(this, function (_a) {
changes = tslib_1.__assign({}, pending);
pending = {};
return [2, queue.push(function () { return save(changes); })];
});
});
},
};
return api;
}
exports.saveMonitor = saveMonitor;
function saveSheet(args) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var ns, http, changes, client, error, payload, res, ok;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
ns = args.ns, http = args.http, changes = args.changes;
client = http.ns(ns);
if (!(changes.cells || changes.ns)) return [3, 2];
payload = {
cells: changes.cells ? toChangedCells(changes) : undefined,
ns: changes.ns ? changes.ns.to : undefined,
};
return [4, client.write(payload, { data: false })];
case 1:
res = _a.sent();
if (!res.ok) {
error = {
status: res.status,
type: common_1.ERROR.HTTP.SERVER,
message: "Failed while saving data to " + http.origin,
children: res.error ? [res.error] : undefined,
};
}
_a.label = 2;
case 2:
ok = !Boolean(error);
return [2, { ok: ok, ns: ns, error: error }];
}
});
});
}
function toChangedCells(changes) {
var res = {};
var cells = changes.cells || {};
Object.keys(cells)
.filter(function (key) { return common_1.coord.cell.isCell(key); })
.forEach(function (key) { return (res[key] = cells[key].to); });
return res;
}