UNPKG

semantic-network

Version:

A utility library for manipulating a list of links that form a semantic interface to a network of resources.

641 lines (637 loc) 40.7 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __asyncValues = (this && this.__asyncValues) || function (o) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var m = o[Symbol.asyncIterator], i; return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SyncUtil = void 0; var semantic_link_1 = require("semantic-link"); var apiUtil_1 = require("../apiUtil"); var resourceMergeFactory_1 = require("../representation/resourceMergeFactory"); var linkRelation_1 = require("../linkRelation"); var differencer_1 = require("./differencer"); var anylogger_1 = __importDefault(require("anylogger")); var representationUtil_1 = require("../utils/representationUtil"); var log = (0, anylogger_1.default)('SyncUtil'); var SyncUtil = exports.SyncUtil = /** @class */ (function () { function SyncUtil() { } SyncUtil.syncResources = function (resource, document, strategies, options) { if (strategies === void 0) { strategies = []; } return __awaiter(this, void 0, void 0, function () { var strategyBatchSize; var _a; var _this = this; return __generator(this, function (_b) { strategyBatchSize = (_a = __assign({}, options).strategyBatchSize, _a === void 0 ? undefined : _a); if (strategyBatchSize === 0 || !strategyBatchSize) { log.debug('sync strategy resource: parallel'); return [2 /*return*/, function () { return __awaiter(_this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, Promise.all(strategies.map(function (strategy) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, strategy({ resource: resource, document: document, options: options, })]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }))]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }]; } else { return [2 /*return*/, function () { return __awaiter(_this, void 0, void 0, function () { var results, _a, strategies_1, strategies_1_1, strategy, result, e_1_1; var _b, e_1, _c, _d; return __generator(this, function (_e) { switch (_e.label) { case 0: results = []; _e.label = 1; case 1: _e.trys.push([1, 7, 8, 13]); _a = true, strategies_1 = __asyncValues(strategies); _e.label = 2; case 2: return [4 /*yield*/, strategies_1.next()]; case 3: if (!(strategies_1_1 = _e.sent(), _b = strategies_1_1.done, !_b)) return [3 /*break*/, 6]; _d = strategies_1_1.value; _a = false; strategy = _d; return [4 /*yield*/, strategy({ resource: resource, document: document, options: options, })]; case 4: result = _e.sent(); results.push(result); _e.label = 5; case 5: _a = true; return [3 /*break*/, 2]; case 6: return [3 /*break*/, 13]; case 7: e_1_1 = _e.sent(); e_1 = { error: e_1_1 }; return [3 /*break*/, 13]; case 8: _e.trys.push([8, , 11, 12]); if (!(!_a && !_b && (_c = strategies_1.return))) return [3 /*break*/, 10]; return [4 /*yield*/, _c.call(strategies_1)]; case 9: _e.sent(); _e.label = 10; case 10: return [3 /*break*/, 12]; case 11: if (e_1) throw e_1.error; return [7 /*endfinally*/]; case 12: return [7 /*endfinally*/]; case 13: return [2 /*return*/, results]; } }); }); }]; } return [2 /*return*/]; }); }); }; SyncUtil.tailRecursionThroughStrategies = function (strategies, syncInfos, options) { var _a, strategies_2, strategies_2_1, _b, syncInfos_1, syncInfos_1_1; var _c, e_2, _d, _e, _f, e_3, _g, _h; return __awaiter(this, void 0, void 0, function () { var strategyBatchSize, _loop_1, e_2_1; var _j; var _this = this; return __generator(this, function (_k) { switch (_k.label) { case 0: strategyBatchSize = (_j = __assign({}, options).strategyBatchSize, _j === void 0 ? undefined : _j); _k.label = 1; case 1: _k.trys.push([1, 7, 8, 13]); _loop_1 = function () { var strategy, syncInfo, e_3_1; return __generator(this, function (_l) { switch (_l.label) { case 0: _e = strategies_2_1.value; _a = false; strategy = _e; if (!(strategyBatchSize === 0 || !strategyBatchSize)) return [3 /*break*/, 2]; // invoke a parallel strategy when want to go for it log.debug('sync strategy tail: parallel'); return [4 /*yield*/, Promise.all(syncInfos.map(function (syncInfo) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, strategy({ resource: syncInfo.resource, document: syncInfo.document, options: options, })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }))]; case 1: _l.sent(); return [3 /*break*/, 15]; case 2: // invoke a sequential strategy - and for now, single at a time log.debug('sync strategy tail: sequential '); _l.label = 3; case 3: _l.trys.push([3, 9, 10, 15]); _b = true, syncInfos_1 = (e_3 = void 0, __asyncValues(syncInfos)); _l.label = 4; case 4: return [4 /*yield*/, syncInfos_1.next()]; case 5: if (!(syncInfos_1_1 = _l.sent(), _f = syncInfos_1_1.done, !_f)) return [3 /*break*/, 8]; _h = syncInfos_1_1.value; _b = false; syncInfo = _h; return [4 /*yield*/, strategy({ resource: syncInfo.resource, document: syncInfo.document, options: options, })]; case 6: _l.sent(); _l.label = 7; case 7: _b = true; return [3 /*break*/, 4]; case 8: return [3 /*break*/, 15]; case 9: e_3_1 = _l.sent(); e_3 = { error: e_3_1 }; return [3 /*break*/, 15]; case 10: _l.trys.push([10, , 13, 14]); if (!(!_b && !_f && (_g = syncInfos_1.return))) return [3 /*break*/, 12]; return [4 /*yield*/, _g.call(syncInfos_1)]; case 11: _l.sent(); _l.label = 12; case 12: return [3 /*break*/, 14]; case 13: if (e_3) throw e_3.error; return [7 /*endfinally*/]; case 14: return [7 /*endfinally*/]; case 15: return [2 /*return*/]; } }); }; _a = true, strategies_2 = __asyncValues(strategies); _k.label = 2; case 2: return [4 /*yield*/, strategies_2.next()]; case 3: if (!(strategies_2_1 = _k.sent(), _c = strategies_2_1.done, !_c)) return [3 /*break*/, 6]; return [5 /*yield**/, _loop_1()]; case 4: _k.sent(); _k.label = 5; case 5: _a = true; return [3 /*break*/, 2]; case 6: return [3 /*break*/, 13]; case 7: e_2_1 = _k.sent(); e_2 = { error: e_2_1 }; return [3 /*break*/, 13]; case 8: _k.trys.push([8, , 11, 12]); if (!(!_a && !_c && (_d = strategies_2.return))) return [3 /*break*/, 10]; return [4 /*yield*/, _d.call(strategies_2)]; case 9: _k.sent(); _k.label = 10; case 10: return [3 /*break*/, 12]; case 11: if (e_2) throw e_2.error; return [7 /*endfinally*/]; case 12: return [7 /*endfinally*/]; case 13: return [2 /*return*/]; } }); }); }; SyncUtil.syncResourceInCollection = function (resource, document, options) { return __awaiter(this, void 0, void 0, function () { var resolver, findResourceInCollectionStrategy, forceCreate, item, result, resource_1, uri, result, resultUri, originalUri; var _a, _b, _c, _d; return __generator(this, function (_e) { switch (_e.label) { case 0: resolver = (_a = __assign({}, options), _b = _a.resolver, _b === void 0 ? resourceMergeFactory_1.noopResolver : _b), findResourceInCollectionStrategy = (_c = _a.findResourceInCollectionStrategy, _c === void 0 ? this.defaultFindResourceInCollectionStrategy : _c), forceCreate = (_d = _a.forceCreate, _d === void 0 ? false : _d); item = findResourceInCollectionStrategy(resource, { where: document }); if (!(item && !forceCreate)) return [3 /*break*/, 4]; return [4 /*yield*/, apiUtil_1.ApiUtil.get(resource, __assign(__assign({}, options), { where: item }))]; case 1: result = _e.sent(); if (!result) return [3 /*break*/, 3]; return [4 /*yield*/, apiUtil_1.ApiUtil.update(result, document, options)]; case 2: resource_1 = _e.sent(); if (resource_1) { uri = semantic_link_1.LinkUtil.getUri(resource_1, linkRelation_1.LinkRelation.Self); log.debug('sync resource \'update\' in collection %s', uri); return [2 /*return*/, { resource: resource_1, document: document, action: 'update', }]; } else { log.warn('sync resource \'update\' failed in collection %s', semantic_link_1.LinkUtil.getUri(resource_1, linkRelation_1.LinkRelation.Self)); } _e.label = 3; case 3: return [3 /*break*/, 6]; case 4: return [4 /*yield*/, apiUtil_1.ApiUtil.create(document, __assign(__assign({}, options), { createContext: resource }))]; case 5: result = _e.sent(); if (result) { resultUri = semantic_link_1.LinkUtil.getUri(result, linkRelation_1.LinkRelation.Self); originalUri = semantic_link_1.LinkUtil.getUri(document, linkRelation_1.LinkRelation.Self); if (originalUri && resultUri && originalUri !== resultUri) { resolver.add(originalUri, resultUri); } else { log.debug('sync resource \'create\' new not mapped \'%s\'', resultUri); } log.debug('sync resource \'create\' in collection %s', resultUri); return [2 /*return*/, { resource: result, document: document, action: 'create', }]; } else { log.warn('sync resource \'create\' failed in collection %s', semantic_link_1.LinkUtil.getUri(resource, linkRelation_1.LinkRelation.Self)); } _e.label = 6; case 6: return [2 /*return*/]; } }); }); }; SyncUtil.syncInfos = function (strategies, options) { var _this = this; return function (syncInfo) { return __awaiter(_this, void 0, void 0, function () { var strategyBatchSize, _a, strategies_3, strategies_3_1, strategy, e_4_1; var _b; var _this = this; var _c, e_4, _d, _e; return __generator(this, function (_f) { switch (_f.label) { case 0: strategyBatchSize = (_b = __assign({}, (options)).strategyBatchSize, _b === void 0 ? undefined : _b); if (!(strategyBatchSize === 0 || !strategyBatchSize)) return [3 /*break*/, 2]; return [4 /*yield*/, Promise.all(strategies.map(function (strategy) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, strategy({ resource: syncInfo.resource, document: syncInfo.document, options: options, })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }))]; case 1: _f.sent(); return [3 /*break*/, 14]; case 2: _f.trys.push([2, 8, 9, 14]); _a = true, strategies_3 = __asyncValues(strategies); _f.label = 3; case 3: return [4 /*yield*/, strategies_3.next()]; case 4: if (!(strategies_3_1 = _f.sent(), _c = strategies_3_1.done, !_c)) return [3 /*break*/, 7]; _e = strategies_3_1.value; _a = false; strategy = _e; return [4 /*yield*/, strategy({ resource: syncInfo.resource, document: syncInfo.document, options: options, })]; case 5: _f.sent(); _f.label = 6; case 6: _a = true; return [3 /*break*/, 3]; case 7: return [3 /*break*/, 14]; case 8: e_4_1 = _f.sent(); e_4 = { error: e_4_1 }; return [3 /*break*/, 14]; case 9: _f.trys.push([9, , 12, 13]); if (!(!_a && !_c && (_d = strategies_3.return))) return [3 /*break*/, 11]; return [4 /*yield*/, _d.call(strategies_3)]; case 10: _f.sent(); _f.label = 11; case 11: return [3 /*break*/, 13]; case 12: if (e_4) throw e_4.error; return [7 /*endfinally*/]; case 13: return [7 /*endfinally*/]; case 14: /* // note: currently both parallel and sequential are same because the set n = 1 for await (const strategy of strategies) { if (strategyBatchSize === 0 || !strategyBatchSize) { // invoke a parallel strategy when want to go for it log.debug('sync strategy info: parallel'); await Promise.all([syncInfo].map(async syncInfo => { await strategy({ resource: syncInfo.resource, document: syncInfo.document, options, }); })); } else { // invoke a sequential strategy - and for now, single at a time log.debug('sync strategy info: sequential'); /!* await [syncInfo].reduce( async (acc, curr) => { return await strategy({ resource: curr.resource, document: curr.document, options, }); }, Promise.resolve()); *!/ for await (const syncInfo1 of [syncInfo]) { await strategy({ resource: syncInfo1.resource, document: syncInfo1.document, options, }); } } } */ return [2 /*return*/, syncInfo.resource]; } }); }); }; }; SyncUtil.defaultFindResourceInCollectionStrategy = representationUtil_1.RepresentationUtil.findInCollection; SyncUtil.synchroniseCollection = function (collectionResource, collectionDocument, options) { return __awaiter(this, void 0, void 0, function () { var resolver, readonly, contributeonly, deleteResourceAndUpdateResolver, updateResourceAndUpdateResolver, createResourceAndUpdateResolver, deleteReadonlyResourceAndUpdateResolver, updateReadonlyResourceAndUpdateResolver, createReadonlyResourceAndUpdateResolver, removeContributeOnlyResourceAndUpdateResolver, updateContributeOnlyResourceAndUpdateResolver, addContributeOnlyResourceAndUpdateResolver, makeOptions; var _a, _b; var _this = this; return __generator(this, function (_c) { switch (_c.label) { case 0: resolver = (_a = __assign({}, options), _b = _a.resolver, _b === void 0 ? resourceMergeFactory_1.noopResolver : _b), readonly = _a.readonly, contributeonly = _a.contributeonly; deleteResourceAndUpdateResolver = function (deleteResource) { return __awaiter(_this, void 0, void 0, function () { var result, uri; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, apiUtil_1.ApiUtil.delete(deleteResource, __assign(__assign({}, options), { // TODO: this is unlikely to be used 'on' doesn't exist in delete addStateOn: collectionResource }))]; case 1: result = _a.sent(); if (result) { uri = semantic_link_1.LinkUtil.getUri(deleteResource, linkRelation_1.LinkRelation.Self); if (uri) { log.debug('sync delete on collection \'%s\'', semantic_link_1.LinkUtil.getUri(collectionResource, linkRelation_1.LinkRelation.Self)); resolver.remove(uri); } } else { log.debug('sync not deleted on collection \'%s\' %s', semantic_link_1.LinkUtil.getUri(collectionResource, linkRelation_1.LinkRelation.Self), semantic_link_1.LinkUtil.getUri(deleteResource, linkRelation_1.LinkRelation.Self)); } return [2 /*return*/]; } }); }); }; updateResourceAndUpdateResolver = function (updateResource, updateDataDocument) { return __awaiter(_this, void 0, void 0, function () { var result, update, uriOriginal, uriResult; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, apiUtil_1.ApiUtil.get(updateResource, options)]; case 1: result = _a.sent(); if (!result) return [3 /*break*/, 3]; return [4 /*yield*/, apiUtil_1.ApiUtil.update(result, updateDataDocument, options)]; case 2: update = _a.sent(); if (update) { uriOriginal = semantic_link_1.LinkUtil.getUri(updateDataDocument, linkRelation_1.LinkRelation.Self); uriResult = semantic_link_1.LinkUtil.getUri(updateResource, linkRelation_1.LinkRelation.Self); if (uriOriginal && uriResult) { log.debug('sync update on \'%s\'', semantic_link_1.LinkUtil.getUri(update, linkRelation_1.LinkRelation.Self)); resolver.update(uriOriginal, uriResult); } } return [3 /*break*/, 4]; case 3: log.debug('sync not updated on %s', semantic_link_1.LinkUtil.getUri(updateResource, linkRelation_1.LinkRelation.Self)); _a.label = 4; case 4: return [2 /*return*/]; } }); }); }; createResourceAndUpdateResolver = function (createDataDocument) { return __awaiter(_this, void 0, void 0, function () { var result, uriOriginal, uriResult; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, apiUtil_1.ApiUtil.create(createDataDocument, __assign(__assign({}, options), { createContext: collectionResource }))]; case 1: result = _a.sent(); uriOriginal = semantic_link_1.LinkUtil.getUri(createDataDocument, linkRelation_1.LinkRelation.Self); if (result) { uriResult = semantic_link_1.LinkUtil.getUri(result, linkRelation_1.LinkRelation.Self); if (uriOriginal && uriResult) { log.debug('sync create on collection \'%s\'', semantic_link_1.LinkUtil.getUri(collectionResource, linkRelation_1.LinkRelation.Self)); resolver.add(uriOriginal, uriResult); } } else { log.debug('sync on collection not created \'%s\' for %s', semantic_link_1.LinkUtil.getUri(collectionResource, linkRelation_1.LinkRelation.Self), uriOriginal); } // TODO: returning undefined changes the interface T | undefined on the CreateStrategy return [2 /*return*/, result]; } }); }); }; deleteReadonlyResourceAndUpdateResolver = function (collectionResourceItem) { return __awaiter(_this, void 0, void 0, function () { var uri; return __generator(this, function (_a) { uri = semantic_link_1.LinkUtil.getUri(collectionResourceItem, linkRelation_1.LinkRelation.Self); if (uri) { resolver.remove(uri); } return [2 /*return*/]; }); }); }; updateReadonlyResourceAndUpdateResolver = function (collectionResourceItem, updateDataDocument) { return __awaiter(_this, void 0, void 0, function () { var uri, uri1; return __generator(this, function (_a) { uri = semantic_link_1.LinkUtil.getUri(updateDataDocument, linkRelation_1.LinkRelation.Self); uri1 = semantic_link_1.LinkUtil.getUri(collectionResourceItem, linkRelation_1.LinkRelation.Self); if (uri && uri1) { resolver.update(uri, uri1); } return [2 /*return*/]; }); }); }; createReadonlyResourceAndUpdateResolver = function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { // TODO: update interface return [2 /*return*/, undefined]; }); }); }; removeContributeOnlyResourceAndUpdateResolver = function (deleteResource) { return __awaiter(_this, void 0, void 0, function () { var result, uri; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, apiUtil_1.ApiUtil.delete(collectionResource, __assign(__assign({}, options), { where: deleteResource }))]; case 1: result = _a.sent(); if (result) { uri = semantic_link_1.LinkUtil.getUri(deleteResource, linkRelation_1.LinkRelation.Self); log.debug('sync on collection delete \'%s\'', semantic_link_1.LinkUtil.getUri(collectionResource, linkRelation_1.LinkRelation.Self)); if (uri) { resolver.remove(uri); } } else { log.debug('sync delete \'%s\' %s', semantic_link_1.LinkUtil.getUri(deleteResource, linkRelation_1.LinkRelation.Self)); } return [2 /*return*/]; } }); }); }; updateContributeOnlyResourceAndUpdateResolver = function (collectionResourceItem, updateDataDocument) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, updateReadonlyResourceAndUpdateResolver(collectionResourceItem, updateDataDocument)]; case 1: // at this point, it is the same implementation as the read-only form return [2 /*return*/, _a.sent()]; } }); }); }; addContributeOnlyResourceAndUpdateResolver = function (createDataDocument) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, createResourceAndUpdateResolver(createDataDocument)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; makeOptions = function () { if (contributeonly) { log.debug("contribute-only collection '".concat(semantic_link_1.LinkUtil.getUri(collectionResource, linkRelation_1.LinkRelation.Self), "'")); return { createStrategy: addContributeOnlyResourceAndUpdateResolver, updateStrategy: updateContributeOnlyResourceAndUpdateResolver, deleteStrategy: removeContributeOnlyResourceAndUpdateResolver, }; // If the caller has signalled that the collection is read-only, or the collection // if missing a 'create-form' representation then we assume that the NOD can // not be changed. } else if (readonly || !semantic_link_1.LinkUtil.matches(collectionResource, linkRelation_1.LinkRelation.CreateForm)) { log.debug("read-only collection '".concat(semantic_link_1.LinkUtil.getUri(collectionResource, linkRelation_1.LinkRelation.Self), "'")); return { createStrategy: createReadonlyResourceAndUpdateResolver, updateStrategy: updateReadonlyResourceAndUpdateResolver, deleteStrategy: deleteReadonlyResourceAndUpdateResolver, }; } else { log.debug("updatable collection '".concat(semantic_link_1.LinkUtil.getUri(collectionResource, linkRelation_1.LinkRelation.Self), "'")); return { createStrategy: createResourceAndUpdateResolver, updateStrategy: updateResourceAndUpdateResolver, deleteStrategy: deleteResourceAndUpdateResolver, }; } }; return [4 /*yield*/, differencer_1.Differencer.difference(collectionResource, collectionDocument, __assign(__assign({}, options), makeOptions()))]; case 1: return [2 /*return*/, _c.sent()]; } }); }); }; return SyncUtil; }()); //# sourceMappingURL=syncUtil.js.map