resig.js
Version:
Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.
219 lines • 19.1 kB
JavaScript
;
/**
* Signal-Σ Streaming Infrastructure
* Advanced streaming, real-time collaboration, and AI integration
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.createDistinctStream = exports.createSampledStream = exports.createAccumulatorStream = exports.switchStream = exports.combineStreams = exports.mergeStreams = exports.createTransformedStream = exports.createFilteredStream = exports.createDebouncedStream = exports.createThrottledStream = exports.createPersistentStream = exports.createAIEnhancedSignal = exports.createCollaborativeSignal = exports.createBatchAITransformer = exports.composeAITransformers = exports.createVisionModel = exports.createLLMTransformer = exports.MultiModalTransformer = exports.MockAITransformer = exports.OpenAITransformer = exports.BaseAITransformer = exports.indexedDBEventStore = exports.eventSourcedGCounter = exports.eventSourcedORSet = exports.createEventSourcedCRDT = exports.IndexedDBEventStore = exports.MemoryEventStore = exports.createWebRTCBroadcast = exports.createWebRTCStream = exports.BroadcastChannelSignaling = exports.WebRTCPeer = exports.streamFromIterable = exports.streamFrom = exports.createStreamingSignal = void 0;
// Stream Coalgebra System
var coalgebra_1 = require("./coalgebra");
Object.defineProperty(exports, "createStreamingSignal", { enumerable: true, get: function () { return coalgebra_1.createStreamingSignal; } });
Object.defineProperty(exports, "streamFrom", { enumerable: true, get: function () { return coalgebra_1.streamFrom; } });
Object.defineProperty(exports, "streamFromIterable", { enumerable: true, get: function () { return coalgebra_1.streamFromIterable; } });
// WebRTC Streaming
var webrtc_1 = require("./webrtc");
Object.defineProperty(exports, "WebRTCPeer", { enumerable: true, get: function () { return webrtc_1.WebRTCPeer; } });
Object.defineProperty(exports, "BroadcastChannelSignaling", { enumerable: true, get: function () { return webrtc_1.BroadcastChannelSignaling; } });
Object.defineProperty(exports, "createWebRTCStream", { enumerable: true, get: function () { return webrtc_1.createWebRTCStream; } });
Object.defineProperty(exports, "createWebRTCBroadcast", { enumerable: true, get: function () { return webrtc_1.createWebRTCBroadcast; } });
// Event Sourcing with CRDTs
var event_sourcing_1 = require("./event-sourcing");
Object.defineProperty(exports, "MemoryEventStore", { enumerable: true, get: function () { return event_sourcing_1.MemoryEventStore; } });
Object.defineProperty(exports, "IndexedDBEventStore", { enumerable: true, get: function () { return event_sourcing_1.IndexedDBEventStore; } });
Object.defineProperty(exports, "createEventSourcedCRDT", { enumerable: true, get: function () { return event_sourcing_1.createEventSourcedCRDT; } });
Object.defineProperty(exports, "eventSourcedORSet", { enumerable: true, get: function () { return event_sourcing_1.eventSourcedORSet; } });
Object.defineProperty(exports, "eventSourcedGCounter", { enumerable: true, get: function () { return event_sourcing_1.eventSourcedGCounter; } });
Object.defineProperty(exports, "indexedDBEventStore", { enumerable: true, get: function () { return event_sourcing_1.indexedDBEventStore; } });
// AI Transformer Interface
var ai_transformer_1 = require("./ai-transformer");
Object.defineProperty(exports, "BaseAITransformer", { enumerable: true, get: function () { return ai_transformer_1.BaseAITransformer; } });
Object.defineProperty(exports, "OpenAITransformer", { enumerable: true, get: function () { return ai_transformer_1.OpenAITransformer; } });
Object.defineProperty(exports, "MockAITransformer", { enumerable: true, get: function () { return ai_transformer_1.MockAITransformer; } });
Object.defineProperty(exports, "MultiModalTransformer", { enumerable: true, get: function () { return ai_transformer_1.MultiModalTransformer; } });
Object.defineProperty(exports, "createLLMTransformer", { enumerable: true, get: function () { return ai_transformer_1.createLLMTransformer; } });
Object.defineProperty(exports, "createVisionModel", { enumerable: true, get: function () { return ai_transformer_1.createVisionModel; } });
Object.defineProperty(exports, "composeAITransformers", { enumerable: true, get: function () { return ai_transformer_1.composeAITransformers; } });
Object.defineProperty(exports, "createBatchAITransformer", { enumerable: true, get: function () { return ai_transformer_1.createBatchAITransformer; } });
// Convenience functions for common use cases
const ai_transformer_2 = require("./ai-transformer");
const coalgebra_2 = require("./coalgebra");
const webrtc_2 = require("./webrtc");
/**
* Create a real-time collaborative signal using WebRTC
*/
const createCollaborativeSignal = (initialValue, peerId, config) => {
const stream = (0, webrtc_2.createWebRTCStream)(peerId, config);
stream._set(initialValue);
return stream;
};
exports.createCollaborativeSignal = createCollaborativeSignal;
/**
* Create an AI-enhanced signal that processes input through an AI model
*/
const createAIEnhancedSignal = (initialValue, aiModel = 'mock', config) => {
const input = (0, coalgebra_2.createStreamingSignal)(initialValue);
const ai = (0, ai_transformer_2.createLLMTransformer)(aiModel, config);
const output = ai.transform(input);
return {
input,
output,
confidence: ai.confidence(),
tokens: ai.tokens(),
isProcessing: ai.isProcessing(),
setInput: (value) => input._set(value),
};
};
exports.createAIEnhancedSignal = createAIEnhancedSignal;
/**
* Create a streaming signal with built-in persistence
*/
const createPersistentStream = (initialValue, storageKey) => {
const stream = (0, coalgebra_2.createStreamingSignal)(initialValue);
// Load from localStorage on creation
try {
const stored = localStorage.getItem(storageKey);
if (stored) {
stream._set(JSON.parse(stored));
}
}
catch (error) {
console.warn('Failed to load from localStorage:', error);
}
// Save to localStorage on changes
stream.subscribe((value) => {
try {
localStorage.setItem(storageKey, JSON.stringify(value));
}
catch (error) {
console.warn('Failed to save to localStorage:', error);
}
});
return stream;
};
exports.createPersistentStream = createPersistentStream;
/**
* Create a throttled streaming signal for performance optimization
*/
const createThrottledStream = (initialValue, throttleMs = 100) => {
return (0, coalgebra_2.createStreamingSignal)(initialValue).throttle(throttleMs);
};
exports.createThrottledStream = createThrottledStream;
/**
* Create a debounced streaming signal for user input
*/
const createDebouncedStream = (initialValue, debounceMs = 300) => {
return (0, coalgebra_2.createStreamingSignal)(initialValue).debounce(debounceMs);
};
exports.createDebouncedStream = createDebouncedStream;
/**
* Create a filtered streaming signal
*/
const createFilteredStream = (initialValue, predicate) => {
return (0, coalgebra_2.createStreamingSignal)(initialValue).filter(predicate);
};
exports.createFilteredStream = createFilteredStream;
/**
* Create a transformed streaming signal
*/
const createTransformedStream = (initialValue, transformer) => {
return (0, coalgebra_2.createStreamingSignal)(initialValue).transform(transformer);
};
exports.createTransformedStream = createTransformedStream;
/**
* Merge multiple streaming signals into one
*/
const mergeStreams = (...streams) => {
if (streams.length === 0) {
throw new Error('Cannot merge empty array of streams');
}
return streams.reduce((merged, stream) => merged.merge(stream));
};
exports.mergeStreams = mergeStreams;
/**
* Create a signal that combines multiple streams
*/
const combineStreams = (streams) => {
const keys = Object.keys(streams);
const combined = (0, coalgebra_2.createStreamingSignal)({});
// Initialize with current values
const initialValue = {};
keys.forEach((key) => {
initialValue[key] = streams[key].value();
});
combined._set(initialValue);
// Subscribe to all streams
keys.forEach((key) => {
streams[key].subscribe((value) => {
const currentValue = combined.value();
combined._set({ ...currentValue, [key]: value });
});
});
return combined;
};
exports.combineStreams = combineStreams;
/**
* Create a signal that switches between different streams based on a condition
*/
const switchStream = (condition, trueStream, falseStream) => {
const switched = (0, coalgebra_2.createStreamingSignal)(condition.value() ? trueStream.value() : falseStream.value());
condition.subscribe((isTrue) => {
const sourceStream = isTrue ? trueStream : falseStream;
switched._set(sourceStream.value());
});
trueStream.subscribe((value) => {
if (condition.value()) {
switched._set(value);
}
});
falseStream.subscribe((value) => {
if (!condition.value()) {
switched._set(value);
}
});
return switched;
};
exports.switchStream = switchStream;
/**
* Create a signal that accumulates values over time
*/
const createAccumulatorStream = (initialValue, initialAccumulator, accumulator) => {
const source = (0, coalgebra_2.createStreamingSignal)(initialValue);
const accumulated = (0, coalgebra_2.createStreamingSignal)(initialAccumulator);
source.subscribe((value) => {
const currentAcc = accumulated.value();
const newAcc = accumulator(currentAcc, value);
accumulated._set(newAcc);
});
// Add method to add values to the source
accumulated.add = (value) => source._set(value);
return accumulated;
};
exports.createAccumulatorStream = createAccumulatorStream;
/**
* Create a signal that samples another signal at regular intervals
*/
const createSampledStream = (source, intervalMs) => {
const sampled = (0, coalgebra_2.createStreamingSignal)(source.value());
setInterval(() => {
sampled._set(source.value());
}, intervalMs);
return sampled;
};
exports.createSampledStream = createSampledStream;
/**
* Create a signal that only emits distinct values
*/
const createDistinctStream = (source, compareFn) => {
const distinct = (0, coalgebra_2.createStreamingSignal)(source.value());
let lastValue = source.value();
const isEqual = compareFn || ((a, b) => a === b);
source.subscribe((value) => {
if (!isEqual(value, lastValue)) {
lastValue = value;
distinct._set(value);
}
});
return distinct;
};
exports.createDistinctStream = createDistinctStream;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RyZWFtaW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILDBCQUEwQjtBQUMxQix5Q0FRcUI7QUFIbkIsa0hBQUEscUJBQXFCLE9BQUE7QUFDckIsdUdBQUEsVUFBVSxPQUFBO0FBQ1YsK0dBQUEsa0JBQWtCLE9BQUE7QUFHcEIsbUJBQW1CO0FBQ25CLG1DQVFrQjtBQUpoQixvR0FBQSxVQUFVLE9BQUE7QUFDVixtSEFBQSx5QkFBeUIsT0FBQTtBQUN6Qiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQiwrR0FBQSxxQkFBcUIsT0FBQTtBQUd2Qiw0QkFBNEI7QUFDNUIsbURBYTBCO0FBTnhCLGtIQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHFIQUFBLG1CQUFtQixPQUFBO0FBQ25CLHdIQUFBLHNCQUFzQixPQUFBO0FBQ3RCLG1IQUFBLGlCQUFpQixPQUFBO0FBQ2pCLHNIQUFBLG9CQUFvQixPQUFBO0FBQ3BCLHFIQUFBLG1CQUFtQixPQUFBO0FBR3JCLDJCQUEyQjtBQUMzQixtREFjMEI7QUFSeEIsbUhBQUEsaUJBQWlCLE9BQUE7QUFDakIsbUhBQUEsaUJBQWlCLE9BQUE7QUFDakIsbUhBQUEsaUJBQWlCLE9BQUE7QUFDakIsdUhBQUEscUJBQXFCLE9BQUE7QUFDckIsc0hBQUEsb0JBQW9CLE9BQUE7QUFDcEIsbUhBQUEsaUJBQWlCLE9BQUE7QUFDakIsdUhBQUEscUJBQXFCLE9BQUE7QUFDckIsMEhBQUEsd0JBQXdCLE9BQUE7QUFHMUIsNkNBQTZDO0FBQzdDLHFEQUF3RDtBQUN4RCwyQ0FBcUU7QUFDckUscUNBQThDO0FBRTlDOztHQUVHO0FBQ0ksTUFBTSx5QkFBeUIsR0FBRyxDQUN2QyxZQUFlLEVBQ2YsTUFBYyxFQUNkLE1BQWdDLEVBQ2hDLEVBQUU7SUFDRixNQUFNLE1BQU0sR0FBRyxJQUFBLDJCQUFrQixFQUFJLE1B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