UNPKG

osc-mcp-server

Version:

Model Context Protocol server for OSC (Open Sound Control) endpoint management

113 lines 3.85 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MessageBuffer = void 0; exports.createMessageBuffer = createMessageBuffer; class MessageBuffer { messages = []; maxSize; addressFilters; writeIndex = 0; totalMessagesReceived = 0; constructor(config) { this.maxSize = Math.max(1, config.maxSize); this.addressFilters = config.addressFilters || []; } addMessage(message) { if (this.addressFilters.length > 0) { const matchesFilter = this.addressFilters.some(filter => this.matchesAddressPattern(message.address, filter)); if (!matchesFilter) { return; } } if (this.messages.length < this.maxSize) { this.messages.push(message); } else { this.messages[this.writeIndex] = message; this.writeIndex = (this.writeIndex + 1) % this.maxSize; } this.totalMessagesReceived++; } getMessages(query = {}) { let filteredMessages = [...this.messages]; if (query.addressPattern !== undefined) { if (query.addressPattern === '') { return []; } filteredMessages = filteredMessages.filter(message => this.matchesAddressPattern(message.address, query.addressPattern)); } if (query.since) { filteredMessages = filteredMessages.filter(message => message.timestamp >= query.since); } if (query.until) { filteredMessages = filteredMessages.filter(message => message.timestamp <= query.until); } filteredMessages.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime()); if (query.limit !== undefined) { if (query.limit === 0) { return []; } if (query.limit > 0) { filteredMessages = filteredMessages.slice(0, query.limit); } } return filteredMessages; } getRecentMessages(timeWindowSeconds, limit) { const since = new Date(Date.now() - timeWindowSeconds * 1000); const query = { since }; if (limit !== undefined) { query.limit = limit; } return this.getMessages(query); } getMessageCount() { return this.messages.length; } getTotalMessagesReceived() { return this.totalMessagesReceived; } clear() { this.messages = []; this.writeIndex = 0; this.totalMessagesReceived = 0; } updateConfig(config) { if (config.maxSize !== undefined) { this.resizeBuffer(config.maxSize); } if (config.addressFilters !== undefined) { this.addressFilters = config.addressFilters; } } getConfig() { return { maxSize: this.maxSize, addressFilters: [...this.addressFilters], }; } resizeBuffer(newSize) { const newMaxSize = Math.max(1, newSize); if (newMaxSize >= this.messages.length) { this.maxSize = newMaxSize; return; } const sortedMessages = [...this.messages].sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime()); this.messages = sortedMessages.slice(0, newMaxSize); this.maxSize = newMaxSize; this.writeIndex = 0; } matchesAddressPattern(address, pattern) { const regexPattern = pattern .replace(/[.+^${}()|[\]\\]/g, '\\$&') .replace(/\*/g, '.*') .replace(/\?/g, '.'); const regex = new RegExp(`^${regexPattern}$`); return regex.test(address); } } exports.MessageBuffer = MessageBuffer; function createMessageBuffer(config) { return new MessageBuffer(config); } //# sourceMappingURL=buffer.js.map