UNPKG

@platform/cell.client

Version:

A strongly typed HTTP client for operating with a CellOS service end-point.

153 lines (152 loc) 6.98 kB
"use strict"; 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; }