matrix-react-sdk
Version:
SDK for matrix.org using React
146 lines (124 loc) • 11.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.implicitlyReverted = implicitlyReverted;
exports.GenericEchoChamber = exports.PROPERTY_UPDATED = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _EchoTransaction = require("./EchoTransaction");
var _events = require("events");
/*
Copyright 2020 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
async function implicitlyReverted() {// do nothing :D
}
const PROPERTY_UPDATED = "property_updated";
exports.PROPERTY_UPDATED = PROPERTY_UPDATED;
class GenericEchoChamber
/*:: <C extends EchoContext, K, V>*/
extends _events.EventEmitter {
constructor(context
/*: C*/
, lookupFn
/*: (key: K) => V*/
) {
super();
this.context
/*:: */
= context
/*:: */
;
this.lookupFn
/*:: */
= lookupFn
/*:: */
;
(0, _defineProperty2.default)(this, "cache", new Map());
(0, _defineProperty2.default)(this, "matrixClient", void 0);
}
setClient(client
/*: MatrixClient*/
) {
const oldClient = this.matrixClient;
this.matrixClient = client;
this.onClientChanged(oldClient, client);
}
/**
* Gets a value. If the key is in flight, the cached value will be returned. If
* the key is not in flight then the lookupFn provided to this class will be
* called instead.
* @param key The key to look up.
* @returns The value for the key.
*/
getValue(key
/*: K*/
)
/*: V*/
{
return this.cache.has(key) ? this.cache.get(key).val : this.lookupFn(key);
}
cacheVal(key
/*: K*/
, val
/*: V*/
, txn
/*: EchoTransaction*/
) {
this.cache.set(key, {
txn,
val
});
this.emit(PROPERTY_UPDATED, key);
}
decacheKey(key
/*: K*/
) {
if (this.cache.has(key)) {
this.context.disownTransaction(this.cache.get(key).txn);
this.cache.delete(key);
this.emit(PROPERTY_UPDATED, key);
}
}
markEchoReceived(key
/*: K*/
) {
if (this.cache.has(key)) {
const txn = this.cache.get(key).txn;
this.context.disownTransaction(txn);
txn.cancel();
}
this.decacheKey(key);
}
setValue(auditName
/*: string*/
, key
/*: K*/
, targetVal
/*: V*/
, runFn
/*: RunFn*/
, revertFn
/*: RunFn*/
) {
// Cancel any pending transactions for the same key
if (this.cache.has(key)) {
this.cache.get(key).txn.cancel();
}
const ctxn = this.context.beginTransaction(auditName, runFn);
this.cacheVal(key, targetVal, ctxn); // set the cache now as it won't be updated by the .when() ladder below.
ctxn.when(_EchoTransaction.TransactionStatus.Pending, () => this.cacheVal(key, targetVal, ctxn)).when(_EchoTransaction.TransactionStatus.Error, () => revertFn());
ctxn.run();
}
}
exports.GenericEchoChamber = GenericEchoChamber;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdG9yZXMvbG9jYWwtZWNoby9HZW5lcmljRWNob0NoYW1iZXIudHMiXSwibmFtZXMiOlsiaW1wbGljaXRseVJldmVydGVkIiwiUFJPUEVSVFlfVVBEQVRFRCIsIkdlbmVyaWNFY2hvQ2hhbWJlciIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwiY29udGV4dCIsImxvb2t1cEZuIiwiTWFwIiwic2V0Q2xpZW50IiwiY2xpZW50Iiwib2xkQ2xpZW50IiwibWF0cml4Q2xpZW50Iiwib25DbGllbnRDaGFuZ2VkIiwiZ2V0VmFsdWUiLCJrZXkiLCJjYWNoZSIsImhhcyIsImdldCIsInZhbCIsImNhY2hlVmFsIiwidHhuIiwic2V0IiwiZW1pdCIsImRlY2FjaGVLZXkiLCJkaXNvd25UcmFuc2FjdGlvbiIsImRlbGV0ZSIsIm1hcmtFY2hvUmVjZWl2ZWQiLCJjYW5jZWwiLCJzZXRWYWx1ZSIsImF1ZGl0TmFtZSIsInRhcmdldFZhbCIsInJ1bkZuIiwicmV2ZXJ0Rm4iLCJjdHhuIiwiYmVnaW5UcmFuc2FjdGlvbiIsIndoZW4iLCJUcmFuc2FjdGlvblN0YXR1cyIsIlBlbmRpbmciLCJFcnJvciIsInJ1biJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBaUJBOztBQUVBOztBQW5CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFPTyxlQUFlQSxrQkFBZixHQUFvQyxDQUN2QztBQUNIOztBQUVNLE1BQU1DLGdCQUFnQixHQUFHLGtCQUF6Qjs7O0FBRUEsTUFBZUM7QUFBZjtBQUFBLFFBQXVFQyxvQkFBdkUsQ0FBb0Y7QUFJN0VDLEVBQUFBLFdBQVYsQ0FBc0NDO0FBQXRDO0FBQUEsSUFBMERDO0FBQTFEO0FBQUEsSUFBbUY7QUFDL0U7QUFEK0UsU0FBN0NEO0FBQTZDO0FBQUEsTUFBN0NBO0FBQTZDO0FBQUE7QUFBQSxTQUF6QkM7QUFBeUI7QUFBQSxNQUF6QkE7QUFBeUI7QUFBQTtBQUFBLGlEQUhuRSxJQUFJQyxHQUFKLEVBR21FO0FBQUE7QUFFbEY7O0FBRU1DLEVBQUFBLFNBQVAsQ0FBaUJDO0FBQWpCO0FBQUEsSUFBdUM7QUFDbkMsVUFBTUMsU0FBUyxHQUFHLEtBQUtDLFlBQXZCO0FBQ0EsU0FBS0EsWUFBTCxHQUFvQkYsTUFBcEI7QUFDQSxTQUFLRyxlQUFMLENBQXFCRixTQUFyQixFQUFnQ0QsTUFBaEM7QUFDSDs7QUFJRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNXSSxFQUFBQSxRQUFQLENBQWdCQztBQUFoQjtBQUFBO0FBQUE7QUFBMkI7QUFDdkIsV0FBTyxLQUFLQyxLQUFMLENBQVdDLEdBQVgsQ0FBZUYsR0FBZixJQUFzQixLQUFLQyxLQUFMLENBQVdFLEdBQVgsQ0FBZUgsR0FBZixFQUFvQkksR0FBMUMsR0FBZ0QsS0FBS1osUUFBTCxDQUFjUSxHQUFkLENBQXZEO0FBQ0g7O0FBRU9LLEVBQUFBLFFBQVIsQ0FBaUJMO0FBQWpCO0FBQUEsSUFBeUJJO0FBQXpCO0FBQUEsSUFBaUNFO0FBQWpDO0FBQUEsSUFBdUQ7QUFDbkQsU0FBS0wsS0FBTCxDQUFXTSxHQUFYLENBQWVQLEdBQWYsRUFBb0I7QUFBQ00sTUFBQUEsR0FBRDtBQUFNRixNQUFBQTtBQUFOLEtBQXBCO0FBQ0EsU0FBS0ksSUFBTCxDQUFVckIsZ0JBQVYsRUFBNEJhLEdBQTVCO0FBQ0g7O0FBRU9TLEVBQUFBLFVBQVIsQ0FBbUJUO0FBQW5CO0FBQUEsSUFBMkI7QUFDdkIsUUFBSSxLQUFLQyxLQUFMLENBQVdDLEdBQVgsQ0FBZUYsR0FBZixDQUFKLEVBQXlCO0FBQ3JCLFdBQUtULE9BQUwsQ0FBYW1CLGlCQUFiLENBQStCLEtBQUtULEtBQUwsQ0FBV0UsR0FBWCxDQUFlSCxHQUFmLEVBQW9CTSxHQUFuRDtBQUNBLFdBQUtMLEtBQUwsQ0FBV1UsTUFBWCxDQUFrQlgsR0FBbEI7QUFDQSxXQUFLUSxJQUFMLENBQVVyQixnQkFBVixFQUE0QmEsR0FBNUI7QUFDSDtBQUNKOztBQUVTWSxFQUFBQSxnQkFBVixDQUEyQlo7QUFBM0I7QUFBQSxJQUFtQztBQUMvQixRQUFJLEtBQUtDLEtBQUwsQ0FBV0MsR0FBWCxDQUFlRixHQUFmLENBQUosRUFBeUI7QUFDckIsWUFBTU0sR0FBRyxHQUFHLEtBQUtMLEtBQUwsQ0FBV0UsR0FBWCxDQUFlSCxHQUFmLEVBQW9CTSxHQUFoQztBQUNBLFdBQUtmLE9BQUwsQ0FBYW1CLGlCQUFiLENBQStCSixHQUEvQjtBQUNBQSxNQUFBQSxHQUFHLENBQUNPLE1BQUo7QUFDSDs7QUFDRCxTQUFLSixVQUFMLENBQWdCVCxHQUFoQjtBQUNIOztBQUVNYyxFQUFBQSxRQUFQLENBQWdCQztBQUFoQjtBQUFBLElBQW1DZjtBQUFuQztBQUFBLElBQTJDZ0I7QUFBM0M7QUFBQSxJQUF5REM7QUFBekQ7QUFBQSxJQUF1RUM7QUFBdkU7QUFBQSxJQUF3RjtBQUNwRjtBQUNBLFFBQUksS0FBS2pCLEtBQUwsQ0FBV0MsR0FBWCxDQUFlRixHQUFmLENBQUosRUFBeUI7QUFDckIsV0FBS0MsS0FBTCxDQUFXRSxHQUFYLENBQWVILEdBQWYsRUFBb0JNLEdBQXBCLENBQXdCTyxNQUF4QjtBQUNIOztBQUVELFVBQU1NLElBQUksR0FBRyxLQUFLNUIsT0FBTCxDQUFhNkIsZ0JBQWIsQ0FBOEJMLFNBQTlCLEVBQXlDRSxLQUF6QyxDQUFiO0FBQ0EsU0FBS1osUUFBTCxDQUFjTCxHQUFkLEVBQW1CZ0IsU0FBbkIsRUFBOEJHLElBQTlCLEVBUG9GLENBTy9DOztBQUVyQ0EsSUFBQUEsSUFBSSxDQUFDRSxJQUFMLENBQVVDLG1DQUFrQkMsT0FBNUIsRUFBcUMsTUFBTSxLQUFLbEIsUUFBTCxDQUFjTCxHQUFkLEVBQW1CZ0IsU0FBbkIsRUFBOEJHLElBQTlCLENBQTNDLEVBQ0tFLElBREwsQ0FDVUMsbUNBQWtCRSxLQUQ1QixFQUNtQyxNQUFNTixRQUFRLEVBRGpEO0FBR0FDLElBQUFBLElBQUksQ0FBQ00sR0FBTDtBQUNIOztBQTlEc0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCB7IEVjaG9Db250ZXh0IH0gZnJvbSBcIi4vRWNob0NvbnRleHRcIjtcbmltcG9ydCB7IEVjaG9UcmFuc2FjdGlvbiwgUnVuRm4sIFRyYW5zYWN0aW9uU3RhdHVzIH0gZnJvbSBcIi4vRWNob1RyYW5zYWN0aW9uXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvY2xpZW50XCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBsaWNpdGx5UmV2ZXJ0ZWQoKSB7XG4gICAgLy8gZG8gbm90aGluZyA6RFxufVxuXG5leHBvcnQgY29uc3QgUFJPUEVSVFlfVVBEQVRFRCA9IFwicHJvcGVydHlfdXBkYXRlZFwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY0VjaG9DaGFtYmVyPEMgZXh0ZW5kcyBFY2hvQ29udGV4dCwgSywgVj4gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIHByaXZhdGUgY2FjaGUgPSBuZXcgTWFwPEssIHt0eG46IEVjaG9UcmFuc2FjdGlvbiwgdmFsOiBWfT4oKTtcbiAgICBwcm90ZWN0ZWQgbWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQ7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNvbnRleHQ6IEMsIHByaXZhdGUgbG9va3VwRm46IChrZXk6IEspID0+IFYpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q2xpZW50KGNsaWVudDogTWF0cml4Q2xpZW50KSB7XG4gICAgICAgIGNvbnN0IG9sZENsaWVudCA9IHRoaXMubWF0cml4Q2xpZW50O1xuICAgICAgICB0aGlzLm1hdHJpeENsaWVudCA9IGNsaWVudDtcbiAgICAgICAgdGhpcy5vbkNsaWVudENoYW5nZWQob2xkQ2xpZW50LCBjbGllbnQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBvbkNsaWVudENoYW5nZWQob2xkQ2xpZW50OiBNYXRyaXhDbGllbnQsIG5ld0NsaWVudDogTWF0cml4Q2xpZW50KTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgYSB2YWx1ZS4gSWYgdGhlIGtleSBpcyBpbiBmbGlnaHQsIHRoZSBjYWNoZWQgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC4gSWZcbiAgICAgKiB0aGUga2V5IGlzIG5vdCBpbiBmbGlnaHQgdGhlbiB0aGUgbG9va3VwRm4gcHJvdmlkZWQgdG8gdGhpcyBjbGFzcyB3aWxsIGJlXG4gICAgICogY2FsbGVkIGluc3RlYWQuXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGxvb2sgdXAuXG4gICAgICogQHJldHVybnMgVGhlIHZhbHVlIGZvciB0aGUga2V5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZShrZXk6IEspOiBWIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuaGFzKGtleSkgPyB0aGlzLmNhY2hlLmdldChrZXkpLnZhbCA6IHRoaXMubG9va3VwRm4oa2V5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhY2hlVmFsKGtleTogSywgdmFsOiBWLCB0eG46IEVjaG9UcmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIHt0eG4sIHZhbH0pO1xuICAgICAgICB0aGlzLmVtaXQoUFJPUEVSVFlfVVBEQVRFRCwga2V5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlY2FjaGVLZXkoa2V5OiBLKSB7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZGlzb3duVHJhbnNhY3Rpb24odGhpcy5jYWNoZS5nZXQoa2V5KS50eG4pO1xuICAgICAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChQUk9QRVJUWV9VUERBVEVELCBrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG1hcmtFY2hvUmVjZWl2ZWQoa2V5OiBLKSB7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCB0eG4gPSB0aGlzLmNhY2hlLmdldChrZXkpLnR4bjtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaXNvd25UcmFuc2FjdGlvbih0eG4pO1xuICAgICAgICAgICAgdHhuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVjYWNoZUtleShrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRWYWx1ZShhdWRpdE5hbWU6IHN0cmluZywga2V5OiBLLCB0YXJnZXRWYWw6IFYsIHJ1bkZuOiBSdW5GbiwgcmV2ZXJ0Rm46IFJ1bkZuKSB7XG4gICAgICAgIC8vIENhbmNlbCBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMgZm9yIHRoZSBzYW1lIGtleVxuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZS5nZXQoa2V5KS50eG4uY2FuY2VsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdHhuID0gdGhpcy5jb250ZXh0LmJlZ2luVHJhbnNhY3Rpb24oYXVkaXROYW1lLCBydW5Gbik7XG4gICAgICAgIHRoaXMuY2FjaGVWYWwoa2V5LCB0YXJnZXRWYWwsIGN0eG4pOyAvLyBzZXQgdGhlIGNhY2hlIG5vdyBhcyBpdCB3b24ndCBiZSB1cGRhdGVkIGJ5IHRoZSAud2hlbigpIGxhZGRlciBiZWxvdy5cblxuICAgICAgICBjdHhuLndoZW4oVHJhbnNhY3Rpb25TdGF0dXMuUGVuZGluZywgKCkgPT4gdGhpcy5jYWNoZVZhbChrZXksIHRhcmdldFZhbCwgY3R4bikpXG4gICAgICAgICAgICAud2hlbihUcmFuc2FjdGlvblN0YXR1cy5FcnJvciwgKCkgPT4gcmV2ZXJ0Rm4oKSk7XG5cbiAgICAgICAgY3R4bi5ydW4oKTtcbiAgICB9XG59XG4iXX0=