decord/alpha/source/modules/libdiscore/DispatcherBridge.tsx

348 lines
14 KiB
TypeScript
Raw Normal View History

2026-10-09 10:00:15 +00:00
// Module ID: 18613
// Function ID: 18614
// Name: DispatcherBridge
2026-10-09 10:00:15 +00:00
// Dependencies: [5090, 5996, 6038, 13124, 502, 2118, 2086, 1085, 3, 561, 559, 1265, 584, 1999, 1255, 2]
2026-07-20 16:05:17 +00:00
2026-10-09 10:00:15 +00:00
// Module 18613 (DispatcherBridge)
import LoggerDefault from "Logger" /* 3 */;
2026-10-03 08:58:59 +00:00
import libdiscoreExperiments from "libdiscoreExperiments" /* 559 */;
import Constants from "Constants" /* 1085 */;
2026-10-09 10:00:15 +00:00
import SentryUtilsDefault from "SentryUtils" /* 1255 */;
import DevSettingsStore from "DevSettingsStore" /* 5090 */;
import RawGuildEmojiStore from "RawGuildEmojiStore" /* 5996 */;
import GuildStickersStore from "GuildStickersStore" /* 6038 */;
import NoteStore from "NoteStore" /* 13124 */;
import AuthenticationStore from "AuthenticationStore" /* 502 */;
2026-10-08 09:57:35 +00:00
import GuildRoleStore from "GuildRoleStore" /* 2118 */;
import GuildStore from "GuildStore" /* 2086 */;
2026-10-03 08:58:59 +00:00
import size from "module_2" /* 2 */;
2026-07-23 10:11:24 +00:00
2026-10-03 08:58:59 +00:00
let _instance_members_initializer_DispatcherBridge_, recordType;
const AnalyticEvents = Constants.AnalyticEvents;
const tmp7 = new LoggerDefault("DispatcherBridge");
const metroRequire = tmp7;
let items = [NoteStore, GuildStore, GuildRoleStore, RawGuildEmojiStore, GuildStickersStore];
2026-07-29 08:29:29 +00:00
let closure_7 = {
2026-07-20 16:05:17 +00:00
GUILD_MEMBER_ADD(arg0) {
2026-10-03 08:58:59 +00:00
const obj = { currentUserId: AuthenticationStore.getId() };
2026-07-20 16:05:17 +00:00
const merged = Object.assign(arg0);
return obj;
},
CONNECTION_OPEN(guilds) {
return { guilds: guilds.guilds, unavailableGuilds: guilds.unavailableGuilds };
},
CACHE_LOADED(guilds) {
return { guilds: guilds.guilds };
},
CACHE_LOADED_LAZY(guilds) {
return { guilds: guilds.guilds };
},
BACKGROUND_SYNC(guilds) {
return { guilds: guilds.guilds };
}
};
const set = new Set(["libdiscore", "typescript-libdiscore-dual-read"]);
2026-07-29 08:29:29 +00:00
_instance_members_initializer_DispatcherBridge_ = function() {
this.tokenToStore = new Map();
this.disabledFromFatalError = false;
2026-10-03 08:58:59 +00:00
new Map();
2026-07-29 08:29:29 +00:00
};
class DispatcherBridge {
2026-10-03 08:58:59 +00:00
constructor(items) {
let actionHandler;
const obj = Object.create(new.target.prototype);
const tmp2 = _instance_members_initializer_DispatcherBridge_();
if (0 !== items.length) {
let tmp33 = obj;
let tmp34 = actionHandler;
const FLUX_API = obj(actionHandler[9]).FLUX_API;
2026-07-29 08:29:29 +00:00
if (null != FLUX_API) {
try {
2026-07-20 16:05:17 +00:00
items = [];
2026-10-03 08:58:59 +00:00
let iter = items[Symbol.iterator]();
const nextResult = iter.next();
2026-07-29 08:29:29 +00:00
while (iter !== undefined) {
2026-10-03 08:58:59 +00:00
let name = nextResult.getName();
let result = nextResult.connectWithLibdiscore(FLUX_API);
let tokenToStore = obj.tokenToStore;
let result1 = tokenToStore.set(result, nextResult);
let _HermesInternal = HermesInternal;
let str6 = "";
let str7 = " => [token: ";
let str8 = ", mode: ";
let str9 = "]";
let arr = items.push("" + name + " => [token: " + result + ", mode: " + nextResult.getMode() + "]");
2026-07-29 08:29:29 +00:00
continue;
2026-07-20 16:05:17 +00:00
}
2026-10-03 08:58:59 +00:00
const _HermesInternal2 = HermesInternal;
logger.info("Connected " + length + " store(s), mapping: " + items.join(", ") + ".");
const registeredActionTypes = FLUX_API.getRegisteredActionTypes();
const _HermesInternal3 = HermesInternal;
let tmp20 = length2;
logger.info("Registering " + registeredActionTypes.length + " bridged action(s): " + registeredActionTypes.join(", ") + ".");
actionHandler = function actionHandler(type) {
2026-10-03 08:58:59 +00:00
let metrics;
let storeResults;
2026-07-29 08:29:29 +00:00
if (!obj.disabledFromFatalError) {
2026-10-03 08:58:59 +00:00
let json;
2026-07-20 16:05:17 +00:00
const _performance = performance;
const nowResult = performance.now();
if (null != closure_1_7[type.type]) {
2026-07-20 16:05:17 +00:00
const _JSON2 = JSON;
const obj2 = { type: type.type };
2026-10-03 08:58:59 +00:00
const merged = Object.assign(tmp4(type));
json = stringify(obj2);
2026-07-20 16:05:17 +00:00
} else {
const _JSON = JSON;
json = JSON.stringify(type);
2026-07-20 16:05:17 +00:00
}
const _performance2 = performance;
2026-10-03 08:58:59 +00:00
const obj3 = { kind: "json_stringify_action", durationMillis: performance.now() - nowResult };
2026-07-29 08:29:29 +00:00
const TelemetryExperiment = obj(actionHandler[10]).TelemetryExperiment;
2026-07-20 16:05:17 +00:00
const shouldCollectMetricsResult = TelemetryExperiment.shouldCollectMetrics();
const iter = FLUX_API.dispatchAction(json, shouldCollectMetricsResult);
if (iter.ok) {
const _performance3 = performance;
const diff = performance.now() - nowResult;
2026-07-29 08:29:29 +00:00
({ metrics, storeResults } = iter.value);
2026-07-20 16:05:17 +00:00
const items = [];
2026-07-29 08:29:29 +00:00
for (const item10056 of storeResults) {
2026-10-03 08:58:59 +00:00
let tmp20 = item10056;
2026-07-29 08:29:29 +00:00
if (null != item10056.error) {
2026-10-03 08:58:59 +00:00
let handleStoreErrorResult = obj.handleStoreError(tmp20, type.type);
2026-07-29 08:29:29 +00:00
} else {
2026-10-03 08:58:59 +00:00
let arr = items.push(tmp20);
2026-07-29 08:29:29 +00:00
}
continue;
}
function _loop(iter2) {
type = iter2;
obj.withStoreToken(iter2.storeToken, type.type, (applyChanges) => {
2026-10-03 08:58:59 +00:00
applyChanges.applyChanges(databaseChanges.databaseChanges);
2026-07-29 08:29:29 +00:00
});
2026-07-20 16:05:17 +00:00
}
2026-07-29 08:29:29 +00:00
const iter2 = items[Symbol.iterator]();
while (iter2 !== undefined) {
let _loopResult = _loop(iter2.next());
continue;
2026-07-20 16:05:17 +00:00
}
2026-07-29 08:29:29 +00:00
for (const item10082 of items) {
2026-10-03 08:58:59 +00:00
let withStoreTokenResult = obj.withStoreToken(item10082.storeToken, type.type, (doEmitChanges) => {
doEmitChanges.doEmitChanges(type);
2026-07-29 08:29:29 +00:00
});
continue;
2026-07-20 16:05:17 +00:00
}
if (null != metrics) {
if (shouldCollectMetricsResult) {
const items1 = [obj3];
2026-10-03 08:58:59 +00:00
HermesBuiltin.arraySpread(items1, metrics.timings, 1);
2026-07-29 08:29:29 +00:00
if (_default.get("libdiscore_verbose_telemetry_logging")) {
2026-07-23 10:11:24 +00:00
let mapped = items1.map((kind) => " - " + kind.kind + ": " + kind.durationMillis + "ms");
const items2 = ["Timings", mapped.join("\n")];
2026-07-20 16:05:17 +00:00
const items3 = [items2, , ];
const mutations = metrics.mutations;
2026-10-03 08:58:59 +00:00
const mapped1 = mutations.map((recordType) => {
recordType = recordType.recordType;
const entries = Object.entries(recordType.metrics);
const found = entries.filter((item) => {
2026-10-03 08:58:59 +00:00
let tmp;
[, tmp] = item;
2026-07-20 16:05:17 +00:00
return 0 !== tmp;
});
const mapped = found.map((item) => {
2026-10-03 08:58:59 +00:00
let tmp;
let tmp2;
[tmp, tmp2] = item;
2026-07-20 16:05:17 +00:00
return " - " + tmp + ": " + tmp2;
});
2026-10-03 08:58:59 +00:00
return " * Record Type: " + recordType + "\n" + mapped.join("\n");
2026-07-20 16:05:17 +00:00
});
2026-07-23 10:11:24 +00:00
const items4 = ["Mutations", mapped1.join("\n")];
2026-07-20 16:05:17 +00:00
items3[1] = items4;
const memory = metrics.memory;
2026-10-03 08:58:59 +00:00
const mapped2 = memory.map((recordType) => {
recordType = recordType.recordType;
const entries = Object.entries(recordType.statistics);
const mapped = entries.map((item) => {
2026-10-03 08:58:59 +00:00
let tmp;
let tmp2;
[tmp, tmp2] = item;
2026-07-20 16:05:17 +00:00
return " - " + tmp + ": " + JSON.stringify(tmp2);
});
2026-10-03 08:58:59 +00:00
return " * Record Type: " + recordType + "\n" + mapped.join("\n");
2026-07-20 16:05:17 +00:00
});
2026-07-23 10:11:24 +00:00
const items5 = ["Memory Usage", mapped2.join("\n")];
2026-07-20 16:05:17 +00:00
items3[2] = items5;
let found = items3.filter((item) => {
2026-10-03 08:58:59 +00:00
let arr;
[, arr] = item;
2026-07-20 16:05:17 +00:00
return arr.length > 0;
});
const mapped3 = found.map((item) => {
2026-10-03 08:58:59 +00:00
let tmp;
let tmp2;
[tmp, tmp2] = item;
2026-07-20 16:05:17 +00:00
return "" + tmp + ":\n" + tmp2;
});
const _HermesInternal = HermesInternal;
logger.info("Handling action " + type.type + " took " + diff + "ms\n" + mapped3.join("\n\n"));
2026-07-20 16:05:17 +00:00
}
const _JSON3 = JSON;
2026-10-03 08:58:59 +00:00
const obj4 = { action_type: type.type, total_duration_millis: diff, timings: JSON.stringify(items1), mutations: JSON.stringify(metrics.mutations), memory_usage: JSON.stringify(metrics.memory) };
const track = FLUX_API(actionHandler[11]).track;
const LIBDISCORE_DISPATCH_BRIDGE_TELEMETRY = constants.LIBDISCORE_DISPATCH_BRIDGE_TELEMETRY;
FLUX_API(actionHandler[11]);
2026-07-20 16:05:17 +00:00
const _JSON4 = JSON;
const _JSON5 = JSON;
2026-10-03 08:58:59 +00:00
track(LIBDISCORE_DISPATCH_BRIDGE_TELEMETRY, obj4);
2026-07-29 08:29:29 +00:00
const TelemetryExperiment2 = obj(actionHandler[10]).TelemetryExperiment;
2026-07-20 16:05:17 +00:00
TelemetryExperiment2.didEmit();
}
}
} else {
obj.handleFatalError(iter.error, type.type);
2026-07-20 16:05:17 +00:00
}
}
};
2026-10-03 08:58:59 +00:00
let tmp23 = actionHandler;
let tmp24 = FLUX_API(actionHandler[12]);
const _Object = Object;
const register = tmp24.register;
const fromEntriesResult = Object.fromEntries(registeredActionTypes.map((item) => {
const items = [item, actionHandler];
2026-07-20 16:05:17 +00:00
return items;
}));
2026-10-03 08:58:59 +00:00
register("LibDiscoreDispatcherBridge", fromEntriesResult, () => {
2026-07-20 16:05:17 +00:00
2026-10-03 08:58:59 +00:00
}, obj(actionHandler[12]).DispatchBand.Database);
const _default = obj(actionHandler[13]).default;
_default.addChangeListener(() => {
2026-07-20 16:05:17 +00:00
if ("active" !== _default.getState()) {
2026-10-03 08:58:59 +00:00
let tmp = globalThis;
2026-07-23 10:11:24 +00:00
let _Date = Date;
2026-10-03 08:58:59 +00:00
let closure_0 = Date.now();
2026-07-20 16:05:17 +00:00
const result = FLUX_API.flushReplicationStates();
2026-07-29 08:29:29 +00:00
if (result != null) {
result.then((result) => {
2026-10-03 08:58:59 +00:00
const tmp = result;
if (tmp) {
2026-07-20 16:05:17 +00:00
const _Date = Date;
const _HermesInternal = HermesInternal;
logger.info("Successfully flushed replication states in " + Date.now() - closure_0 + "ms");
2026-07-20 16:05:17 +00:00
}
});
}
}
});
2026-10-03 08:58:59 +00:00
} catch (tmp30) {
logger.error("Failed to initialize the dispatcher bridge", tmp30);
2026-07-20 16:05:17 +00:00
}
2026-07-29 08:29:29 +00:00
} else {
2026-10-03 08:58:59 +00:00
logger.info("Not initializing DispatcherBridge, because kvStoreApi is unavailable.");
2026-07-20 16:05:17 +00:00
}
}
2026-10-03 08:58:59 +00:00
return obj;
2026-07-20 16:05:17 +00:00
}
2026-10-03 08:58:59 +00:00
handleFatalError(error, type) {
const self = this;
error = new Error(error);
const result = this.hasAnyAuthoritativeStore();
logger.error("Fatal dispatch error for action", type, "hasAuthoritativeStore:", result, error);
const obj2 = SentryUtilsDefault;
const obj3 = { extra: { actionType: type, hasAuthoritativeStore: result }, tags: { source: "libdiscore", errorKind: "fatal_dispatch" } };
obj2.captureException(error, obj3);
const obj = logger;
if (result) {
const obj4 = libdiscoreExperiments;
const result1 = obj4.clearLibdiscoreExperimentCache();
throw error;
} else {
obj.warn("Disabling DispatcherBridge until restart");
self.disabledFromFatalError = true;
const tokenToStore = self.tokenToStore;
const values = tokenToStore.values();
for (const item10040 of values) {
let result2 = item10040.disableDualReadValidation();
continue;
}
2026-07-20 16:05:17 +00:00
}
2026-07-29 08:29:29 +00:00
}
2026-10-03 08:58:59 +00:00
handleStoreError(storeToken, type) {
const tokenToStore = this.tokenToStore;
const value = tokenToStore.get(storeToken.storeToken);
let name;
if (value != null) {
name = value.getName();
}
if (name == null) {
const _HermesInternal = HermesInternal;
name = "unknown(token:" + storeToken.storeToken + ")";
2026-07-20 16:05:17 +00:00
}
2026-10-03 08:58:59 +00:00
let mode;
2026-07-29 08:29:29 +00:00
if (value != null) {
2026-10-03 08:58:59 +00:00
mode = value.getMode();
}
let str3 = storeToken.error;
const _Error = Error;
if (str3 == null) {
str3 = "unknown store error";
}
const _Error1 = new _Error(str3);
logger.error("Store", name, "failed to handle action", type, "mode:", mode, _Error1);
const obj = { extra: { actionType: type, storeName: name, storeMode: mode }, tags: { source: "libdiscore", errorKind: "store_dispatch" } };
const obj3 = SentryUtilsDefault;
obj3.captureException(_Error1, obj);
const obj2 = logger;
if ("typescript-libdiscore-dual-read" !== mode) {
let error;
if ("libdiscore" === mode) {
const obj5 = libdiscoreExperiments;
const result = obj5.clearLibdiscoreExperimentCache();
error = _Error1;
} else {
const _Error2 = Error;
const _HermesInternal3 = HermesInternal;
const self = this;
const self2 = this;
error = new Error("unexpected storeMode '" + mode + "' for store " + name);
}
throw error;
} else {
const _HermesInternal2 = HermesInternal;
obj2.warn("Store: " + name + " had unexpected error in Rust implementation, disabling moving forward");
if (value != null) {
const result1 = value.disableDualReadValidation();
}
2026-07-20 16:05:17 +00:00
}
2026-07-29 08:29:29 +00:00
}
2026-10-03 08:58:59 +00:00
withStoreToken(storeToken, type, fn) {
const tokenToStore = this.tokenToStore;
const value = tokenToStore.get(storeToken);
if (null == value) {
logger.warn("When dispatching action", type, "we got a store token", storeToken, "that is unknown");
} else {
fn(value);
}
2026-07-29 08:29:29 +00:00
}
2026-10-03 08:58:59 +00:00
hasAnyAuthoritativeStore() {
const tokenToStore = this.tokenToStore;
const values = tokenToStore.values();
const iter = values[Symbol.iterator]();
const nextResult = iter.next();
while (iter !== undefined) {
if ("libdiscore" === nextResult.getMode()) {
iter.return();
let flag = true;
return true;
}
2026-07-20 16:05:17 +00:00
}
2026-10-03 08:58:59 +00:00
return false;
2026-07-29 08:29:29 +00:00
}
2026-10-03 08:58:59 +00:00
}
const prototype = DispatcherBridge.prototype;
2026-07-29 08:29:29 +00:00
const dispatcherBridge = new DispatcherBridge(items.filter((getMode) => set.has(getMode.getMode())));
let result = size.fileFinishedImporting("modules/libdiscore/DispatcherBridge.tsx");
2026-07-20 16:05:17 +00:00
2026-07-29 08:29:29 +00:00
export default dispatcherBridge;