osc-mcp-server
Version:
Model Context Protocol server for OSC (Open Sound Control) endpoint management
113 lines • 3.85 kB
JavaScript
"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