UNPKG

molstar

Version:

A comprehensive macromolecular library.

153 lines 7.05 kB
"use strict"; /** * Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> * @author Alexander Rose <alexander.rose@weirdbyte.de> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.Asset = exports.AssetManager = void 0; var tslib_1 = require("tslib"); var uuid_1 = require("./uuid"); var util_1 = require("../mol-data/util"); var data_source_1 = require("./data-source"); var mol_task_1 = require("../mol-task"); var Asset; (function (Asset) { function Url(url, options) { return (0, tslib_1.__assign)({ kind: 'url', id: uuid_1.UUID.create22(), url: url }, options); } Asset.Url = Url; function File(file) { return { kind: 'file', id: uuid_1.UUID.create22(), name: file.name, file: file }; } Asset.File = File; function isUrl(x) { return (x === null || x === void 0 ? void 0 : x.kind) === 'url'; } Asset.isUrl = isUrl; function isFile(x) { return (x === null || x === void 0 ? void 0 : x.kind) === 'file'; } Asset.isFile = isFile; function Wrapper(data, asset, manager) { return { data: data, dispose: function () { manager.release(asset); } }; } Asset.Wrapper = Wrapper; function getUrl(url) { return typeof url === 'string' ? url : url.url; } Asset.getUrl = getUrl; function getUrlAsset(manager, url, body) { if (typeof url === 'string') { var asset = manager.tryFindUrl(url, body); return asset || Url(url, { body: body }); } return url; } Asset.getUrlAsset = getUrlAsset; })(Asset || (Asset = {})); exports.Asset = Asset; var AssetManager = /** @class */ (function () { function AssetManager() { // TODO: add URL based ref-counted cache? // TODO: when serializing, check for duplicates? this._assets = new Map(); } Object.defineProperty(AssetManager.prototype, "assets", { get: function () { return (0, util_1.iterableToArray)(this._assets.values()); }, enumerable: false, configurable: true }); AssetManager.prototype.tryFindUrl = function (url, body) { var assets = this.assets.values(); while (true) { var v = assets.next(); if (v.done) return; var asset = v.value.asset; if (Asset.isUrl(asset) && asset.url === url && (asset.body || '') === (body || '')) return asset; } }; AssetManager.prototype.set = function (asset, file) { this._assets.set(asset.id, { asset: asset, file: file, refCount: 0 }); }; AssetManager.prototype.resolve = function (asset, type, store) { var _this = this; if (store === void 0) { store = true; } if (Asset.isUrl(asset)) { return mol_task_1.Task.create("Download " + (asset.title || asset.url), function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var entry, _a, _b, _c, _d, data, file, _e, _f; return (0, tslib_1.__generator)(this, function (_g) { switch (_g.label) { case 0: if (!this._assets.has(asset.id)) return [3 /*break*/, 2]; entry = this._assets.get(asset.id); entry.refCount++; _b = (_a = Asset).Wrapper; return [4 /*yield*/, (0, data_source_1.readFromFile)(entry.file, type).runInContext(ctx)]; case 1: return [2 /*return*/, _b.apply(_a, [_g.sent(), asset, this])]; case 2: if (!!store) return [3 /*break*/, 4]; _d = (_c = Asset).Wrapper; return [4 /*yield*/, (0, data_source_1.ajaxGet)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, asset), { type: type })).runInContext(ctx)]; case 3: return [2 /*return*/, _d.apply(_c, [_g.sent(), asset, this])]; case 4: return [4 /*yield*/, (0, data_source_1.ajaxGet)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, asset), { type: 'binary' })).runInContext(ctx)]; case 5: data = _g.sent(); file = new File([data], 'raw-data'); this._assets.set(asset.id, { asset: asset, file: file, refCount: 1 }); _f = (_e = Asset).Wrapper; return [4 /*yield*/, (0, data_source_1.readFromFile)(file, type).runInContext(ctx)]; case 6: return [2 /*return*/, _f.apply(_e, [_g.sent(), asset, this])]; } }); }); }); } else { return mol_task_1.Task.create("Read " + asset.name, function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var entry, _a, _b, _c, _d; return (0, tslib_1.__generator)(this, function (_e) { switch (_e.label) { case 0: if (!this._assets.has(asset.id)) return [3 /*break*/, 2]; entry = this._assets.get(asset.id); entry.refCount++; _b = (_a = Asset).Wrapper; return [4 /*yield*/, (0, data_source_1.readFromFile)(entry.file, type).runInContext(ctx)]; case 1: return [2 /*return*/, _b.apply(_a, [_e.sent(), asset, this])]; case 2: if (!(asset.file instanceof File)) { throw new Error("Cannot resolve file asset '" + asset.name + "' (" + asset.id + ")"); } if (store) { this._assets.set(asset.id, { asset: asset, file: asset.file, refCount: 1 }); } _d = (_c = Asset).Wrapper; return [4 /*yield*/, (0, data_source_1.readFromFile)(asset.file, type).runInContext(ctx)]; case 3: return [2 /*return*/, _d.apply(_c, [_e.sent(), asset, this])]; } }); }); }); } }; AssetManager.prototype.release = function (asset) { var entry = this._assets.get(asset.id); if (!entry) return; entry.refCount--; if (entry.refCount <= 0) this._assets.delete(asset.id); }; return AssetManager; }()); exports.AssetManager = AssetManager; //# sourceMappingURL=assets.js.map