UNPKG

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
"use strict"; /** * 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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