Index handling refinements

This commit is contained in:
Zef Hemel
2025-06-12 13:52:13 +02:00
parent 839f639913
commit 1910ffce3e
4 changed files with 45 additions and 85 deletions
+11 -22
View File
@@ -228,7 +228,7 @@ export class Client {
// Load plugs
await this.loadPlugs();
await this.clientSystem.loadSpaceScripts();
await this.clientSystem.loadScripts();
await this.initNavigator();
await this.initSync();
await this.eventHook.dispatchEvent("system:ready");
@@ -292,7 +292,7 @@ export class Client {
// A full sync just completed
if (!initialSync) {
// If this was NOT the initial sync let's check if we need to perform a space reindex
this.clientSystem.ensureSpaceIndex().catch(
this.clientSystem.ensureFullIndex().catch(
console.error,
);
} else { // initialSync
@@ -301,7 +301,7 @@ export class Client {
);
console.log("Enabling eventing on space primitives");
this.space.spacePrimitives.enablePageEvents = true;
this.clientSystem.ensureSpaceIndex().catch(
this.clientSystem.ensureFullIndex().catch(
console.error,
);
initialSync = false;
@@ -742,32 +742,24 @@ export class Client {
async updatePageListCache() {
console.log("Updating page list cache");
// **** Check if the initial sync has been completed ****
const initialSyncCompleted = await this.hasInitialSyncCompleted();
// Check if the initial sync has been completed
const initialIndexCompleted = await this.clientSystem
.hasFullIndexCompleted();
let allPages: PageMeta[] = [];
if (
initialSyncCompleted && this.clientSystem.system.loadedPlugs.has("index")
initialIndexCompleted && this.clientSystem.system.loadedPlugs.has("index")
) {
// **** Logic when initial sync IS completed AND index plug is loaded ****
console.log(
"Initial sync complete and index plug loaded, loading full page list via index.",
);
// Fetch actual indexed pages
allPages = await this.clientSystem.queryLuaObjects<PageMeta>(
"page",
{},
);
allPages = await this.clientSystem.queryLuaObjects<PageMeta>("page", {});
// Fetch aspiring pages only when using the index
const aspiringPageNames = await this.clientSystem.queryLuaObjects<
string
>(
const aspiringPageNames = await this.clientSystem.queryLuaObjects<string>(
"aspiring-page",
{
select: parseExpressionString("name"),
distinct: true,
},
{ select: parseExpressionString("name"), distinct: true },
);
// Map and push aspiring pages directly into allPages
allPages.push(
@@ -782,8 +774,6 @@ export class Client {
})),
);
} else {
// **** Logic when initial sync is NOT YET completed OR index plug isn't ready ****
// Use space.fetchPageList() directly
console.log(
"Initial sync not complete or index plug not loaded. Fetching page list directly using space.fetchPageList().",
);
@@ -791,7 +781,7 @@ export class Client {
// Call fetchPageList directly
allPages = await this.space.fetchPageList();
// Let's do some heuristic based post processing
// Let's do some heuristic-based post processing
for (const page of allPages) {
// These are _mostly_ meta pages, let's add a tag for them
if (page.name.startsWith("Library/")) {
@@ -806,7 +796,6 @@ export class Client {
"error",
);
}
// Note: Aspiring pages are not available through fetchPageList()
}
this.ui.viewDispatch({
+29 -53
View File
@@ -46,7 +46,6 @@ import type { LuaCollectionQuery } from "./space_lua/query_collection.ts";
import type { AppCommand } from "$lib/command.ts";
import { ScriptEnvironment } from "./space_script.ts";
import { SpaceLuaEnvironment } from "./space_lua.ts";
import type { ParseTree } from "@silverbulletmd/silverbullet/lib/tree";
const plugNameExtractRegex = /\/(.+)\.plug\.js$/;
const indexVersionKey = ["$indexVersion"];
@@ -69,7 +68,7 @@ export class ClientSystem {
documentEditorHook!: DocumentEditorHook;
readonly allKnownFiles = new Set<string>();
readonly spaceScriptCommands = new Map<string, AppCommand>();
readonly scriptCommands = new Map<string, AppCommand>();
scriptEnv: ScriptEnvironment = new ScriptEnvironment();
spaceLuaEnv = new SpaceLuaEnvironment();
scriptsLoaded: boolean = false;
@@ -109,7 +108,7 @@ export class ClientSystem {
// Command hook
this.commandHook = new CommandHook(
this.readOnlyMode,
this.spaceScriptCommands,
this.scriptCommands,
);
this.commandHook.on({
commandsUpdated: (commandMap) => {
@@ -201,10 +200,10 @@ export class ClientSystem {
}
}
async loadSpaceScripts() {
if (!await this.client.hasInitialSyncCompleted()) {
async loadScripts() {
if (!await this.hasFullIndexCompleted()) {
console.info(
"Not loading space scripts, since initial synca has not completed yet",
"Not loading space scripts, since initial indexing has not completed yet",
);
return;
}
@@ -212,60 +211,26 @@ export class ClientSystem {
try {
await this.spaceLuaEnv.reload(this.system);
} catch (e: any) {
console.error("Error loading space-script:", e.message);
console.error("Error loading Lua script:", e.message);
}
// Reset the space script commands
this.spaceScriptCommands.clear();
this.scriptCommands.clear();
for (const [name, command] of Object.entries(this.scriptEnv.commands)) {
this.spaceScriptCommands.set(name, command);
this.scriptCommands.set(name, command);
}
// Inject the registered events in the event hook
this.eventHook.scriptEnvironment = this.scriptEnv;
// Make scripted (slash) commands available
this.commandHook.throttledBuildAllCommands();
this.slashCommandHook.throttledBuildAllCommands();
this.scriptsLoaded = true;
}
invokeSpaceFunction(name: string, args: any[]) {
const fn = this.scriptEnv.functions[name];
if (!fn) {
throw new Error(`Function ${name} not found`);
}
return fn(...args);
}
async applyAttributeExtractors(
tags: string[],
text: string,
tree: ParseTree,
): Promise<Record<string, any>> {
let resultingAttributes: Record<string, any> = {};
for (const tag of tags) {
const extractors = this.scriptEnv.attributeExtractors[tag];
if (!extractors) {
continue;
}
for (const fn of extractors) {
const extractorResult = await fn(text, tree);
if (extractorResult) {
// Merge the attributes in
resultingAttributes = {
...resultingAttributes,
...extractorResult,
};
}
}
}
return resultingAttributes;
}
async reloadPlugsFromSpace(space: Space) {
console.log("Loading plugs");
await this.system.unloadAll();
console.log("(Re)loading plugs");
const allPlugs = await space.listPlugs();
@@ -310,33 +275,44 @@ export class ClientSystem {
private indexOngoing = false;
async ensureSpaceIndex() {
const currentIndexVersion = await this.ds.get(indexVersionKey);
async ensureFullIndex() {
const currentIndexVersion = await this.getCurrentIndexVersion();
console.info("Current space index version", currentIndexVersion);
console.info(
"Current space index version",
currentIndexVersion,
"index ongoing",
this.indexOngoing,
);
if (currentIndexVersion !== desiredIndexVersion && !this.indexOngoing) {
console.info(
"Performing a full space reindex, this could take a while...",
);
// First let's fetch all pages to make sure we have a cache of known pages
// await this.client.space.fetchPageList();
this.indexOngoing = true;
await this.system.invokeFunction("index.reindexSpace", []);
console.info("Full space index complete.");
await this.markFullSpaceIndexComplete(this.ds);
await this.markFullSpaceIndexComplete();
this.indexOngoing = false;
// Let's load space scripts again, which probably weren't loaded before
console.log(
"Now loading space scripts, custom styles and rebuilding editor state",
);
await this.loadSpaceScripts();
await this.loadScripts();
await this.client.loadCustomStyles();
this.client.rebuildEditorState();
}
}
async markFullSpaceIndexComplete(ds: DataStore) {
await ds.set(indexVersionKey, desiredIndexVersion);
private getCurrentIndexVersion() {
return this.ds.get(indexVersionKey);
}
private async markFullSpaceIndexComplete() {
await this.ds.set(indexVersionKey, desiredIndexVersion);
}
public async hasFullIndexCompleted() {
return (await this.ds.get(indexVersionKey)) === desiredIndexVersion;
}
}
+5 -1
View File
@@ -90,7 +90,11 @@ export function systemSyscalls(
return client.config.values;
},
"system.loadSpaceScripts": async () => {
await client.clientSystem.loadSpaceScripts();
console.warn("DEPRECATED: used system.loadScripts instead");
await client.clientSystem.loadScripts();
},
"system.loadScripts": async () => {
await client.clientSystem.loadScripts();
},
"system.loadSpaceStyles": async () => {
if (!client) {
-9
View File
@@ -21,15 +21,6 @@ Example:
system.invokeCommand("editor.save", {})
```
### system.invokeSpaceFunction(name, ...)
Invokes a space function by name.
Example:
```lua
local result = system.invokeSpaceFunction("customFunction", "arg1", "arg2")
print("Function result:", result)
```
## System Information
### system.listCommands()