git » sdk » main » tree

[main] / borogove / CapsRepo.hx

package borogove;

import thenshim.Promise;

@:nullSafety(StrictThreaded)
class CapsRepo {
	private final persistence: Persistence;
	private final cache: Map<String, Caps> = [];

	public function new(persistence: Persistence) {
		this.persistence = persistence;
	}

	public function add(caps: Caps) {
		persistence.storeCaps(caps);
		cache[caps.ver()] = caps;
	}

	public function getAsync(presence: Presence): Promise<Null<Caps>> {
		final ver = presence.ver;
		if (ver == null) return Promise.resolve(cast null);

		final cached = cache[ver];
		if (cached != null) return Promise.resolve(cached);

		return persistence.getCaps(ver).then(result -> {
			final caps = result;
			if (caps != null) cache[caps.ver()] = caps;
			return Promise.resolve(cast caps);
		});
	}

	public function get(presence: Presence) {
		final ver = presence.ver;
		if (ver != null) {
			final cached = cache[ver];
			if (cached != null) return cached;

			getAsync(presence); // Fetch and put in cache for later
		}

		return new Caps("", [], [], []);
	}
}