@lifaon/rx-js-light
Version:
Blazing fast Observables
71 lines (70 loc) • 3.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createObservableProxy = void 0;
var create_multicast_replay_last_source_1 = require("../observer-observable-pair/build-in/source/built-in/replay-last-source/derived/create-multicast-replay-last-source.cjs");
var pipe_observable_1 = require("../observable/helpers/piping/pipe-observable/pipe-observable.cjs");
var map_observable_pipe_1 = require("../observable/pipes/built-in/without-notifications/observer-pipe-related/map/map-observable-pipe.cjs");
var get_object_property_path_value_1 = require("../misc/helpers/property-path/get-object-property-path-value.cjs");
function createObservableProxy(data, path) {
if (path === void 0) {
path = [];
}
var cachedSubscribe;
var cachedSourcesForArray = [];
var cachedProxiesForArray = [];
var cachedSubscribeArray;
var cachedProxies = new Map();
return new Proxy(Object.create(null), {
get: function (target, propertyKey) {
if (propertyKey === '$') {
if (cachedSubscribe === void 0) {
cachedSubscribe = (0, pipe_observable_1.pipeObservable)(data, [(0, map_observable_pipe_1.mapObservablePipe)(function (data) {
return (0, get_object_property_path_value_1.getOptionalObjectPropertyPathValue)(data, path);
})]);
}
return cachedSubscribe;
} else if (propertyKey === '$array') {
if (cachedSubscribeArray === void 0) {
cachedSubscribeArray = (0, pipe_observable_1.pipeObservable)(data, [(0, map_observable_pipe_1.mapObservablePipe)(function (data) {
var items = (0, get_object_property_path_value_1.getObjectPropertyPathValue)(data, path);
if (Array.isArray(items)) {
var itemsLength = items.length;
var cachedProxiesForArrayLength = cachedProxiesForArray.length;
if (cachedProxiesForArrayLength < itemsLength) {
cachedSourcesForArray.length = itemsLength;
cachedProxiesForArray.length = itemsLength;
for (var i = cachedProxiesForArrayLength; i < itemsLength; i++) {
var source = (0, create_multicast_replay_last_source_1.createMulticastReplayLastSource)({
initialValue: items[i]
});
cachedSourcesForArray[i] = source.emit;
cachedProxiesForArray[i] = createObservableProxy(source.subscribe);
}
}
for (var i = 0; i < itemsLength; i++) {
cachedSourcesForArray[i](items[i]);
}
return cachedProxiesForArray;
} else {
throw new Error("Not an array");
}
})]);
}
return cachedSubscribeArray;
} else {
var cachedProxy = cachedProxies.get(propertyKey);
if (cachedProxy === void 0) {
cachedProxy = createObservableProxy(data, path.concat(propertyKey));
cachedProxies.set(propertyKey, cachedProxy);
}
return cachedProxy;
}
},
set: function () {
throw new Error("The proxy is readonly");
}
});
}
exports.createObservableProxy = createObservableProxy;