@assistant-ui/react
Version:
TypeScript/React library for AI Chat
98 lines • 2.93 kB
JavaScript
let cachedHook;
const getHook = () => {
if (cachedHook) {
return cachedHook;
}
const createHook = () => ({
apis: new Map(),
nextId: 0,
listeners: new Set(),
});
if (typeof window === "undefined") {
cachedHook = createHook();
return cachedHook;
}
const existingHook = window.__ASSISTANT_UI_DEVTOOLS_HOOK__;
if (existingHook) {
cachedHook = existingHook;
return existingHook;
}
const newHook = createHook();
window.__ASSISTANT_UI_DEVTOOLS_HOOK__ = newHook;
cachedHook = newHook;
return newHook;
};
export class DevToolsHooks {
static subscribe(listener) {
const hook = getHook();
hook.listeners.add(listener);
return () => {
hook.listeners.delete(listener);
};
}
static clearEventLogs(apiId) {
const hook = getHook();
const entry = hook.apis.get(apiId);
if (!entry)
return;
entry.logs = [];
DevToolsHooks.notifyListeners(apiId);
}
static getApis() {
return getHook().apis;
}
static notifyListeners(apiId) {
const hook = getHook();
hook.listeners.forEach((listener) => listener(apiId));
}
}
export class DevToolsProviderApi {
static MAX_EVENT_LOGS_PER_API = 200;
static register(api) {
const hook = getHook();
for (const entry of hook.apis.values()) {
if (entry.api === api) {
return () => { };
}
}
const apiId = hook.nextId++;
const entry = {
api,
logs: [],
};
const eventUnsubscribe = api.on?.("*", (e) => {
const entry = hook.apis.get(apiId);
if (!entry)
return;
entry.logs.push({
time: new Date(),
event: e.event,
data: e.payload,
});
if (entry.logs.length > DevToolsProviderApi.MAX_EVENT_LOGS_PER_API) {
entry.logs = entry.logs.slice(-DevToolsProviderApi.MAX_EVENT_LOGS_PER_API);
}
DevToolsProviderApi.notifyListeners(apiId);
});
const stateUnsubscribe = api.subscribe?.(() => {
DevToolsProviderApi.notifyListeners(apiId);
});
hook.apis.set(apiId, entry);
DevToolsProviderApi.notifyListeners(apiId);
return () => {
const hook = getHook();
const entry = hook.apis.get(apiId);
if (!entry)
return;
eventUnsubscribe?.();
stateUnsubscribe?.();
hook.apis.delete(apiId);
DevToolsProviderApi.notifyListeners(apiId);
};
}
static notifyListeners(apiId) {
const hook = getHook();
hook.listeners.forEach((listener) => listener(apiId));
}
}
//# sourceMappingURL=DevToolsHooks.js.map