@microsoft/teams.apps
Version:
<p> <a href="https://www.npmjs.com/package/@microsoft/teams.apps" target="_blank"> <img src="https://img.shields.io/npm/v/@microsoft/teams.apps/latest" /> </a> <a href="https://www.npmjs.com/package/@microsoft/teams.apps?activeTab=code
122 lines • 6.34 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TurnState = exports.TurnStateSealedError = void 0;
/**
* Error thrown when code accesses turn state after its activity turn has ended.
*/
class TurnStateSealedError extends Error {
constructor() {
super('Turn state is no longer available because the activity turn has completed.');
this.name = 'TurnStateSealedError';
}
}
exports.TurnStateSealedError = TurnStateSealedError;
/**
* Mutable key/value state scoped to one activity turn.
*
* Values are persisted as JSON at the end of the turn when the state is dirty.
* Instances are not thread-safe and must not be retained after the handler completes.
*/
class TurnState {
data;
dirty = false;
sealed = false;
/**
* Creates turn state from an optional persisted snapshot.
* @param data Initial values. Loading values does not mark the state dirty.
*/
constructor(data = {}) {
this.data = new Map(Object.entries(data));
}
/** Whether this scope changed during the current turn. */
get isDirty() {
return this.dirty;
}
/** Whether this scope contains no values. */
get isEmpty() {
return this.data.size === 0;
}
/** Whether this scope has been sealed after turn processing. */
get isSealed() {
return this.sealed;
}
/** Number of values in this scope. */
get size() {
return this.data.size;
}
/**
* Reads a value from this scope.
*
* Reads never mark state dirty. Call `set` after changing mutable values so
* the scope is persisted at the end of the turn.
* @param key Stable key used to persist the value.
*/
get(key) {
this.ensureActive();
return this.data.get(key);
}
/**
* Writes a value and marks this scope dirty.
*
* Values must be JSON-serializable when the turn is saved.
* @param key Stable key used to persist the value.
* @param value Value to store.
*/
set(key, value) {
this.ensureActive();
this.data.set(key, value);
this.dirty = true;
return this;
}
/**
* Removes a value. The scope is marked dirty only when the key existed.
* @param key Key to remove.
*/
delete(key) {
this.ensureActive();
const deleted = this.data.delete(key);
this.dirty ||= deleted;
return deleted;
}
/**
* Tests whether a key exists in this scope.
* @param key Key to test.
*/
has(key) {
this.ensureActive();
return this.data.has(key);
}
/** Removes every value. An already-empty scope remains clean. */
clear() {
this.ensureActive();
if (this.data.size === 0) {
return;
}
this.data.clear();
this.dirty = true;
}
/**
* Returns a shallow record snapshot for persistence.
*
* This remains available after sealing so storage adapters can finish a save.
*/
toRecord() {
return Object.fromEntries(this.data);
}
/** Seals this scope so handlers cannot access it after the turn completes. */
seal() {
this.sealed = true;
}
/** @internal Marks this scope as synchronized with its backing store. */
markClean() {
this.ensureActive();
this.dirty = false;
}
ensureActive() {
if (this.sealed) {
throw new TurnStateSealedError();
}
}
}
exports.TurnState = TurnState;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVybi1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGF0ZS90dXJuLXN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsTUFBYSxvQkFBcUIsU0FBUSxLQUFLO0lBQzdDO1FBQ0UsS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLElBQUksR0FBRyxzQkFBc0IsQ0FBQztJQUNyQyxDQUFDO0NBQ0Y7QUFMRCxvREFLQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSxTQUFTO0lBQ0gsSUFBSSxDQUF1QjtJQUNwQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2QsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUV2Qjs7O09BR0c7SUFDSCxZQUFZLE9BQTBDLEVBQUU7UUFDdEQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELDZDQUE2QztJQUM3QyxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsc0NBQXNDO0lBQ3RDLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEdBQUcsQ0FBYyxHQUFXO1FBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBa0IsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsR0FBRyxDQUFJLEdBQVcsRUFBRSxLQUFRO1FBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEdBQVc7UUFDaEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDO1FBQ3ZCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHLENBQUMsR0FBVztRQUNiLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsS0FBSztRQUNILElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVE7UUFDTixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsSUFBSTtRQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsU0FBUztRQUNQLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbEhELDhCQWtIQyJ9