one
Version:
One is a React framework for web, iOS, and Android apps.
99 lines (98 loc) • 2.85 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var syncStore_exports = {};
__export(syncStore_exports, {
SYNC_STATE_BRAND: () => SYNC_STATE_BRAND,
SYNC_STATE_ID_KEY: () => SYNC_STATE_ID_KEY,
createSyncState: () => createSyncState,
getSyncStateId: () => getSyncStateId,
isSyncState: () => isSyncState,
publishNativeSyncState: () => publishNativeSyncState
});
module.exports = __toCommonJS(syncStore_exports);
var import_syncNative = require("./syncNative.cjs");
const SYNC_STATE_ID_KEY = "__one_sync_state_id__";
const SYNC_STATE_BRAND = "__one_sync_state__";
function isSyncState(value) {
if (value == null || typeof value !== "object") return false;
const obj = value;
return obj[SYNC_STATE_BRAND] === true && typeof obj[SYNC_STATE_ID_KEY] === "number" && obj[SYNC_STATE_ID_KEY] !== 0;
}
function getSyncStateId(state) {
if (!state) return void 0;
return state[SYNC_STATE_ID_KEY];
}
const PUBLISH_NATIVE = /* @__PURE__ */ Symbol("publishNative");
function publishNativeSyncState(state) {
;
state?.[PUBLISH_NATIVE]();
}
function createSyncState(initial) {
const host = (0, import_syncNative.getNativeSyncFactory)().create(initial);
let onChange = null;
const listeners = /* @__PURE__ */ new Set();
let published = host.get();
const publish = (next) => {
if (Object.is(published, next)) return;
published = next;
for (const listener of [...listeners]) listener(next);
};
const state = {
get value() {
return host.get();
},
set value(next) {
state.set(next);
},
get() {
return host.get();
},
set(next) {
if (!Object.is(host.get(), next)) host.set(next);
publish(next);
},
get onChange() {
return onChange;
},
set onChange(next) {
onChange = next ?? null;
host.setOnChange(onChange);
},
subscribe(listener) {
listeners.add(listener);
return () => {
listeners.delete(listener);
};
},
release() {
listeners.clear();
onChange = null;
host.release();
},
getSnapshot() {
return host.get();
},
[SYNC_STATE_BRAND]: true,
[SYNC_STATE_ID_KEY]: host.id,
[PUBLISH_NATIVE]: () => publish(host.get())
};
return state;
}