UNPKG

@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
"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