@workspace-fs/core
Version:
Multi-project workspace manager for Firesystem with support for multiple sources
56 lines (49 loc) • 1.54 kB
text/typescript
import {
TypedEventEmitter,
FileSystemEvents,
} from "@firesystem/core";
import type { Project, WorkspaceEventPayloads } from "../types";
export class EventManager {
constructor(
private events: TypedEventEmitter<WorkspaceEventPayloads>,
) {}
/**
* Setup event forwarding from project to workspace
*/
setupEventForwarding(project: Project): void {
if (!project.fs.events) return;
// Forward file system events with project context
const events = [
FileSystemEvents.FILE_READING,
FileSystemEvents.FILE_READ,
FileSystemEvents.FILE_WRITING,
FileSystemEvents.FILE_WRITTEN,
FileSystemEvents.FILE_DELETING,
FileSystemEvents.FILE_DELETED,
FileSystemEvents.DIR_CREATING,
FileSystemEvents.DIR_CREATED,
FileSystemEvents.DIR_DELETING,
FileSystemEvents.DIR_DELETED,
];
events.forEach((event) => {
project.fs.events!.on(event, (payload: any) => {
// Map to project-specific event
const projectEvent =
`project:${event.toLowerCase().replace(/_/g, ":")}` as keyof WorkspaceEventPayloads;
// Add projectId to payload
const enrichedPayload = { projectId: project.id, ...payload };
// Emit on workspace events
(this.events as any).emit(projectEvent, enrichedPayload);
});
});
}
/**
* Emit workspace event
*/
emit<K extends keyof WorkspaceEventPayloads>(
event: K,
payload: WorkspaceEventPayloads[K],
): void {
this.events.emit(event, payload);
}
}