@jucie.io/engine 1.1.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../services/server/src/utils/httpParsing.js", "../../services/server/src/adapters/AdapterInterface.js", "../../services/server/src/adapters/ExpressAdapter.js", "../../src/lib/relay/src/Relay.js", "../../src/utils/typeChecker.js", "../../src/definitions/createDefinition.js", "../../src/utils/asserts.js", "../../src/definitions/defaults.js", "../../src/definitions/DefinitionBuilder.js", "../../src/ServiceProvider.js", "../../src/global.js", "../../services/server/src/utils/routeMatch.js", "../../services/server/src/Kernel.js", "../../services/server/src/adapters/HttpAdapter.js", "../../services/server/src/utils/serverReady.js", "../../services/server/src/Server.js", "../../services/server/src/factories/defineRoutes.js", "../../services/server/src/factories/defineHooks.js"],
4
+ "sourcesContent": ["/**\n * HTTP parsing utilities for request body and query parameters\n */\n\n/**\n * Parse request body based on content type\n * @param {Object} req - Node.js request object\n * @returns {Object|null} Parsed body object or null\n */\nexport async function parseBody(req) {\n return new Promise((resolve) => {\n if (req.method === 'GET' || req.method === 'HEAD') {\n resolve(null);\n return;\n }\n\n const contentType = req.headers['content-type'] || '';\n let body = '';\n\n req.on('data', chunk => {\n body += chunk.toString();\n });\n\n req.on('end', () => {\n try {\n if (contentType.includes('application/json')) {\n resolve(body ? JSON.parse(body) : {});\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n resolve(parseUrlEncoded(body));\n } else if (contentType.includes('multipart/form-data')) {\n // For now, just return the raw body for multipart\n // Could be enhanced with proper multipart parsing\n resolve({ raw: body });\n } else {\n resolve(body || null);\n }\n } catch (error) {\n resolve(null);\n }\n });\n\n req.on('error', () => {\n resolve(null);\n });\n });\n}\n\n/**\n * Parse URL-encoded form data\n * @param {string} data - URL-encoded string\n * @returns {Object} Parsed object\n */\nfunction parseUrlEncoded(data) {\n const result = {};\n const pairs = data.split('&');\n \n for (const pair of pairs) {\n const [key, value] = pair.split('=');\n if (key) {\n const decodedKey = decodeURIComponent(key);\n const decodedValue = value ? decodeURIComponent(value) : '';\n \n // Handle arrays (key[] or key[0])\n if (decodedKey.endsWith('[]')) {\n const arrayKey = decodedKey.slice(0, -2);\n if (!result[arrayKey]) result[arrayKey] = [];\n result[arrayKey].push(decodedValue);\n } else {\n result[decodedKey] = decodedValue;\n }\n }\n }\n \n return result;\n}\n\n/**\n * Parse query parameters from URLSearchParams\n * @param {URLSearchParams} searchParams - URL search parameters\n * @returns {Object} Parsed query object with support for arrays\n */\nexport function parseQuery(searchParams) {\n const result = {};\n \n for (const [key, value] of searchParams.entries()) {\n // Handle array parameters (key[] or key[0])\n if (key.endsWith('[]') || /\\[\\d*\\]$/.test(key)) {\n const arrayKey = key.replace(/\\[\\d*\\]$/, '').replace('[]', '');\n if (!result[arrayKey]) result[arrayKey] = [];\n result[arrayKey].push(value);\n } else {\n result[key] = value;\n }\n }\n \n return result;\n}\n", "/**\n * Clovie Adapter Interface\n * \n * This defines the contract that all HTTP server adapters must implement.\n * The Clovie kernel uses this interface to delegate HTTP handling to\n * any compatible adapter (Express, Fastify, Node HTTP, etc.)\n */\nimport { parseQuery } from '../utils/httpParsing.js';\n\n/**\n * Adapter Interface - All adapters must implement this\n */\nexport class AdapterInterface {\n static create(name) {\n return new this(name);\n }\n\n constructor(name) {\n this.name = name;\n this.server = null;\n this.kernel = null;\n this.log = null;\n this.hooks = null;\n }\n\n /**\n * Initialize the adapter with kernel and context\n * @param {Object} kernel - Clovie kernel instance\n * @param {Object} opts - Configuration options (including middleware)\n * @param {Object} log - Clovie logger\n */\n async initialize(kernel, opts = {}, log = null) {\n this.kernel = kernel;\n this.opts = opts;\n this.log = log;\n \n // Validate options\n if (opts.middleware && !Array.isArray(opts.middleware)) {\n throw new Error('opts.middleware must be an array');\n }\n }\n\n /**\n * Start the HTTP server\n * @param {Object} options - Server options (port, host, etc.)\n * @returns {Promise<Object>} - Server instance\n */\n async start(options) {\n throw new Error(`start() must be implemented by ${this.name} adapter`);\n }\n\n /**\n * Stop the HTTP server\n * @returns {Promise<void>}\n */\n async stop() {\n throw new Error(`stop() must be implemented by ${this.name} adapter`);\n }\n\n /**\n * Get the underlying HTTP server instance\n * Used by services like LiveReload for Socket.IO integration\n * @returns {Object|null} - HTTP server instance\n */\n getHttpServer() {\n return this.server;\n }\n\n /**\n * Check if the server is currently running\n * @returns {boolean}\n */\n isRunning() {\n return this.server !== null;\n }\n\n /**\n * Handle a request through the adapter\n * @param {Object} req - HTTP request\n * @param {Object} res - HTTP response\n * @returns {Promise<void>}\n */\n async handleRequest(req, res) {\n throw new Error(`handleRequest() must be implemented by ${this.name} adapter`);\n }\n\n /**\n * Create standardized context object from request\n * @param {Object} req - HTTP request\n * @param {Object} res - HTTP response\n * @returns {Object} - Standardized context object\n */\n createContext(req, res) {\n const url = new URL(req.url || req.originalUrl, `http://${req.headers.host}`);\n\n return {\n req: {\n method: req.method,\n url: url.toString(),\n path: url.pathname,\n headers: Object.fromEntries(\n Object.entries(req.headers).map(([k, v]) => [k.toLowerCase(), v])\n ),\n query: req.query || parseQuery(url.searchParams),\n body: req.body || null,\n raw: { req, res },\n params: {}\n },\n res,\n respond: new RespondHelpers(),\n };\n }\n\n /**\n * Send response using standardized response format\n * @param {Object} res - HTTP response\n * @param {Object} response - Response object from route handler\n * @param {boolean} isHead - Whether this is a HEAD request\n * @returns {Promise<void>}\n */\n async sendResponse(res, response, isHead = false) {\n // Default to 204 if no response object was returned\n const resp = response ?? { type: 'text', status: 204, headers: {}, body: '' };\n\n if (resp.type === 'handled') {\n return;\n }\n\n if (res.headersSent) return; // defensive guard\n\n // Set status and headers (normalize keys)\n res.statusCode = resp.status ?? 200;\n if (resp.headers) {\n for (const [k, v] of Object.entries(resp.headers)) {\n res.setHeader(k.toLowerCase(), v);\n }\n }\n\n // Respect HEAD requests: send headers only\n if (isHead) {\n return res.end();\n }\n\n switch (resp.type) {\n case 'json': {\n if (!res.getHeader('content-type')) {\n res.setHeader('content-type', 'application/json; charset=utf-8');\n }\n return res.end(JSON.stringify(resp.body));\n }\n\n case 'text': {\n if (!res.getHeader('content-type')) {\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n }\n return res.end(resp.body ?? '');\n }\n\n case 'html': {\n if (!res.getHeader('content-type')) {\n res.setHeader('content-type', 'text/html; charset=utf-8');\n }\n return res.end(resp.body ?? '');\n }\n\n case 'file': {\n return await this.serveFile(res, resp.path);\n }\n\n case 'stream': {\n const b = resp.body;\n if (!b) return res.end();\n // Node stream\n if (typeof b.pipe === 'function') return b.pipe(res);\n // AsyncIterable\n if (Symbol.asyncIterator in Object(b)) {\n for await (const chunk of b) {\n if (!res.write(chunk)) {\n await new Promise(r => res.once('drain', r));\n }\n }\n return res.end();\n }\n // Fallback\n return res.end(b);\n }\n\n default:\n return res.end('');\n }\n }\n\n /**\n * Serve static files with proper MIME types and streaming\n * @param {Object} res - HTTP response\n * @param {string} filePath - Path to file to serve\n * @returns {Promise<void>}\n */\n async serveFile(res, filePath) {\n const fs = await import('node:fs');\n const fsp = await import('node:fs/promises');\n const path = await import('node:path');\n const { pipeline } = await import('node:stream');\n const { promisify } = await import('node:util');\n \n const pipelineAsync = promisify(pipeline);\n\n const MIME = {\n '.html': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.eot': 'application/vnd.ms-fontobject'\n };\n\n try {\n const st = await fsp.stat(filePath);\n if (!st.isFile()) {\n res.statusCode = 404;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n return res.end('Not Found');\n }\n\n const ext = path.extname(filePath).toLowerCase();\n if (!res.getHeader('content-type')) {\n res.setHeader('content-type', MIME[ext] ?? 'application/octet-stream');\n }\n res.setHeader('content-length', String(st.size));\n\n const rs = fs.createReadStream(filePath);\n rs.on('error', () => {\n if (!res.headersSent) res.statusCode = 404;\n res.end('Not Found');\n });\n await pipelineAsync(rs, res); // backpressure-aware piping\n } catch {\n if (!res.headersSent) {\n res.statusCode = 404;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n }\n res.end('Not Found');\n }\n }\n\n /**\n * Handle request errors consistently\n * @param {Object} res - HTTP response\n * @param {Error} error - Error that occurred\n * @returns {Promise<void>}\n */\n async handleError(res, error) {\n this.log?.error?.('Request handling error:', error);\n if (!res.headersSent) {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end('Internal Server Error');\n }\n }\n}\n\n/**\n * Route object structure that adapters receive from Clovie kernel\n */\nexport class ClovieRoute {\n constructor(method, path, handler, options = {}) {\n this.method = method.toUpperCase();\n this.path = path;\n this.handler = handler;\n this.options = options;\n this.params = options.params || [];\n }\n}\n\n/**\n * Hook object structure for lifecycle management\n */\nexport class ClovieHooks {\n constructor() {\n this.onRequest = null;\n this.preHandler = null;\n this.onSend = null;\n this.onError = null;\n }\n}\n\n/**\n * Context object passed to route handlers\n */\nexport class ClovieContext {\n constructor(req, res, state, cache) {\n this.req = req;\n this.res = res;\n this.state = state;\n this.cache = cache;\n this.respond = new RespondHelpers();\n }\n}\n\n/**\n * Response helpers for route handlers\n */\nexport class RespondHelpers {\n handled() {\n return { type: 'handled' };\n }\n\n json(data, status = 200, headers = {}) {\n return { type: 'json', status, headers, body: data };\n }\n\n text(data, status = 200, headers = {}) {\n return { type: 'text', status, headers, body: data };\n }\n\n html(data, status = 200, headers = {}) {\n return { type: 'html', status, headers, body: data };\n }\n\n file(path, status = 200, headers = {}) {\n return { type: 'file', status, headers, path };\n }\n\n stream(body, status = 200, headers = {}) {\n return { type: 'stream', status, headers, body };\n }\n\n redirect(location, status = 302, headers = {}) {\n return { type:'text', status, headers: { ...headers, location }, body: '' };\n }\n}\n", "/**\n * Express adapter for Clovie with full middleware support\n */\nimport { AdapterInterface } from './AdapterInterface.js';\n\nexport class ExpressAdapter extends AdapterInterface {\n #connections = new Set();\n\n constructor(express = null) {\n super('express');\n this.express = express;\n this.app = null;\n }\n\n async initialize(kernel, opts = {}, log = null) {\n await super.initialize(kernel, opts, log);\n \n // Import Express\n if (!this.express) {\n try {\n this.express = await import('express');\n this.express = this.express.default;\n } catch (error) {\n throw new Error('Express not installed. Run: npm install express');\n }\n }\n\n // Create Express app\n this.app = this.express();\n\n // Apply default middleware (can be overridden by user middleware)\n if (!opts.middleware || !this.#hasBodyParser(opts.middleware)) {\n this.app.use(this.express.json());\n this.app.use(this.express.urlencoded({ extended: true }));\n }\n\n // Apply user-defined middleware\n if (opts.middleware && Array.isArray(opts.middleware)) {\n this.log?.info(`Applying ${opts.middleware.length} middleware functions`);\n \n for (const [index, middleware] of opts.middleware.entries()) {\n try {\n this.app.use(middleware);\n this.log?.debug(`Applied middleware ${index + 1}/${opts.middleware.length}`);\n } catch (error) {\n throw new Error(`Failed to apply middleware[${index}]: ${error.message}`);\n }\n }\n }\n\n // Additional middleware will be mounted by the server before kernel handler registration\n }\n\n registerKernelHandler() {\n if (!this.app) {\n return;\n }\n\n this.app.all('*', async (req, res) => {\n await this.handleRequest(req, res);\n });\n }\n\n getExpressApp() {\n return this.app;\n }\n\n async start({ port = 3000, host = '0.0.0.0' } = {}) {\n return new Promise((resolve, reject) => {\n this.server = this.app.listen(port, host, (err) => {\n if (err) {\n reject(err);\n } else {\n // Track connections for clean shutdown\n this.server.on('connection', (conn) => {\n this.#connections.add(conn);\n conn.on('close', () => {\n this.#connections.delete(conn);\n });\n });\n\n this.log?.info(`Express Server with middleware listening on http://${host}:${port}`);\n resolve(this.server);\n }\n });\n });\n }\n\n async stop() {\n if (this.server?.close) {\n // Destroy all active connections\n for (const conn of this.#connections) {\n conn.destroy();\n }\n this.#connections.clear();\n\n return new Promise((resolve) => {\n this.server.close(() => {\n this.log?.info('Express Server stopped');\n resolve();\n });\n });\n }\n }\n\n async handleRequest(req, res) {\n try {\n // Create context from Express request\n const ctx = this.createContext(req, res);\n \n // Delegate to kernel for route matching and handling\n const response = await this.kernel.handle(ctx);\n \n // Send response using shared method\n await this.sendResponse(res, response, req.method === 'HEAD');\n\n } catch (error) {\n await this.handleError(res, error);\n }\n }\n\n /**\n * Check if middleware array contains body parser\n * @private\n */\n #hasBodyParser(middlewareArray) {\n return middlewareArray.some(mw => {\n // Check for common body parser middleware names\n const name = mw.name?.toLowerCase() || mw.toString().toLowerCase();\n return name.includes('json') || name.includes('urlencoded') || name.includes('bodyparser');\n });\n }\n}\n", "// Simple, readable relay with wildcard matching and no indexing\n\nconst GLOBAL_NS_OBJ = Object.freeze(Object.create(null));\n\nfunction queueMicrotask(fn) {\n if (globalThis.queueMicrotask && typeof globalThis.queueMicrotask === 'function') {\n globalThis.queueMicrotask(fn);\n return;\n }\n setTimeout(fn, 0);\n}\n\nclass Channel {\n #nsObj; #relay;\n constructor(nsObj, relay) { this.#nsObj = nsObj; this.#relay = relay; }\n\n // Any source -> me\n on(event, handler) {\n return this.#relay.subscribe(event, GLOBAL_NS_OBJ, this.#nsObj, handler);\n }\n\n once(event, handler) {\n return this.#relay.once(event, GLOBAL_NS_OBJ, this.#nsObj, handler);\n }\n\n // Me -> everyone (sender never hears itself)\n broadcast(event, ...payload) {\n this.#relay.publish(event, this.#nsObj, GLOBAL_NS_OBJ, payload);\n }\n\n // Specific source -> me\n from(fromNs) {\n return {\n subscribe: (event, handler) => this.#relay.subscribe(event, fromNs, this.#nsObj, handler),\n once: (event, handler) => this.#relay.once(event, fromNs, this.#nsObj, handler),\n };\n }\n\n // Me -> specific target\n to(toNs) {\n return {\n publish: (event, ...payload) => this.#relay.publish(event, this.#nsObj, toNs, payload),\n publishAsync: (event, ...payload) => this.#relay.publishAsync(event, this.#nsObj, toNs, payload),\n };\n }\n}\n\nexport class Relay {\n #channels = new WeakMap(); // nsObj -> Channel\n #events = new Map(); // eventName -> Set<Listener>\n #onError = null;\n\n static create(config = {}) {\n return new Relay(config);\n }\n\n constructor({ onError = null } = {}) {\n this.#onError = onError;\n this.createChannel(GLOBAL_NS_OBJ);\n }\n\n // Public convenience\n channel(nsObj) { return this.createChannel(nsObj); }\n createChannel(nsObj) {\n if (this.#channels.has(nsObj)) return this.#channels.get(nsObj);\n const ch = new Channel(nsObj, this);\n this.#channels.set(nsObj, ch);\n return ch;\n }\n\n // Internal helpers\n #listeners(event) {\n let set = this.#events.get(event);\n if (!set) { set = new Set(); this.#events.set(event, set); }\n return set;\n }\n\n // Wildcard matcher:\n // - If published `from` is GLOBAL, it matches every listener.from\n // - If listener.from is GLOBAL, it matches every published from\n // Same for `to`. This makes broadcast (to = GLOBAL) hit specific targets too.\n static #matchSide(published, constraint) {\n return published === GLOBAL_NS_OBJ || constraint === GLOBAL_NS_OBJ || published === constraint;\n }\n\n static #matches(publishedFrom, publishedTo, listenerFrom, listenerTo) {\n return Relay.#matchSide(publishedFrom, listenerFrom)\n && Relay.#matchSide(publishedTo, listenerTo);\n }\n\n subscribe(event, from, to, handler) {\n const listener = { from, to, handler };\n this.#listeners(event).add(listener);\n return () => {\n const set = this.#events.get(event);\n if (set) set.delete(listener);\n };\n }\n\n once(event, from, to, handler) {\n let off = null;\n const wrapped = (payload) => {\n try { handler(payload); } finally { off && off(); }\n };\n off = this.subscribe(event, from, to, wrapped);\n return off;\n }\n\n offAllFor(nsObj) {\n for (const set of this.#events.values()) {\n for (const l of Array.from(set)) {\n if (l.from === nsObj || l.to === nsObj) set.delete(l);\n }\n }\n }\n\n listenerCount(event) {\n const set = this.#events.get(event);\n return set ? set.size : 0;\n }\n\n #deliver(event, from, to, payload) {\n const set = this.#events.get(event);\n if (!set || set.size === 0) return;\n\n for (const l of set) {\n // Always skip self-delivery\n if (l.to === from) continue;\n\n if (Relay.#matches(from, to, l.from, l.to)) {\n try { l.handler(...payload); }\n catch (err) { if (this.#onError) this.#onError(err, { event, from, to, listener: l }); }\n }\n }\n }\n\n publish(event, from, to, payload) {\n this.#deliver(event, from, to, payload);\n }\n\n publishAsync(event, from, to, payload) {\n queueMicrotask(() => this.#deliver(event, from, to, payload));\n }\n\n broadcast(event, from, payload) {\n this.publish(event, from, GLOBAL_NS_OBJ, payload);\n }\n}\n", "/**\n * Type Checker Utility\n * \n * Supports syntax like:\n * - createDefinition('action', [Array, Function]) // Array or Function\n * - createDefinition('name', String) // Must be String\n * - createDefinition('items', Array) // Must be Array\n * - createDefinition('callback', Function) // Must be Function\n * - createDefinition('value', [String, Number]) // String or Number\n */\n\n/**\n * Type definitions mapping constructor names to actual constructors\n */\nconst TYPE_MAP = {\n String,\n Number,\n Boolean,\n Array,\n Object,\n Function,\n Date,\n RegExp,\n Promise,\n Map,\n Set,\n WeakMap,\n WeakSet,\n Symbol,\n BigInt,\n Error,\n TypeError,\n RangeError,\n ReferenceError,\n SyntaxError,\n EvalError,\n URIError\n};\n\n/**\n * Checks if a value matches the expected type(s)\n * @param {*} value - The value to check\n * @param {Function|Array<Function>} expectedType - Single type or array of possible types\n * @param {string} name - Name of the parameter for error messages\n * @returns {boolean} - True if value matches expected type(s)\n */\nexport function checkType(value, expectedType, name = 'value') {\n // Handle array of possible types\n if (Array.isArray(expectedType)) {\n for (const type of expectedType) {\n if (matchesType(value, type)) {\n return true;\n }\n }\n \n const typeNames = expectedType.map(getTypeName).join(' | ');\n throw new TypeError(`${name} must be one of: ${typeNames}. Got ${getTypeName(value)}`);\n }\n \n // Handle single type\n if (!matchesType(value, expectedType)) {\n throw new TypeError(`${name} must be ${getTypeName(expectedType)}. Got ${getTypeName(value)}`);\n }\n \n return true;\n}\n\n/**\n * Checks if a value matches a specific type\n * @param {*} value - The value to check\n * @param {Function} type - The expected constructor/type\n * @returns {boolean} - True if value matches the type\n */\nfunction matchesType(value, type) {\n // Handle primitive constructors\n if (type === String) {\n return typeof value === 'string';\n }\n if (type === Number) {\n return typeof value === 'number' && !isNaN(value);\n }\n if (type === Boolean) {\n return typeof value === 'boolean';\n }\n if (type === Symbol) {\n return typeof value === 'symbol';\n }\n if (type === BigInt) {\n return typeof value === 'bigint';\n }\n if (type === Function) {\n return typeof value === 'function';\n }\n \n // Handle object constructors (including Array, Object, Date, etc.)\n if (type === Array) {\n return Array.isArray(value);\n }\n if (type === Object) {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n }\n \n // Handle other constructors (Date, RegExp, Map, Set, etc.)\n return value instanceof type;\n}\n\n/**\n * Gets a human-readable name for a type\n * @param {*} value - The value or constructor to get name for\n * @returns {string} - Human-readable type name\n */\nfunction getTypeName(value) {\n if (value === String) return 'String';\n if (value === Number) return 'Number';\n if (value === Boolean) return 'Boolean';\n if (value === Array) return 'Array';\n if (value === Object) return 'Object';\n if (value === Function) return 'Function';\n if (value === Date) return 'Date';\n if (value === RegExp) return 'RegExp';\n if (value === Promise) return 'Promise';\n if (value === Map) return 'Map';\n if (value === Set) return 'Set';\n if (value === WeakMap) return 'WeakMap';\n if (value === WeakSet) return 'WeakSet';\n if (value === Symbol) return 'Symbol';\n if (value === BigInt) return 'BigInt';\n if (value === Error) return 'Error';\n \n if (typeof value === 'string') return 'string';\n if (typeof value === 'number') return 'number';\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'symbol') return 'symbol';\n if (typeof value === 'bigint') return 'bigint';\n if (typeof value === 'function') return 'function';\n if (Array.isArray(value)) return 'Array';\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'object') {\n return value.constructor?.name || 'Object';\n }\n \n return 'unknown';\n}\n\n/**\n * Creates a type checker function for a specific parameter\n * @param {Function|Array<Function>} expectedType - Expected type(s)\n * @param {string} name - Parameter name\n * @returns {Function} - Type checker function\n */\nexport function createTypeChecker(expectedType, name = 'value') {\n return (value) => checkType(value, expectedType, name);\n}\n\n/**\n * Validates an object against a schema\n * @param {Object} obj - Object to validate\n * @param {Object} schema - Schema definition { prop: Type, prop2: [Type1, Type2] }\n * @param {string} objName - Name of the object for error messages\n */\nexport function validateObject(obj, schema, objName = 'object') {\n if (!obj || typeof obj !== 'object') {\n throw new TypeError(`${objName} must be an object`);\n }\n \n for (const [prop, expectedType] of Object.entries(schema)) {\n if (prop in obj) {\n checkType(obj[prop], expectedType, `${objName}.${prop}`);\n }\n }\n}\n\n/**\n * Creates a validator function for an object schema\n * @param {Object} schema - Schema definition\n * @param {string} objName - Name of the object\n * @returns {Function} - Validator function\n */\nexport function createObjectValidator(schema, objName = 'object') {\n return (obj) => validateObject(obj, schema, objName);\n}\n\n// Export the type map for advanced usage\nexport { TYPE_MAP };\n", "const DefinitionTypes = new Map();\nconst Definitions = new WeakMap();\nimport { createTypeChecker } from '../utils/typeChecker.js';\n\n/**\n * Creates a definition type with return type validation\n * @param {string} type - The definition type name\n * @param {Function|Array<Function>} returnTypes - Expected return type(s)\n * @returns {Function} - Definition creator function\n */\n\n\nexport const definitionType = (definition) => {\n if (Definitions.has(definition)) {\n return Definitions.get(definition);\n }\n return undefined;\n}\n\nexport const createDefinition = (type, returnTypes = []) => { \n // Create type checker for return values if returnTypes specified\n const returnTypeChecker = returnTypes.length > 0 ? createTypeChecker(returnTypes, 'return value') : null;\n \n if (DefinitionTypes.has(type)) {\n console.warn(`Definition type \"${type}\" already exists`);\n return DefinitionTypes.get(type);\n }\n\n const definitionType = (name, factory, ...defaultArgs) => {\n // Validate inputs using type checker\n createTypeChecker(String, 'name')(name);\n createTypeChecker(Function, 'factory')(factory);\n\n const definition = (...args) => {\n try {\n const combinedArgs = [...args, ...defaultArgs];\n const res = factory(...combinedArgs);\n \n if (returnTypeChecker && res === undefined) {\n throw new Error(`Factory ${type} must return a value for ${name}`);\n }\n\n // Use type checker to validate return value\n if (returnTypeChecker) {\n returnTypeChecker(res);\n }\n\n return res\n } catch (error) {\n console.error(`Error creating definition \"${name}\"`, error);\n throw error;\n }\n }\n\n Object.defineProperty(definition, '_name', {\n value: name,\n enumerable: false,\n configurable: false\n });\n\n Definitions.set(definition, type);\n\n return definition;\n }\n\n DefinitionTypes.set(type, definitionType);\n\n return definitionType;\n}; ", "// utils/asserts.js\n\nconst BAD_KEYS = new Set(['__proto__', 'prototype', 'constructor']);\nconst RESERVED_NAMESPACES = new Set(['use', 'install', 'uninstall', 'relay', 'state', 'debug']);\n\nconst MAX_NAME_LENGTH = 64;\nconst VALID_NAME = /^[a-zA-Z_$][a-zA-Z_$0-9]*$/;\n\n/**\n * Throw if key is unsafe (__proto__, constructor, etc.)\n */\nexport function assertSafeKey(key, where = 'key') {\n if (BAD_KEYS.has(key)) {\n throw new Error(`Illegal key \"${key}\" in ${where}`);\n }\n}\n\n/**\n * Validate a namespace string: format, length, reserved words, proto poisoning.\n */\nexport function assertNamespace(ns) {\n assertSafeKey(ns, 'namespace');\n if (typeof ns !== 'string') {\n throw new Error(`Namespace must be a string, got ${typeof ns}`);\n }\n if (!VALID_NAME.test(ns)) {\n throw new Error(`Invalid namespace \"${ns}\". Must be a valid JS identifier`);\n }\n if (ns.length > MAX_NAME_LENGTH) {\n throw new Error(`Namespace \"${ns}\" too long (max ${MAX_NAME_LENGTH} chars)`);\n }\n if (RESERVED_NAMESPACES.has(ns)) {\n throw new Error(`Namespace \"${ns}\" is reserved`);\n }\n return ns;\n}\n\n/**\n * Validate an action or getter name within a namespace.\n */\nexport function assertMemberName(name, namespace, kind = 'member') {\n assertSafeKey(name, `${kind}:${namespace}`);\n if (typeof name !== 'string') {\n throw new Error(`${kind} name in ${namespace} must be a string`);\n }\n if (!VALID_NAME.test(name)) {\n throw new Error(`Invalid ${kind} name \"${name}\" in ${namespace}`);\n }\n if (name.length > MAX_NAME_LENGTH) {\n throw new Error(\n `${kind} name \"${name}\" in ${namespace} too long (max ${MAX_NAME_LENGTH})`\n );\n }\n return name;\n}\n", "import { createDefinition, definitionType } from './createDefinition.js';\nexport const defineMiddleware = createDefinition('MIDDLEWARE', [Function, Array]);\nexport const defineActions = createDefinition('ACTIONS', [Object]);\nexport const defineUninstall = createDefinition('UNINSTALL');\nexport const defineInitialize = createDefinition('INITIALIZE');\nexport const defineGetters = createDefinition('GETTERS', [Object]);\nexport { createDefinition, definitionType };", "// DefinitionBuilder.js\nimport { defineActions, defineGetters, defineMiddleware, defineInitialize, defineUninstall } from './defaults.js';\n\nexport class DefinitionBuilder {\n static create(namespace) {\n return new DefinitionBuilder(namespace);\n }\n\n #ns; #args;\n #slots = { MIDDLEWARE:null, GETTERS:null, ACTIONS:null, INITIALIZE:null, UNINSTALL:null };\n constructor(namespace) { this.#ns = namespace }\n\n #set(type, factory, creator) {\n if (this.#slots[type]) throw new Error(`${type} already defined for ${this.#ns}`);\n this.#slots[type] = creator(this.#ns, factory);\n }\n\n defineMiddleware = (factory) => this.#set('MIDDLEWARE', factory, defineMiddleware);\n defineGetters = (factory) => this.#set('GETTERS', factory, defineGetters);\n defineActions = (factory) => this.#set('ACTIONS', factory, defineActions);\n defineInitialize = (factory) => this.#set('INITIALIZE', factory, defineInitialize);\n defineUninstall = (factory) => this.#set('UNINSTALL', factory, defineUninstall);\n\n _toArray() {\n return [\n this.#slots.MIDDLEWARE,\n this.#slots.GETTERS,\n this.#slots.ACTIONS,\n this.#slots.INITIALIZE,\n this.#slots.UNINSTALL\n ].filter(Boolean);\n }\n}\n\n", "import { assertNamespace } from './utils/asserts.js';\nimport { DefinitionBuilder } from './definitions/DefinitionBuilder.js';\n\n\nexport class ServiceProvider {\n static #services = new Set();\n\n static manifest = {\n name: 'base',\n dependencies: [],\n version: '1.0.0',\n description: 'Base extension template',\n };\n\n static config = null;\n\n static unique = false;\n\n static configure(options = {}) {\n return {\n install: (useContext, config) => this.install(useContext, config),\n manifest: this.manifest,\n config: { ...(this.config || this.manifest.defaults || {}), ...options },\n unique: true,\n configured: true\n };\n }\n\n static install(useContext, config) { \n try {\n const {namespace} = this.manifest;\n assertNamespace(namespace);\n\n // instantiate\n const instance = new this();\n ServiceProvider.#services.add(instance);\n\n // bind context/config\n // bind config (frozen to avoid accidental mutation)\n Object.defineProperty(instance, 'config', {\n value: Object.freeze({ ...config }),\n writable: false,\n configurable: false,\n enumerable: false,\n });\n\n // expose both a live context getter AND the keyed accessor\n Object.defineProperty(instance, 'context', {\n get: () => useContext(), // always fresh, via your proxy\n configurable: false,\n enumerable: false,\n });\n \n Object.defineProperty(instance, 'useContext', {\n value: (...keys) => useContext(...keys),\n writable: false,\n configurable: false,\n enumerable: false,\n });\n\n const builder = DefinitionBuilder.create(namespace);\n\n if (instance.setup) {\n // Create properly bound context for setup pattern\n const setupContext = {\n defineActions: (factory) => builder.defineActions(() => factory(useContext, config)),\n defineMiddleware: (factory) => builder.defineMiddleware(() => factory(useContext, config)),\n defineGetters: (factory) => builder.defineGetters(() => factory(useContext, config)),\n defineInitialize: (factory) => builder.defineInitialize(() => factory(useContext, config)),\n defineUninstall: (factory) => builder.defineUninstall(() => factory(useContext, config))\n };\n const maybe = instance.setup(setupContext);\n return maybe?.then ? maybe.then(() => builder._toArray()) : builder._toArray();\n }\n\n if (instance.middleware) builder.defineMiddleware(() => instance.middleware(useContext, config));\n if (instance.getters) builder.defineGetters (() => instance.getters(useContext, config));\n if (instance.actions) builder.defineActions (() => instance.actions(useContext, config));\n if (instance.initialize) builder.defineInitialize(() => instance.initialize(useContext, config));\n if (instance.uninstall) builder.defineUninstall (() => instance.uninstall(useContext, config));\n\n return builder._toArray();\n } catch (error) {\n throw error;\n }\n }\n}", "const ENGINE_CONTEXT = Symbol('jucie.engine');\n\n/**\n * Registers the engine globally, but only if no engine has already been set.\n * @param {object} engine \n */\n\nexport function provideEngine(engine) {\n if (!globalThis[ENGINE_CONTEXT]) {\n globalThis[ENGINE_CONTEXT] = engine;\n }\n}\n\nexport function hasEngine() {\n return globalThis[ENGINE_CONTEXT] !== undefined;\n}\n\n/**\n * Forcefully override the engine in the global context.\n * Useful for testing or resetting.\n */\nexport function forceEngine(engine) {\n globalThis[ENGINE_CONTEXT] = engine;\n}\n\n/**\n * Retrieves the globally registered engine.\n */\nexport function getEngine() {\n return globalThis[ENGINE_CONTEXT] || null;\n}\n\n/**\n * Retrieves the globally registered engine.\n */\nexport function useEngine() {\n return getEngine();\n}", "// Import URLPattern polyfill synchronously - no-op on modern Node.js\nimport 'urlpattern-polyfill';\n\n/**\n * Compile a route pattern into a matcher function using URLPattern\n * @param {string} pattern - Route pattern (e.g., '/users/:id', '/api/*')\n * @returns {Function} - Function that returns params object or null\n */\nexport function compileRoute(pattern) {\n // URLPattern supports :param syntax directly, no conversion needed\n const pat = new URLPattern({ pathname: pattern });\n \n return (pathname) => {\n const match = pat.exec({ pathname });\n return match?.pathname.groups ?? null;\n };\n}\n\n/**\n * Parse route parameters from a route path for documentation\n * @param {string} routePath - The route path (e.g., '/users/:id/posts/:postId')\n * @returns {Array} Array of parameter objects with name and type info\n */\nexport function parseRouteParams(routePath) {\n const paramRegex = /:([a-zA-Z_][a-zA-Z0-9_]*)(\\?)?(\\*)?/g;\n const params = [];\n let match;\n \n while ((match = paramRegex.exec(routePath)) !== null) {\n const [, name, optional, splat] = match;\n params.push({\n name,\n optional: !!optional,\n splat: !!splat,\n fullMatch: match[0]\n });\n }\n \n // Also handle standalone wildcard routes (*)\n if (routePath.includes('*') && !routePath.includes(':*')) {\n params.push({\n name: 'wild',\n optional: false,\n splat: true,\n fullMatch: '*'\n });\n }\n \n return params;\n}\n\n/**\n * Replace route parameters with actual values\n * @param {string} routePath - The route path template\n * @param {Object} params - Object with parameter values\n * @param {Object} options - Replacement options\n * @returns {string} - The resolved path\n */\nexport function replaceRouteParams(routePath, params = {}, options = {}) {\n const {\n strict = true, // Throw error if required param is missing\n encode = true, // URL encode parameter values\n defaultValue = '' // Default value for missing params\n } = options;\n \n let resolvedPath = routePath;\n const routeParams = parseRouteParams(routePath);\n \n for (const param of routeParams) {\n const { name, optional, fullMatch } = param;\n let value = params[name];\n \n // Handle missing parameters\n if (value === undefined || value === null) {\n if (optional) {\n // Remove optional parameter and its leading slash if present\n resolvedPath = resolvedPath.replace(`/${fullMatch}`, '').replace(fullMatch, '');\n continue;\n } else if (strict) {\n throw new Error(`Missing required route parameter: ${name}`);\n } else {\n value = defaultValue;\n }\n }\n \n // Convert value to string and optionally encode\n const stringValue = String(value);\n const encodedValue = encode ? encodeURIComponent(stringValue) : stringValue;\n \n // Replace the parameter in the path\n resolvedPath = resolvedPath.replace(fullMatch, encodedValue);\n }\n \n // Clean up any double slashes that might have been created\n resolvedPath = resolvedPath.replace(/\\/+/g, '/');\n \n return resolvedPath;\n}\n", "import { compileRoute } from './utils/routeMatch.js';\n\n/**\n * Kernel handles route registration and matching\n * Separates routing logic from HTTP protocol handling\n */\nexport class Kernel {\n #routes = []; // { method, path, match, handler, mode, revalidate, ... }\n #appHandlers = []; // [{ match, handle, cleanup? }]\n #hooks = { \n onRequest: null, \n preHandler: null, \n onSend: null, \n onError: null \n };\n\n #staticFallback = null;\n\n constructor() {}\n\n /**\n * Register multiple routes at once\n * @param {Array} rawRoutes - Array of route objects\n */\n registerRoutes(rawRoutes) {\n for (const r of rawRoutes) {\n this.registerRoute(r);\n }\n }\n\n /**\n * Register a single route\n * @param {Object} route - Route object with method, path, handler, etc.\n */\n registerRoute(route) {\n const compiledRoute = {\n ...route,\n match: compileRoute(route.path)\n };\n this.#routes.push(compiledRoute);\n }\n\n setAppHandlers(handlers = []) {\n this.#appHandlers = Array.isArray(handlers) ? handlers : [];\n }\n\n async cleanupAppHandlers() {\n for (const handler of this.#appHandlers) {\n if (handler?.cleanup) {\n await handler.cleanup();\n }\n }\n this.#appHandlers = [];\n }\n\n /**\n * Configure hooks\n * @param {Object} hooks - Hook functions\n */\n hooks(h) { \n Object.assign(this.#hooks, h); \n }\n\n /**\n * Set static file fallback handler\n * @param {string} outputDir - Directory to serve static files from\n * @param {Function} handler - Static file handler function\n */\n setStaticFallback(outputDir, handler) {\n this.#staticFallback = { outputDir, handler };\n }\n\n /**\n * Handle a request through the routing system\n * @param {Object} ctx - Request context\n * @returns {Object} Response object\n */\n async handle(ctx) {\n let response;\n try {\n // onRequest can short-circuit\n const onReqOut = await this.#hooks.onRequest?.(ctx);\n if (onReqOut) { response = onReqOut; return response; }\n\n // app handlers first\n for (const handler of this.#appHandlers) {\n try {\n if (!handler?.match || !handler?.handle) continue;\n if (await handler.match(ctx.req)) {\n const handlerResponse = await handler.handle(ctx);\n if (handlerResponse) {\n response = handlerResponse;\n return response;\n }\n }\n } catch (handlerError) {\n response = (await this.#hooks.onError?.(ctx, handlerError))\n ?? ctx.respond.text('Internal Server Error', 500);\n return response;\n }\n }\n\n // route match \u2026\n let matchParams = null;\n const route = this.#routes.find(r => {\n if (r.method !== ctx.req.method) return false;\n const m = r.match(ctx.req.path);\n if (m) { matchParams = m; return true; }\n return false;\n });\n\n if (!route) {\n if (this.#staticFallback) {\n const staticResponse = await this.#staticFallback.handler(ctx, this.#staticFallback.outputDir);\n response = (staticResponse && staticResponse.status !== 404)\n ? staticResponse\n : ctx.respond.text('Not Found', 404);\n } else {\n response = ctx.respond.text('Not Found', 404);\n }\n return response;\n }\n\n ctx.req.params = matchParams || {};\n\n // preHandler can short-circuit\n const preOut = await this.#hooks.preHandler?.(ctx, route);\n if (preOut) { response = preOut; return response; }\n\n // route handler\n response = await route.handler(ctx);\n\n } catch (err) {\n response = (await this.#hooks.onError?.(ctx, err))\n ?? ctx.respond.text('Internal Server Error', 500);\n } finally {\n await this.#hooks.onSend?.(ctx, response);\n }\n return response ?? ctx.respond.text('', 204);\n }\n\n\n /**\n * Get all registered routes\n * @returns {Array} Array of registered routes\n */\n getRoutes() {\n return this.#routes.map(route => ({\n method: route.method,\n path: route.path,\n params: route.params || [],\n compiled: true\n }));\n }\n}\n", "/**\n * HTTP Adapter for Node.js native HTTP server\n * Thin I/O shim: normalize req/res, call kernel, send response\n */\nimport http from 'node:http';\nimport { AdapterInterface } from './AdapterInterface.js';\nimport { parseBody } from '../utils/httpParsing.js';\n\nexport class HttpAdapter extends AdapterInterface {\n #connections = new Set();\n\n constructor() {\n super('http');\n }\n\n async initialize(kernel, opts = {}, log = null) {\n await super.initialize(kernel, opts, log);\n \n // Warn if middleware is configured for HTTP adapter\n if (opts.middleware?.length > 0) {\n log?.warn('Middleware configured but HTTP adapter selected. Consider using adapter: \"express\" for full middleware support.');\n log?.info('HTTP adapter will simulate middleware using hooks for basic compatibility.');\n }\n }\n\n async start({ port = 3000, host = '0.0.0.0' } = {}) {\n this.server = http.createServer(async (req, res) => {\n try {\n // Simulate middleware execution for HTTP adapter\n if (this.opts.middleware?.length > 0) {\n const success = await this.#simulateMiddleware(req, res, this.opts.middleware);\n if (!success) return; // Response was sent by middleware\n }\n\n // Parse body for HTTP adapter\n if (!req.body) {\n req.body = await parseBody(req);\n }\n\n const ctx = this.createContext(req, res);\n const out = await this.kernel.handle(ctx);\n await this.sendResponse(res, out, req.method === 'HEAD');\n } catch (error) {\n await this.handleError(res, error);\n }\n });\n\n // Track connections for clean shutdown\n this.server.on('connection', (conn) => {\n this.#connections.add(conn);\n conn.on('close', () => {\n this.#connections.delete(conn);\n });\n });\n\n await new Promise((resolve, reject) =>\n this.server.listen(port, host, err => (err ? reject(err) : resolve()))\n );\n\n this.log?.info?.(`HTTP Server listening on http://${host}:${port}`);\n return this.server;\n }\n\n async stop() {\n if (this.server) {\n // Destroy all active connections\n for (const conn of this.#connections) {\n conn.destroy();\n }\n this.#connections.clear();\n\n // Close the server\n await new Promise(resolve => this.server.close(() => resolve()));\n this.server = null;\n }\n }\n\n /**\n * Simulate Express middleware for HTTP adapter\n * Limited compatibility - not all Express middleware will work\n * @private\n */\n async #simulateMiddleware(req, res, middlewareArray) {\n for (const middleware of middlewareArray) {\n try {\n let nextCalled = false;\n const next = (err) => {\n if (err) throw err;\n nextCalled = true;\n };\n\n // Add Express-like methods to response\n if (!res.json) {\n res.json = (data) => {\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(data));\n return false; // Indicates response was sent\n };\n }\n\n await middleware(req, res, next);\n \n // If next wasn't called and response was sent, stop processing\n if (!nextCalled && res.headersSent) {\n return false;\n }\n } catch (error) {\n this.log?.error(`Middleware simulation error: ${error.message}`);\n res.statusCode = 500;\n res.end('Internal Server Error');\n return false;\n }\n }\n return true; // Continue to kernel\n }\n\n}\n", "import chalk from 'chalk';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\n/**\n * Display a pretty server ready message with clickable URL\n * @param {object} options - Server options\n * @param {number} options.port - Server port\n * @param {string} options.host - Server host\n * @param {string} options.mode - Server mode (development/production)\n * @param {object} logger - Logger instance\n */\nexport async function displayServerReady({ port, host, mode }, logger) {\n const protocol = mode === 'production' ? 'https' : 'http';\n const url = `${protocol}://${host === '0.0.0.0' ? 'localhost' : host}:${port}`;\n \n // Create a nice banner\n const banner = [\n '',\n chalk.bold.blue('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557'),\n chalk.bold.blue('\u2551') + chalk.bold.white(' \uD83D\uDE80 Clovie Server Ready! \uD83D\uDE80 ') + chalk.bold.blue('\u2551'),\n chalk.bold.blue('\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563'),\n chalk.bold.blue('\u2551') + chalk.white(` Mode: ${chalk.green(mode.toUpperCase())} `) + chalk.bold.blue('\u2551'),\n chalk.bold.blue('\u2551') + chalk.white(` URL: ${chalk.cyan.underline(url)} `) + chalk.bold.blue('\u2551'),\n chalk.bold.blue('\u2551') + chalk.white(` Host: ${chalk.yellow(host)}:${chalk.yellow(port)} `) + chalk.bold.blue('\u2551'),\n chalk.bold.blue('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D'),\n ''\n ];\n\n // Display the banner\n banner.forEach(line => logger.info(line));\n\n // Try to open browser automatically in development mode\n if (mode === 'development') {\n try {\n await openBrowser(url);\n logger.info(chalk.green('\uD83C\uDF10 Browser opened automatically'));\n } catch (error) {\n logger.debug('Could not open browser automatically:', error.message);\n }\n }\n\n // Display helpful commands\n const commands = [\n '',\n chalk.gray('\uD83D\uDCA1 Quick Commands:'),\n chalk.gray(` \u2022 Press ${chalk.yellow('Ctrl+C')} to stop the server`),\n chalk.gray(` \u2022 Visit ${chalk.cyan(url)} to view your site`),\n chalk.gray(` \u2022 Check the console for live reload updates`),\n ''\n ];\n\n commands.forEach(line => logger.info(line));\n}\n\n/**\n * Open browser with the given URL\n * @param {string} url - URL to open\n */\nasync function openBrowser(url) {\n const platform = process.platform;\n let command;\n\n switch (platform) {\n case 'darwin': // macOS\n command = `open \"${url}\"`;\n break;\n case 'win32': // Windows\n command = `start \"${url}\"`;\n break;\n default: // Linux and others\n command = `xdg-open \"${url}\"`;\n break;\n }\n\n try {\n await execAsync(command);\n } catch (error) {\n throw new Error(`Failed to open browser: ${error.message}`);\n }\n}", "import { ServiceProvider, definitionType } from '@jucie.io/engine';\nimport { Kernel } from './Kernel.js';\nimport { HttpAdapter } from './adapters/HttpAdapter.js';\nimport { displayServerReady } from './utils/serverReady.js';\n\nexport class Server extends ServiceProvider {\n static manifest = {\n name: 'Clovie Server',\n namespace: 'server',\n version: '1.0.0'\n };\n\n #routes = [];\n #adapter = null;\n #hooks = {\n onRequest: null,\n preHandler: null,\n onSend: null,\n onError: null\n };\n #live = false;\n #liveConfig = {};\n #factories = [];\n\n actions(useContext) { \n return {\n use: (...factories) => {\n this.#factories.push(...factories);\n return this;\n },\n // Add a route\n\n add: (method, path, handler, meta = {}) => {\n this.#addRoute(null, method, path, handler, meta);\n },\n\n // Set server adapter\n useAdapter: (adapter) => {\n this.#adapter = adapter;\n return this;\n },\n\n // Configure hooks\n hooks: (hooks) => {\n this.#hooks = { ...this.#hooks, ...hooks };\n return this;\n },\n\n // Start listening server\n listen: async (opts = {}) => {\n this.#liveConfig = { ...this.config, ...opts };\n this.#live = true;\n this.#initializeFactories();\n const relay = useContext('relay');\n const port = this.#liveConfig.port || 3000;\n const host = this.#liveConfig.host || '0.0.0.0';\n const log = useContext('log');\n \n // Create kernel with services\n const kernel = new Kernel();\n\n // Configure kernel hooks\n kernel.hooks(this.#hooks);\n\n // 1) Register app routes first\n kernel.registerRoutes(this.#routes);\n\n // 2) Add system routes (won't shadow user routes)\n kernel.registerRoutes([\n {\n method: 'GET',\n path: '/health',\n handler: (ctx) => ctx.respond.json({\n status: 'ok',\n timestamp: new Date().toISOString(),\n mode: this.#liveConfig.mode || 'production'\n })\n },\n {\n method: 'GET',\n path: '/api/info',\n handler: (ctx) => ctx.respond.json({\n name: 'Clovie',\n version: '1.0.0',\n mode: this.#liveConfig.mode || 'production',\n routes: this.#routes.length\n })\n }\n ]);\n\n // 3) Configure static file serving as 404 fallback\n if (this.#liveConfig.outputDir) {\n kernel.setStaticFallback(this.#liveConfig.outputDir, (ctx, outputDir) => {\n return this.#serveStaticFile(ctx, outputDir);\n });\n }\n\n // 4) Boot adapter with middleware support\n if (!this.#adapter) {\n // Choose adapter based on config\n if (this.#liveConfig.adapter === 'express' || this.#liveConfig.middleware?.length > 0) {\n const { ExpressAdapter } = await import('./adapters/ExpressAdapter.js');\n this.#adapter = ExpressAdapter.create();\n log.debug('Using Express adapter for middleware support');\n } else {\n this.#adapter = HttpAdapter.create();\n log.debug('Using HTTP adapter');\n }\n }\n\n // Pass configuration to adapter\n await this.#adapter.initialize(kernel, this.#liveConfig, log);\n\n if (typeof this.#adapter.registerKernelHandler === 'function') {\n this.#adapter.registerKernelHandler(this.#liveConfig);\n }\n \n // Start the server and return the instance\n const server = await this.#adapter.start({ port, host });\n \n // Display pretty server ready message\n const actualPort = server.address()?.port || port;\n await displayServerReady({ \n port: actualPort, \n host, \n mode: this.#liveConfig.mode || 'production' \n }, log);\n \n // Broadcast server ready event\n relay.broadcast('server:ready', server);\n return server;\n },\n\n // Get all routes\n getRoutes: () => this.#routes,\n\n // Clear all routes (useful for testing)\n clearRoutes: () => {\n this.#routes = [];\n },\n\n // Stop the server\n stop: async () => {\n if (this.#adapter) {\n await this.#adapter.stop();\n }\n },\n\n // Check if server is running\n isRunning: () => this.#adapter && this.#adapter.isRunning(),\n\n // Get the underlying HTTP server (for Socket.IO integration)\n getHttpServer: () => {\n if (this.#adapter) {\n return this.#adapter.getHttpServer();\n }\n return null;\n }\n };\n }\n /**\n * Serve static files from the output directory\n * @private\n */\n\n #addRoute(basePath = '', method, path, handler, meta = {}, children = []) {\n if (basePath) {\n path = basePath + path;\n }\n if (Array.isArray(children)) {\n for (const child of children) {\n if (typeof child === 'function') {\n if (!this.#live) {\n this.#factories.push(child);\n } else {\n this.#use(child);\n }\n } else {\n this.#addRoute(path, child.method, child.path, child.handler, child.meta, child.children);\n }\n }\n } else if (typeof children === 'function') {\n if (!this.#live) {\n this.#factories.push(children);\n } else {\n this.#use(children);\n }\n }\n\n this.#routes.push({\n method: method.toUpperCase(),\n path,\n handler,\n meta\n });\n }\n\n #initializeFactories() {\n if (!this.#live) {\n return;\n }\n\n if (this.#factories.length === 0) {\n return;\n }\n\n this.#use(...this.#factories);\n this.#factories = [];\n }\n\n #use(...factories) {\n try {\n for (const factory of factories) {\n const type = definitionType(factory);\n switch (type) {\n case 'routes':\n const routes = factory(this.useContext, this.#liveConfig);\n if (Array.isArray(routes)) {\n for (const route of routes) {\n this.#addRoute(null, route.method, route.path, route.handler, route.meta, route.children);\n }\n } else {\n throw new Error('Routes must be an array');\n }\n break;\n\n case 'route':\n const route = factory(this.useContext, this.#liveConfig);\n if (typeof route === 'object' && route !== null) {\n this.#addRoute(null, route.method, route.path, route.handler, route.meta, route.children);\n } else {\n throw new Error('Route must be an object');\n }\n break;\n\n case 'hooks':\n const hooks = factory(this.useContext, this.#liveConfig);\n if (typeof hooks === 'object' && hooks !== null) {\n this.#hooks = { ...this.#hooks, ...hooks };\n } else {\n throw new Error('Hooks must be an object');\n }\n break;\n \n case 'hook':\n const hook = factory(this.useContext, this.#liveConfig);\n if (typeof hook === 'function') {\n this.#hooks = { ...this.#hooks, ...hook };\n } else {\n throw new Error('Hook must be a function');\n }\n break;\n\n default:\n throw new Error(`Invalid factory type: ${type}`);\n }\n }\n } catch (error) {\n console.error(`\\n\u274C Error using factories: ${error.message}\\n`);\n throw error;\n }\n }\n\n async #serveStaticFile(context, outputDir) {\n const fs = await import('fs/promises');\n const path = await import('path');\n \n try {\n // Get the requested file path\n const requestPath = context.req.path === '/' ? '/index.html' : context.req.path;\n let filePath = path.join(outputDir, requestPath);\n let stats;\n \n try {\n // Try the path as-is first\n stats = await fs.stat(filePath);\n } catch (error) {\n // If it fails and has no extension, try adding .html\n const ext = path.extname(requestPath);\n if (!ext) {\n const htmlPath = path.join(outputDir, `${requestPath}.html`);\n try {\n stats = await fs.stat(htmlPath);\n filePath = htmlPath; // Use the .html version\n } catch (htmlError) {\n // Neither worked, return 404\n return context.respond.text('Not Found', 404);\n }\n } else {\n // Had an extension but file not found\n return context.respond.text('Not Found', 404);\n }\n }\n \n if (stats.isFile()) {\n // Determine content type\n const ext = path.extname(filePath);\n const contentType = this.#getContentType(ext);\n \n // Read and serve the file\n const content = await fs.readFile(filePath);\n \n // Serve with correct content type\n if (contentType === 'text/html') {\n return context.respond.html(content.toString(), 200);\n } else if (contentType === 'text/css') {\n return context.respond.text(content.toString(), 200, { 'Content-Type': 'text/css' });\n } else if (contentType === 'application/javascript') {\n return context.respond.text(content.toString(), 200, { 'Content-Type': 'application/javascript' });\n } else if (contentType.startsWith('text/')) {\n return context.respond.text(content.toString(), 200, { 'Content-Type': contentType });\n } else {\n // For binary files, send as file response\n return context.respond.file(filePath, 200, { 'Content-Type': contentType });\n }\n } else {\n return context.respond.text('Not Found', 404);\n }\n } catch (error) {\n return context.respond.text('Not Found', 404);\n }\n }\n\n /**\n * Get content type based on file extension\n * @private\n */\n #getContentType(ext) {\n const types = {\n '.html': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.json': 'application/json',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.eot': 'application/vnd.ms-fontobject'\n };\n \n return types[ext.toLowerCase()] || 'application/octet-stream';\n }\n}", "import { createDefinition } from '@jucie.io/engine';\n\nexport const defineRoutes = createDefinition('routes', [Array]);\nexport const defineRoute = createDefinition('route', [Object]);", "import { createDefinition } from '@jucie.io/engine';\n\nexport const defineHooks = createDefinition('hooks', [Object]);\nexport const defineHook = createDefinition('hook', [Function]);"],
5
+ "mappings": "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",
6
+ "names": ["parseBody", "req", "resolve", "contentType", "body", "chunk", "parseUrlEncoded", "data", "result", "pairs", "pair", "key", "value", "decodedKey", "decodedValue", "arrayKey", "parseQuery", "searchParams", "init_httpParsing", "__esmMin", "AdapterInterface", "RespondHelpers", "init_AdapterInterface", "__esmMin", "init_httpParsing", "name", "kernel", "opts", "log", "options", "req", "res", "url", "k", "v", "parseQuery", "response", "isHead", "resp", "b", "chunk", "r", "filePath", "fs", "fsp", "path", "pipeline", "promisify", "pipelineAsync", "MIME", "st", "ext", "rs", "error", "data", "status", "headers", "body", "location", "ExpressAdapter_exports", "__export", "ExpressAdapter", "init_ExpressAdapter", "__esmMin", "init_AdapterInterface", "AdapterInterface", "#connections", "express", "kernel", "opts", "log", "#hasBodyParser", "index", "middleware", "error", "req", "res", "port", "host", "resolve", "reject", "err", "conn", "ctx", "response", "middlewareArray", "mw", "name", "GLOBAL_NS_OBJ", "checkType", "value", "expectedType", "name", "type", "matchesType", "typeNames", "getTypeName", "createTypeChecker", "DefinitionTypes", "Definitions", "definitionType", "definition", "createDefinition", "type", "returnTypes", "returnTypeChecker", "createTypeChecker", "name", "factory", "defaultArgs", "args", "combinedArgs", "res", "error", "BAD_KEYS", "RESERVED_NAMESPACES", "MAX_NAME_LENGTH", "VALID_NAME", "assertSafeKey", "key", "where", "assertNamespace", "ns", "defineMiddleware", "createDefinition", "defineActions", "defineUninstall", "defineInitialize", "defineGetters", "DefinitionBuilder", "_DefinitionBuilder", "namespace", "#ns", "#args", "#slots", "#set", "type", "factory", "creator", "defineMiddleware", "defineGetters", "defineActions", "defineInitialize", "defineUninstall", "ServiceProvider", "_ServiceProvider", "#services", "options", "useContext", "config", "namespace", "assertNamespace", "instance", "keys", "builder", "DefinitionBuilder", "setupContext", "factory", "maybe", "error", "ENGINE_CONTEXT", "compileRoute", "pattern", "pat", "pathname", "Kernel", "#routes", "#appHandlers", "#hooks", "#staticFallback", "rawRoutes", "r", "route", "compiledRoute", "compileRoute", "handlers", "handler", "h", "outputDir", "ctx", "response", "onReqOut", "handlerResponse", "handlerError", "matchParams", "m", "staticResponse", "preOut", "err", "init_AdapterInterface", "init_httpParsing", "http", "HttpAdapter", "AdapterInterface", "#connections", "kernel", "opts", "log", "port", "host", "req", "res", "#simulateMiddleware", "parseBody", "ctx", "out", "error", "conn", "resolve", "reject", "err", "middlewareArray", "middleware", "nextCalled", "next", "data", "chalk", "exec", "promisify", "execAsync", "displayServerReady", "port", "host", "mode", "logger", "url", "line", "openBrowser", "error", "platform", "command", "Server", "ServiceProvider", "#routes", "#adapter", "#hooks", "#live", "#liveConfig", "#factories", "useContext", "factories", "method", "path", "handler", "meta", "#addRoute", "adapter", "hooks", "opts", "#initializeFactories", "relay", "port", "host", "log", "kernel", "Kernel", "ctx", "outputDir", "#serveStaticFile", "ExpressAdapter", "HttpAdapter", "server", "actualPort", "displayServerReady", "basePath", "children", "child", "#use", "factory", "type", "definitionType", "routes", "route", "hook", "error", "context", "fs", "requestPath", "filePath", "stats", "htmlPath", "ext", "contentType", "#getContentType", "content", "defineRoutes", "createDefinition", "defineRoute", "defineHooks", "createDefinition", "defineHook"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var K=Object.freeze(Object.create(null));function _(s,e,t="value"){if(Array.isArray(e)){for(let r of e)if(j(s,r))return!0;let n=e.map(g).join(" | ");throw new TypeError(`${t} must be one of: ${n}. Got ${g(s)}`)}if(!j(s,e))throw new TypeError(`${t} must be ${g(e)}. Got ${g(s)}`);return!0}function j(s,e){return e===String?typeof s=="string":e===Number?typeof s=="number"&&!isNaN(s):e===Boolean?typeof s=="boolean":e===Symbol?typeof s=="symbol":e===BigInt?typeof s=="bigint":e===Function?typeof s=="function":e===Array?Array.isArray(s):e===Object?s!==null&&typeof s=="object"&&!Array.isArray(s):s instanceof e}function g(s){return s===String?"String":s===Number?"Number":s===Boolean?"Boolean":s===Array?"Array":s===Object?"Object":s===Function?"Function":s===Date?"Date":s===RegExp?"RegExp":s===Promise?"Promise":s===Map?"Map":s===Set?"Set":s===WeakMap?"WeakMap":s===WeakSet?"WeakSet":s===Symbol?"Symbol":s===BigInt?"BigInt":s===Error?"Error":typeof s=="string"?"string":typeof s=="number"?"number":typeof s=="boolean"?"boolean":typeof s=="symbol"?"symbol":typeof s=="bigint"?"bigint":typeof s=="function"?"function":Array.isArray(s)?"Array":s===null?"null":s===void 0?"undefined":typeof s=="object"?s.constructor?.name||"Object":"unknown"}function d(s,e="value"){return t=>_(t,s,e)}var b=new Map,F=new WeakMap;var h=(s,e=[])=>{let t=e.length>0?d(e,"return value"):null;if(b.has(s))return console.warn(`Definition type "${s}" already exists`),b.get(s);let n=(r,o,...i)=>{d(String,"name")(r),d(Function,"factory")(o);let c=(...a)=>{try{let f=[...a,...i],u=o(...f);if(t&&u===void 0)throw new Error(`Factory ${s} must return a value for ${r}`);return t&&t(u),u}catch(f){throw console.error(`Error creating definition "${r}"`,f),f}};return Object.defineProperty(c,"_name",{value:r,enumerable:!1,configurable:!1}),F.set(c,s),c};return b.set(s,n),n};var V=new Set(["__proto__","prototype","constructor"]),B=new Set(["use","install","uninstall","relay","state","debug"]),N=64,G=/^[a-zA-Z_$][a-zA-Z_$0-9]*$/;function W(s,e="key"){if(V.has(s))throw new Error(`Illegal key "${s}" in ${e}`)}function A(s){if(W(s,"namespace"),typeof s!="string")throw new Error(`Namespace must be a string, got ${typeof s}`);if(!G.test(s))throw new Error(`Invalid namespace "${s}". Must be a valid JS identifier`);if(s.length>N)throw new Error(`Namespace "${s}" too long (max ${N} chars)`);if(B.has(s))throw new Error(`Namespace "${s}" is reserved`);return s}var p=h("MIDDLEWARE",[Function,Array]),E=h("ACTIONS",[Object]),x=h("UNINSTALL"),S=h("INITIALIZE"),C=h("GETTERS",[Object]);var y=class s{static create(e){return new s(e)}#e;#r;#n={MIDDLEWARE:null,GETTERS:null,ACTIONS:null,INITIALIZE:null,UNINSTALL:null};constructor(e){this.#e=e}#t(e,t,n){if(this.#n[e])throw new Error(`${e} already defined for ${this.#e}`);this.#n[e]=n(this.#e,t)}defineMiddleware=e=>this.#t("MIDDLEWARE",e,p);defineGetters=e=>this.#t("GETTERS",e,C);defineActions=e=>this.#t("ACTIONS",e,E);defineInitialize=e=>this.#t("INITIALIZE",e,S);defineUninstall=e=>this.#t("UNINSTALL",e,x);_toArray(){return[this.#n.MIDDLEWARE,this.#n.GETTERS,this.#n.ACTIONS,this.#n.INITIALIZE,this.#n.UNINSTALL].filter(Boolean)}};var l=class s{static#e=new Set;static manifest={name:"base",dependencies:[],version:"1.0.0",description:"Base extension template"};static config=null;static unique=!1;static configure(e={}){return{install:(t,n)=>this.install(t,n),manifest:this.manifest,config:{...this.config||this.manifest.defaults||{},...e},unique:!0,configured:!0}}static install(e,t){try{let{namespace:n}=this.manifest;A(n);let r=new this;s.#e.add(r),Object.defineProperty(r,"config",{value:Object.freeze({...t}),writable:!1,configurable:!1,enumerable:!1}),Object.defineProperty(r,"context",{get:()=>e(),configurable:!1,enumerable:!1}),Object.defineProperty(r,"useContext",{value:(...i)=>e(...i),writable:!1,configurable:!1,enumerable:!1});let o=y.create(n);if(r.setup){let i={defineActions:a=>o.defineActions(()=>a(e,t)),defineMiddleware:a=>o.defineMiddleware(()=>a(e,t)),defineGetters:a=>o.defineGetters(()=>a(e,t)),defineInitialize:a=>o.defineInitialize(()=>a(e,t)),defineUninstall:a=>o.defineUninstall(()=>a(e,t))},c=r.setup(i);return c?.then?c.then(()=>o._toArray()):o._toArray()}return r.middleware&&o.defineMiddleware(()=>r.middleware(e,t)),r.getters&&o.defineGetters(()=>r.getters(e,t)),r.actions&&o.defineActions(()=>r.actions(e,t)),r.initialize&&o.defineInitialize(()=>r.initialize(e,t)),r.uninstall&&o.defineUninstall(()=>r.uninstall(e,t)),o._toArray()}catch(n){throw n}}};var He=Symbol("jucie.engine");import{Manager as J}from"socket.io-client";var O=Symbol("DEFAULT_NAMESPACE"),m=class extends l{#e=null;#r=new Map;#n={onConnect:new Set,onDisconnect:new Set,onError:new Set};static manifest={name:"socket-client",namespace:"socket",defaults:{url:null,auth:null,options:{path:"/socket.io",transports:["websocket","polling"],timeout:2e4,autoConnect:!0,reconnection:!0,reconnectionAttempts:5,reconnectionDelay:1e3,withCredentials:!1}}};initialize(e,t={}){if(t.url)return t.options||(t.options={}),this.#t(t.url,t.options),this}actions(e,t={}){return{initialize:(n,r={})=>{if(!n)throw new Error("URL is required");return r={...this.config.options,...r},this.#t(n,r),this},create:(n,r={})=>{let o=this.#r.get(O);r=r.auth?{...r}:{...r,auth:o.auth};let i=this.#e.socket(`/${n}`,r);return this.#r.set(n,i),i},get:n=>this.#r.get(n||O),destroy:n=>{let r=this.#r.get(n);r&&r.disconnect(),this.#r.delete(n)},onConnect:n=>(this.#n.onConnect.add(n),()=>this.#n.onConnect.delete(n)),onDisconnect:n=>(this.#n.onDisconnect.add(n),()=>this.#n.onDisconnect.delete(n)),onError:n=>(this.#n.onError.add(n),()=>this.#n.onError.delete(n))}}#t(e,t={},n=null){if(this.#e)return this;this.#e=new J(e,{...t});let r=this.#e.socket("/",{auth:n});return this.#r.set(O,r),this.#s(r),this}#s(e){e.on("connect_error",t=>{this.#n.onError.forEach(n=>n(t))}),e.on("connect",()=>{this.#n.onConnect.forEach(t=>t())}),e.on("disconnect",()=>{this.#n.onDisconnect.forEach(t=>t())})}};var T=class extends l{#e=new Map;#r=new Map;#n=new Map;#t=new Map;#s=null;#o=[];#i=null;static manifest={name:"signal",namespace:"signal",dependencies:[m],defaults:{namespace:"signal",jwtSecret:null}};actions(e,t={}){this.#i=e.socket.create(t.namespace),console.log("signal client socket",this.#i),this.#i.on("connection",o=>{console.log("signal user connected",o.id)}),this.#i.connect();let n=p("signal",(o,i,c)=>c());return[actions("signal",o=>({encodeToken:(i,c={})=>new Promise((a,f)=>{this.#i.emit("create-token",i,c,u=>{a(u)})}),requestAccess:(i,...c)=>{this.#i.emit("request-access",i,...c)},onRequestAccess:i=>{e.events.on("request-access",i)},onAccessGranted:i=>{e.events.on("access-granted",i)},onAccessDenied:i=>{e.events.on("access-denied",i)},addAuthHandler:i=>{this.#o.push(i)},join:(i,c)=>{this.#i.emit("join",i,c)},from:(i=this.#s)=>({subscribe:(c,a)=>{this.#c("publish",i,c,a)},once:(c,a)=>{this.#c("publish",i,c,a,!0)}}),to:(i=this.#s)=>{if(!this.#e.has(i))throw new Error(`Room ${i} not found`);return{publish:(c,...a)=>{this.#u("publish",i,c,a)}}},publish:(i,...c)=>{this.#u("publish",this.#s,i,c)},subscribe:(i,c)=>{this.#c("publish",this.#s,i,c)},once:(i,c)=>{this.#c("publish",this.#s,i,c,!0)},onChannelOpen:(i,c)=>{this.#t.has(i)||this.#t.set(i,{open:null,close:null}),this.#t.get(i).open=c},onChannelClose:(i,c)=>{this.#t.has(i)||this.#t.set(i,{open:null,close:null}),this.#t.get(i).close=c}})),n]}#a(e,t,n){n.candidate?this.#i.emit("ice-candidate",e,t,n.candidate):console.log("All ICE candidates have been sent")}async#l(e,t,n){if(!this.#e.has(t))throw new Error(`Room ${t} not found`);if(!this.#e.get(t).has(n))throw new Error(`Peer ${n} not found in room ${t}`);let r=this.#e.get(t).get(n);switch(e){case"offer":let o=await r.createOffer();return await r.setLocalDescription(o),o;case"answer":let i=await r.createAnswer();return await r.setLocalDescription(i),i}}#h(e,t){this.#e.has(e)||this.#e.set(e,new Map);let n=new RTCPeerConnection({iceServers:[{urls:"stun:stun.l.google.com:19302"},{urls:["turn:165.227.218.103:3478?transport=udp","turn:165.227.218.103:3478?transport=tcp","turns:165.227.218.103:443?transport=tcp"],username:"webrtcuser",credential:"demoPass123"}]});return this.#e.get(e).set(t,n),n}#f(e,t){if(!this.#e.has(e))throw new Error(`Room ${e} not found`);if(!this.#e.get(e).has(t))throw new Error(`Peer ${t} not found in room ${e}`);let r=this.#e.get(e).get(t).createDataChannel(e);return this.#d(e,r),r}#d(e,t){t.onopen=()=>{this.#t.get(e)?.open&&(this.#t.get(e).open(),this.#t.get(e).open=null)},t.onmessage=({data:n})=>{let r=t.label,{type:o,event:i,payload:c}=JSON.parse(n);this.#p(r,o,i,c)},t.onclose=()=>{this.#t.get(e)?.close&&(this.#t.get(e).close(),this.#t.get(e).close=null)},this.#n.has(e)?this.#n.get(e).push(t):this.#n.set(e,[t])}#c(e,t,n,r,o=!1){let i=this.#r.get(t)||new Map;i.has(n)||i.set(n,[]);let c={handler:r,once:o};return i.get(n).push(c),this.#r.set(t,i),console.log("subscribers",this.#r.get(t)),()=>{i.get(n).splice(i.get(n).indexOf(c),1)}}#u(e,t,n,r){let o=this.#n.get(t);if(!o)throw new Error(`Channel ${t} not found`);o.forEach(i=>i.send(JSON.stringify({type:e,event:n,payload:r})))}#p(e,t,n,r){try{let o=this.#r.get(e);if(o){let i=o.get(n);if(i)for(let c of i)typeof c.handler=="function"&&c.handler(...r),c.once&&i.splice(i.indexOf(c),1)}}catch(o){console.error("Error calling subscribers",o)}}};import{Server as Y}from"socket.io";var I=Symbol("DEFAULT_NAMESPACE"),w=class extends l{#e=null;#r=new Map;#n=new Map;static manifest={name:"socket-server",namespace:"socket",defaults:{cors:{},options:{transports:["websocket","polling"]},auth:null}};initialize(e,t={}){let n=e("server");if(!n)return;let r=n.getHttpServer();if(console.log("httpServer",r),!!r)return this.#t(r),this}actions(e){let t={start:n=>{if(n=n||e("server").getHttpServer(),!n)throw new Error("HTTP server not found");return this.#t(n),t},create:(n,r={})=>{let o=this.#e.of(`/${n}`);return this.#r.set(n,o),o},get:(n=I)=>this.#r.has(n)?this.#r.get(n):this.#e.of(`/${n}`),destroy:n=>{if(!this.#e)throw new Error("Socket server not initialized");let r=this.#r.get(n);return r&&r.close(),this.#r.delete(n),t}};return t}#t(e){this.#e=new Y(e,{...this.config});let t=this.#e.of("/");return this.#s(t),this.#o(t),this.#r.set(I,t),this}#s(e){e.on("connect_error",t=>{console.error("Socket connection error:",t)})}#o(e){e.on("connect",t=>{console.log("Socket connected!")})}};import P from"jsonwebtoken";var M=class extends l{#e=null;static manifest={name:"signal-server",namespace:"signal",dependencies:[w],defaults:{namespace:"signal"}};initialize(e,t){let n=e("socket");this.#e=n.create(t.namespace),this.#e.on("connection",r=>this.#r(r))}getters(){return{namespace:()=>this.#e,connections:()=>this.#e.engine.clientsCount,sockets:()=>this.#e.sockets,socket:e=>this.#e.sockets.get(e)}}#r(e){try{e.on("request-access",(t,...n)=>this.#n(e,t,n)),e.on("access-granted",(t,...n)=>this.#t(e,t,n)),e.on("access-denied",(t,...n)=>this.#s(e,t,n)),e.on("create-token",(t,n={},r)=>this.#o(t,n,r)),e.on("join",(t,n)=>this.#i(e,t,n)),e.on("signal",(t,n,r)=>this.#a(e,t,n,r)),e.on("ice-candidate",(t,n,r)=>this.#l(e,t,n,r)),e.on("member-metadata",({roomId:t,metadata:n,targetMemberId:r})=>this.#h(e,{roomId:t,metadata:n,targetMemberId:r})),e.on("disconnect",()=>this.#f(e))}catch(t){console.error("Error handling connection:",t)}finally{console.log("Connection handled")}}#n(e,t,n){try{let r=P.verify(t,config.jwtSecret);if(!r)throw new Error("Invalid token");let{id:o}=r,i=e.adapter.rooms.get(o);if(!i)throw new Error("Room not found");if(Array.from(i).filter(a=>a!==e.id).length===0)throw new Error("Room has no members");e.to(o).emit("request-access",e.id,r,...n)}catch(r){e.emit("signal-error",{message:r.message})}}#t(e,t,n){try{e.to(t).emit("access-granted",...n)}catch(r){console.error("Error sending access granted:",r)}}#s(e,t,n){try{e.to(t).emit("access-denied",...n)}catch(r){console.error("Error sending access denied:",r)}}#o(e,t={},n){try{let r=P.sign(e,config.jwtSecret,t);n(r)}catch(r){console.error("Error creating token:",r)}}#i(e,t,n){try{e.join(t),e.to(t).emit("peer-joined",t,e.id,n),console.log(`Signal user ${e.id} joined room: ${t}`)}catch(r){console.error("Error joining room:",r)}}#a(e,t,n,r){try{e.to(n).emit("signal",t,e.id,r)}catch(o){console.error("Error sending signal:",o)}}#l(e,t,n,r){try{e.to(n).emit("ice-candidate",t,e.id,r)}catch(o){console.error("Error sending ICE candidate:",o)}}#h(e,{roomId:t,metadata:n,targetMemberId:r}){e.to(r).emit("room-metadata",{roomId:t,metadata:n})}#f(e){let n=Array.from(e.rooms).filter(r=>r!==e.id);n.forEach(r=>{e.to(r).emit("peer-left",r,e.id)}),console.log(`Signal user ${e.id} disconnected from rooms: ${n.join(", ")}`)}};export{T as SignalClient,M as SignalServer};
2
+ //# sourceMappingURL=signal.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lib/relay/src/Relay.js", "../../src/utils/typeChecker.js", "../../src/definitions/createDefinition.js", "../../src/utils/asserts.js", "../../src/definitions/defaults.js", "../../src/definitions/DefinitionBuilder.js", "../../src/ServiceProvider.js", "../../src/global.js", "../../services/socket/src/SocketClient.js", "../../services/signal/src/SignalClient.js", "../../services/socket/src/SocketServer.js", "../../services/signal/src/SignalServer.js"],
4
+ "sourcesContent": ["// Simple, readable relay with wildcard matching and no indexing\n\nconst GLOBAL_NS_OBJ = Object.freeze(Object.create(null));\n\nfunction queueMicrotask(fn) {\n if (globalThis.queueMicrotask && typeof globalThis.queueMicrotask === 'function') {\n globalThis.queueMicrotask(fn);\n return;\n }\n setTimeout(fn, 0);\n}\n\nclass Channel {\n #nsObj; #relay;\n constructor(nsObj, relay) { this.#nsObj = nsObj; this.#relay = relay; }\n\n // Any source -> me\n on(event, handler) {\n return this.#relay.subscribe(event, GLOBAL_NS_OBJ, this.#nsObj, handler);\n }\n\n once(event, handler) {\n return this.#relay.once(event, GLOBAL_NS_OBJ, this.#nsObj, handler);\n }\n\n // Me -> everyone (sender never hears itself)\n broadcast(event, ...payload) {\n this.#relay.publish(event, this.#nsObj, GLOBAL_NS_OBJ, payload);\n }\n\n // Specific source -> me\n from(fromNs) {\n return {\n subscribe: (event, handler) => this.#relay.subscribe(event, fromNs, this.#nsObj, handler),\n once: (event, handler) => this.#relay.once(event, fromNs, this.#nsObj, handler),\n };\n }\n\n // Me -> specific target\n to(toNs) {\n return {\n publish: (event, ...payload) => this.#relay.publish(event, this.#nsObj, toNs, payload),\n publishAsync: (event, ...payload) => this.#relay.publishAsync(event, this.#nsObj, toNs, payload),\n };\n }\n}\n\nexport class Relay {\n #channels = new WeakMap(); // nsObj -> Channel\n #events = new Map(); // eventName -> Set<Listener>\n #onError = null;\n\n static create(config = {}) {\n return new Relay(config);\n }\n\n constructor({ onError = null } = {}) {\n this.#onError = onError;\n this.createChannel(GLOBAL_NS_OBJ);\n }\n\n // Public convenience\n channel(nsObj) { return this.createChannel(nsObj); }\n createChannel(nsObj) {\n if (this.#channels.has(nsObj)) return this.#channels.get(nsObj);\n const ch = new Channel(nsObj, this);\n this.#channels.set(nsObj, ch);\n return ch;\n }\n\n // Internal helpers\n #listeners(event) {\n let set = this.#events.get(event);\n if (!set) { set = new Set(); this.#events.set(event, set); }\n return set;\n }\n\n // Wildcard matcher:\n // - If published `from` is GLOBAL, it matches every listener.from\n // - If listener.from is GLOBAL, it matches every published from\n // Same for `to`. This makes broadcast (to = GLOBAL) hit specific targets too.\n static #matchSide(published, constraint) {\n return published === GLOBAL_NS_OBJ || constraint === GLOBAL_NS_OBJ || published === constraint;\n }\n\n static #matches(publishedFrom, publishedTo, listenerFrom, listenerTo) {\n return Relay.#matchSide(publishedFrom, listenerFrom)\n && Relay.#matchSide(publishedTo, listenerTo);\n }\n\n subscribe(event, from, to, handler) {\n const listener = { from, to, handler };\n this.#listeners(event).add(listener);\n return () => {\n const set = this.#events.get(event);\n if (set) set.delete(listener);\n };\n }\n\n once(event, from, to, handler) {\n let off = null;\n const wrapped = (payload) => {\n try { handler(payload); } finally { off && off(); }\n };\n off = this.subscribe(event, from, to, wrapped);\n return off;\n }\n\n offAllFor(nsObj) {\n for (const set of this.#events.values()) {\n for (const l of Array.from(set)) {\n if (l.from === nsObj || l.to === nsObj) set.delete(l);\n }\n }\n }\n\n listenerCount(event) {\n const set = this.#events.get(event);\n return set ? set.size : 0;\n }\n\n #deliver(event, from, to, payload) {\n const set = this.#events.get(event);\n if (!set || set.size === 0) return;\n\n for (const l of set) {\n // Always skip self-delivery\n if (l.to === from) continue;\n\n if (Relay.#matches(from, to, l.from, l.to)) {\n try { l.handler(...payload); }\n catch (err) { if (this.#onError) this.#onError(err, { event, from, to, listener: l }); }\n }\n }\n }\n\n publish(event, from, to, payload) {\n this.#deliver(event, from, to, payload);\n }\n\n publishAsync(event, from, to, payload) {\n queueMicrotask(() => this.#deliver(event, from, to, payload));\n }\n\n broadcast(event, from, payload) {\n this.publish(event, from, GLOBAL_NS_OBJ, payload);\n }\n}\n", "/**\n * Type Checker Utility\n * \n * Supports syntax like:\n * - createDefinition('action', [Array, Function]) // Array or Function\n * - createDefinition('name', String) // Must be String\n * - createDefinition('items', Array) // Must be Array\n * - createDefinition('callback', Function) // Must be Function\n * - createDefinition('value', [String, Number]) // String or Number\n */\n\n/**\n * Type definitions mapping constructor names to actual constructors\n */\nconst TYPE_MAP = {\n String,\n Number,\n Boolean,\n Array,\n Object,\n Function,\n Date,\n RegExp,\n Promise,\n Map,\n Set,\n WeakMap,\n WeakSet,\n Symbol,\n BigInt,\n Error,\n TypeError,\n RangeError,\n ReferenceError,\n SyntaxError,\n EvalError,\n URIError\n};\n\n/**\n * Checks if a value matches the expected type(s)\n * @param {*} value - The value to check\n * @param {Function|Array<Function>} expectedType - Single type or array of possible types\n * @param {string} name - Name of the parameter for error messages\n * @returns {boolean} - True if value matches expected type(s)\n */\nexport function checkType(value, expectedType, name = 'value') {\n // Handle array of possible types\n if (Array.isArray(expectedType)) {\n for (const type of expectedType) {\n if (matchesType(value, type)) {\n return true;\n }\n }\n \n const typeNames = expectedType.map(getTypeName).join(' | ');\n throw new TypeError(`${name} must be one of: ${typeNames}. Got ${getTypeName(value)}`);\n }\n \n // Handle single type\n if (!matchesType(value, expectedType)) {\n throw new TypeError(`${name} must be ${getTypeName(expectedType)}. Got ${getTypeName(value)}`);\n }\n \n return true;\n}\n\n/**\n * Checks if a value matches a specific type\n * @param {*} value - The value to check\n * @param {Function} type - The expected constructor/type\n * @returns {boolean} - True if value matches the type\n */\nfunction matchesType(value, type) {\n // Handle primitive constructors\n if (type === String) {\n return typeof value === 'string';\n }\n if (type === Number) {\n return typeof value === 'number' && !isNaN(value);\n }\n if (type === Boolean) {\n return typeof value === 'boolean';\n }\n if (type === Symbol) {\n return typeof value === 'symbol';\n }\n if (type === BigInt) {\n return typeof value === 'bigint';\n }\n if (type === Function) {\n return typeof value === 'function';\n }\n \n // Handle object constructors (including Array, Object, Date, etc.)\n if (type === Array) {\n return Array.isArray(value);\n }\n if (type === Object) {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n }\n \n // Handle other constructors (Date, RegExp, Map, Set, etc.)\n return value instanceof type;\n}\n\n/**\n * Gets a human-readable name for a type\n * @param {*} value - The value or constructor to get name for\n * @returns {string} - Human-readable type name\n */\nfunction getTypeName(value) {\n if (value === String) return 'String';\n if (value === Number) return 'Number';\n if (value === Boolean) return 'Boolean';\n if (value === Array) return 'Array';\n if (value === Object) return 'Object';\n if (value === Function) return 'Function';\n if (value === Date) return 'Date';\n if (value === RegExp) return 'RegExp';\n if (value === Promise) return 'Promise';\n if (value === Map) return 'Map';\n if (value === Set) return 'Set';\n if (value === WeakMap) return 'WeakMap';\n if (value === WeakSet) return 'WeakSet';\n if (value === Symbol) return 'Symbol';\n if (value === BigInt) return 'BigInt';\n if (value === Error) return 'Error';\n \n if (typeof value === 'string') return 'string';\n if (typeof value === 'number') return 'number';\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'symbol') return 'symbol';\n if (typeof value === 'bigint') return 'bigint';\n if (typeof value === 'function') return 'function';\n if (Array.isArray(value)) return 'Array';\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'object') {\n return value.constructor?.name || 'Object';\n }\n \n return 'unknown';\n}\n\n/**\n * Creates a type checker function for a specific parameter\n * @param {Function|Array<Function>} expectedType - Expected type(s)\n * @param {string} name - Parameter name\n * @returns {Function} - Type checker function\n */\nexport function createTypeChecker(expectedType, name = 'value') {\n return (value) => checkType(value, expectedType, name);\n}\n\n/**\n * Validates an object against a schema\n * @param {Object} obj - Object to validate\n * @param {Object} schema - Schema definition { prop: Type, prop2: [Type1, Type2] }\n * @param {string} objName - Name of the object for error messages\n */\nexport function validateObject(obj, schema, objName = 'object') {\n if (!obj || typeof obj !== 'object') {\n throw new TypeError(`${objName} must be an object`);\n }\n \n for (const [prop, expectedType] of Object.entries(schema)) {\n if (prop in obj) {\n checkType(obj[prop], expectedType, `${objName}.${prop}`);\n }\n }\n}\n\n/**\n * Creates a validator function for an object schema\n * @param {Object} schema - Schema definition\n * @param {string} objName - Name of the object\n * @returns {Function} - Validator function\n */\nexport function createObjectValidator(schema, objName = 'object') {\n return (obj) => validateObject(obj, schema, objName);\n}\n\n// Export the type map for advanced usage\nexport { TYPE_MAP };\n", "const DefinitionTypes = new Map();\nconst Definitions = new WeakMap();\nimport { createTypeChecker } from '../utils/typeChecker.js';\n\n/**\n * Creates a definition type with return type validation\n * @param {string} type - The definition type name\n * @param {Function|Array<Function>} returnTypes - Expected return type(s)\n * @returns {Function} - Definition creator function\n */\n\n\nexport const definitionType = (definition) => {\n if (Definitions.has(definition)) {\n return Definitions.get(definition);\n }\n return undefined;\n}\n\nexport const createDefinition = (type, returnTypes = []) => { \n // Create type checker for return values if returnTypes specified\n const returnTypeChecker = returnTypes.length > 0 ? createTypeChecker(returnTypes, 'return value') : null;\n \n if (DefinitionTypes.has(type)) {\n console.warn(`Definition type \"${type}\" already exists`);\n return DefinitionTypes.get(type);\n }\n\n const definitionType = (name, factory, ...defaultArgs) => {\n // Validate inputs using type checker\n createTypeChecker(String, 'name')(name);\n createTypeChecker(Function, 'factory')(factory);\n\n const definition = (...args) => {\n try {\n const combinedArgs = [...args, ...defaultArgs];\n const res = factory(...combinedArgs);\n \n if (returnTypeChecker && res === undefined) {\n throw new Error(`Factory ${type} must return a value for ${name}`);\n }\n\n // Use type checker to validate return value\n if (returnTypeChecker) {\n returnTypeChecker(res);\n }\n\n return res\n } catch (error) {\n console.error(`Error creating definition \"${name}\"`, error);\n throw error;\n }\n }\n\n Object.defineProperty(definition, '_name', {\n value: name,\n enumerable: false,\n configurable: false\n });\n\n Definitions.set(definition, type);\n\n return definition;\n }\n\n DefinitionTypes.set(type, definitionType);\n\n return definitionType;\n}; ", "// utils/asserts.js\n\nconst BAD_KEYS = new Set(['__proto__', 'prototype', 'constructor']);\nconst RESERVED_NAMESPACES = new Set(['use', 'install', 'uninstall', 'relay', 'state', 'debug']);\n\nconst MAX_NAME_LENGTH = 64;\nconst VALID_NAME = /^[a-zA-Z_$][a-zA-Z_$0-9]*$/;\n\n/**\n * Throw if key is unsafe (__proto__, constructor, etc.)\n */\nexport function assertSafeKey(key, where = 'key') {\n if (BAD_KEYS.has(key)) {\n throw new Error(`Illegal key \"${key}\" in ${where}`);\n }\n}\n\n/**\n * Validate a namespace string: format, length, reserved words, proto poisoning.\n */\nexport function assertNamespace(ns) {\n assertSafeKey(ns, 'namespace');\n if (typeof ns !== 'string') {\n throw new Error(`Namespace must be a string, got ${typeof ns}`);\n }\n if (!VALID_NAME.test(ns)) {\n throw new Error(`Invalid namespace \"${ns}\". Must be a valid JS identifier`);\n }\n if (ns.length > MAX_NAME_LENGTH) {\n throw new Error(`Namespace \"${ns}\" too long (max ${MAX_NAME_LENGTH} chars)`);\n }\n if (RESERVED_NAMESPACES.has(ns)) {\n throw new Error(`Namespace \"${ns}\" is reserved`);\n }\n return ns;\n}\n\n/**\n * Validate an action or getter name within a namespace.\n */\nexport function assertMemberName(name, namespace, kind = 'member') {\n assertSafeKey(name, `${kind}:${namespace}`);\n if (typeof name !== 'string') {\n throw new Error(`${kind} name in ${namespace} must be a string`);\n }\n if (!VALID_NAME.test(name)) {\n throw new Error(`Invalid ${kind} name \"${name}\" in ${namespace}`);\n }\n if (name.length > MAX_NAME_LENGTH) {\n throw new Error(\n `${kind} name \"${name}\" in ${namespace} too long (max ${MAX_NAME_LENGTH})`\n );\n }\n return name;\n}\n", "import { createDefinition, definitionType } from './createDefinition.js';\nexport const defineMiddleware = createDefinition('MIDDLEWARE', [Function, Array]);\nexport const defineActions = createDefinition('ACTIONS', [Object]);\nexport const defineUninstall = createDefinition('UNINSTALL');\nexport const defineInitialize = createDefinition('INITIALIZE');\nexport const defineGetters = createDefinition('GETTERS', [Object]);\nexport { createDefinition, definitionType };", "// DefinitionBuilder.js\nimport { defineActions, defineGetters, defineMiddleware, defineInitialize, defineUninstall } from './defaults.js';\n\nexport class DefinitionBuilder {\n static create(namespace) {\n return new DefinitionBuilder(namespace);\n }\n\n #ns; #args;\n #slots = { MIDDLEWARE:null, GETTERS:null, ACTIONS:null, INITIALIZE:null, UNINSTALL:null };\n constructor(namespace) { this.#ns = namespace }\n\n #set(type, factory, creator) {\n if (this.#slots[type]) throw new Error(`${type} already defined for ${this.#ns}`);\n this.#slots[type] = creator(this.#ns, factory);\n }\n\n defineMiddleware = (factory) => this.#set('MIDDLEWARE', factory, defineMiddleware);\n defineGetters = (factory) => this.#set('GETTERS', factory, defineGetters);\n defineActions = (factory) => this.#set('ACTIONS', factory, defineActions);\n defineInitialize = (factory) => this.#set('INITIALIZE', factory, defineInitialize);\n defineUninstall = (factory) => this.#set('UNINSTALL', factory, defineUninstall);\n\n _toArray() {\n return [\n this.#slots.MIDDLEWARE,\n this.#slots.GETTERS,\n this.#slots.ACTIONS,\n this.#slots.INITIALIZE,\n this.#slots.UNINSTALL\n ].filter(Boolean);\n }\n}\n\n", "import { assertNamespace } from './utils/asserts.js';\nimport { DefinitionBuilder } from './definitions/DefinitionBuilder.js';\n\n\nexport class ServiceProvider {\n static #services = new Set();\n\n static manifest = {\n name: 'base',\n dependencies: [],\n version: '1.0.0',\n description: 'Base extension template',\n };\n\n static config = null;\n\n static unique = false;\n\n static configure(options = {}) {\n return {\n install: (useContext, config) => this.install(useContext, config),\n manifest: this.manifest,\n config: { ...(this.config || this.manifest.defaults || {}), ...options },\n unique: true,\n configured: true\n };\n }\n\n static install(useContext, config) { \n try {\n const {namespace} = this.manifest;\n assertNamespace(namespace);\n\n // instantiate\n const instance = new this();\n ServiceProvider.#services.add(instance);\n\n // bind context/config\n // bind config (frozen to avoid accidental mutation)\n Object.defineProperty(instance, 'config', {\n value: Object.freeze({ ...config }),\n writable: false,\n configurable: false,\n enumerable: false,\n });\n\n // expose both a live context getter AND the keyed accessor\n Object.defineProperty(instance, 'context', {\n get: () => useContext(), // always fresh, via your proxy\n configurable: false,\n enumerable: false,\n });\n \n Object.defineProperty(instance, 'useContext', {\n value: (...keys) => useContext(...keys),\n writable: false,\n configurable: false,\n enumerable: false,\n });\n\n const builder = DefinitionBuilder.create(namespace);\n\n if (instance.setup) {\n // Create properly bound context for setup pattern\n const setupContext = {\n defineActions: (factory) => builder.defineActions(() => factory(useContext, config)),\n defineMiddleware: (factory) => builder.defineMiddleware(() => factory(useContext, config)),\n defineGetters: (factory) => builder.defineGetters(() => factory(useContext, config)),\n defineInitialize: (factory) => builder.defineInitialize(() => factory(useContext, config)),\n defineUninstall: (factory) => builder.defineUninstall(() => factory(useContext, config))\n };\n const maybe = instance.setup(setupContext);\n return maybe?.then ? maybe.then(() => builder._toArray()) : builder._toArray();\n }\n\n if (instance.middleware) builder.defineMiddleware(() => instance.middleware(useContext, config));\n if (instance.getters) builder.defineGetters (() => instance.getters(useContext, config));\n if (instance.actions) builder.defineActions (() => instance.actions(useContext, config));\n if (instance.initialize) builder.defineInitialize(() => instance.initialize(useContext, config));\n if (instance.uninstall) builder.defineUninstall (() => instance.uninstall(useContext, config));\n\n return builder._toArray();\n } catch (error) {\n throw error;\n }\n }\n}", "const ENGINE_CONTEXT = Symbol('jucie.engine');\n\n/**\n * Registers the engine globally, but only if no engine has already been set.\n * @param {object} engine \n */\n\nexport function provideEngine(engine) {\n if (!globalThis[ENGINE_CONTEXT]) {\n globalThis[ENGINE_CONTEXT] = engine;\n }\n}\n\nexport function hasEngine() {\n return globalThis[ENGINE_CONTEXT] !== undefined;\n}\n\n/**\n * Forcefully override the engine in the global context.\n * Useful for testing or resetting.\n */\nexport function forceEngine(engine) {\n globalThis[ENGINE_CONTEXT] = engine;\n}\n\n/**\n * Retrieves the globally registered engine.\n */\nexport function getEngine() {\n return globalThis[ENGINE_CONTEXT] || null;\n}\n\n/**\n * Retrieves the globally registered engine.\n */\nexport function useEngine() {\n return getEngine();\n}", "import { Manager } from 'socket.io-client';\nimport { ServiceProvider } from '@jucie.io/engine';\nconst DEFAULT_NAMESPACE = Symbol('DEFAULT_NAMESPACE');\n\nexport class SocketClient extends ServiceProvider {\n #io = null;\n #namespaces = new Map();\n #lifecycle = {\n onConnect: new Set(),\n onDisconnect: new Set(),\n onError: new Set()\n };\n\n static manifest = {\n name: 'socket-client',\n namespace: 'socket',\n defaults: {\n url: null,\n auth: null,\n options: {\n path: '/socket.io',\n transports: ['websocket', 'polling'],\n timeout: 20000,\n autoConnect: true,\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n withCredentials: false\n }\n }\n }\n\n initialize(useContext, config = {}) {\n if (!config.url) {\n return\n }\n if (!config.options) {\n config.options = {};\n }\n this.#setupIO(config.url, config.options);\n return this;\n }\n\n actions(_, config = {}) {\n return {\n initialize: (url, options = {}) => {\n if (!url) {\n throw new Error('URL is required');\n }\n\n options = {...this.config.options, ...options};\n this.#setupIO(url, options);\n return this;\n },\n create: (name, options = {}) => {\n const defaultNamespace = this.#namespaces.get(DEFAULT_NAMESPACE);\n options = options.auth ? { ...options } : { ...options, auth: defaultNamespace.auth };\n const namespace = this.#io.socket(`/${name}`, options);\n this.#namespaces.set(name, namespace);\n return namespace;\n },\n get: (name) => {\n return this.#namespaces.get(name || DEFAULT_NAMESPACE);\n },\n destroy: (name) => {\n const namespace = this.#namespaces.get(name);\n if (namespace) {\n namespace.disconnect();\n }\n this.#namespaces.delete(name);\n },\n onConnect: (callback) => {\n this.#lifecycle.onConnect.add(callback);\n return () => this.#lifecycle.onConnect.delete(callback);\n },\n onDisconnect: (callback) => {\n this.#lifecycle.onDisconnect.add(callback);\n return () => this.#lifecycle.onDisconnect.delete(callback);\n },\n onError: (callback) => {\n this.#lifecycle.onError.add(callback);\n return () => this.#lifecycle.onError.delete(callback);\n }\n }\n }\n\n #setupIO(urls, options = {}, auth = null) {\n if (this.#io) { return this; }\n this.#io = new Manager(urls, {...options});\n const defaultNamespace = this.#io.socket('/', { auth });\n\n this.#namespaces.set(DEFAULT_NAMESPACE, defaultNamespace);\n\n this.#setUplLifecycleHandlers(defaultNamespace);\n return this;\n }\n\n #setUplLifecycleHandlers(socket) {\n socket.on('connect_error', (error) => {\n this.#lifecycle.onError.forEach((callback) => callback(error));\n });\n socket.on('connect', () => {\n this.#lifecycle.onConnect.forEach((callback) => callback());\n });\n socket.on('disconnect', () => {\n this.#lifecycle.onDisconnect.forEach((callback) => callback());\n });\n }\n}\n", "import { ServiceProvider } from '@jucie.io/engine';\nimport { defineMiddleware } from '@jucie.io/engine';\nimport { SocketClient } from '@jucie.io/engine/socket/client';\n\nexport class SignalClient extends ServiceProvider {\n #rooms = new Map();\n #subscribers = new Map();\n #channels = new Map();\n #lifecycle = new Map();\n #defaultRoomId = null;\n #auths = [];\n #socket = null;\n\n static manifest = {\n name: 'signal',\n namespace: 'signal',\n dependencies: [ SocketClient ],\n defaults: {\n namespace: 'signal',\n jwtSecret: null\n }\n }\n \n actions(context, config = {}) {\n // Create and configure the signal namespace\n this.#socket = context.socket.create(config.namespace);\n\n console.log('signal client socket', this.#socket);\n\n this.#socket.on('connection', (socket) => {\n console.log('signal user connected', socket.id);\n });\n\n this.#socket.connect();\n\n // console.log('signal client socket', this.#socket);\n\n // this.#socket.on('peer-joined', async (roomId, peerId, accessToken) => {\n // if (this.#auths.length > 0) {\n // const authResults = await Promise.all(\n // this.#auths.map(auth => auth(peerId, accessToken))\n // );\n \n // const allAuthsPassed = authResults.every(result => result);\n // if (!allAuthsPassed) {\n // this.#socket.emit('join-rejected', roomId, peerId);\n // return;\n // }\n // }\n\n // const connection = this.#createConnection(roomId, peerId);\n // this.#createDataChannel(roomId, peerId);\n // connection.onicecandidate = event => this.#handleIceCandidate(roomId, peerId, event);\n // const offer = await this.#createResponse('offer', roomId, peerId);\n // this.#socket.emit('signal', roomId, peerId, offer);\n // });\n\n // this.#socket.on('peer-left', (roomId, peerId) => {\n // if (this.#rooms.has(roomId)) {\n // this.#rooms.get(roomId).delete(peerId);\n // }\n // });\n\n // this.#socket.on('signal', async (roomId, peerId, signal) => {\n // if (signal.type === 'offer') {\n // const connection = this.#createConnection(roomId, peerId);\n\n // // Set up the data channel event handler\n // connection.ondatachannel = ({ channel }) => this.#handleDataChannel(roomId, channel);\n\n // // Handle ICE candidates\n // connection.onicecandidate = event => this.#handleIceCandidate(roomId, peerId, event);\n\n // // Set the remote description with the received offer\n // await connection.setRemoteDescription(signal);\n\n // // Create an answer\n // const answer = await this.#createResponse('answer', roomId, peerId);\n\n // if (!this.#defaultRoomId) {\n // this.#defaultRoomId = roomId;\n // }\n\n // // Send the answer to the other peer\n // this.#socket.emit('signal', roomId, peerId, answer);\n // }\n\n // if (signal.type === 'answer') { \n // if (!this.#defaultRoomId) {\n // this.#defaultRoomId = roomId;\n // }\n // const connection = this.#rooms.get(roomId).get(peerId);\n // connection.setRemoteDescription(signal);\n // }\n // });\n\n // const rejectAccess = (id, ...response) => {\n // this.#socket.emit('access-denied', id, ...response);\n // }\n\n // const grantAccess = (id, ...response) => {\n // this.#socket.emit('access-granted', id, ...response);\n // }\n\n // this.#socket.on('request-access', (peerId, token,...payload) => {\n // const grant = (...response) => grantAccess(peerId, ...response);\n // const reject = (...response) => rejectAccess(peerId, ...response);\n // context.events.emit('request-access', token, ...payload, grant, reject);\n // });\n\n // this.#socket.on('access-granted', (...response) => {\n // context.events.emit('access-granted', ...response);\n // });\n\n // this.#socket.on('access-denied', (...response) => {\n // context.events.emit('access-denied', ...response);\n // });\n\n // this.#socket.on('ice-candidate', async (roomId, peerId, candidate) => {\n // this.#rooms.get(roomId).get(peerId).addIceCandidate(new RTCIceCandidate(candidate))\n // });\n\n // this.#socket.on('signal-error', ({message}) => {\n // console.error('signal-error', message);\n // });\n\n const signalMiddleware = defineMiddleware('signal', (action, args, next) => {\n return next();\n });\n \n\n // Return public API\n const signalActions = actions('signal', (useContext) => ({\n encodeToken: (data, options = {}) => {\n return new Promise((resolve, reject) => {\n this.#socket.emit('create-token', data, options, (token) => {\n resolve(token);\n });\n });\n },\n requestAccess: (token, ...payload) => {\n this.#socket.emit('request-access', token, ...payload);\n },\n onRequestAccess: (handler) => {\n context.events.on('request-access', handler);\n },\n onAccessGranted: (handler) => {\n context.events.on('access-granted', handler);\n },\n onAccessDenied: (handler) => {\n context.events.on('access-denied', handler);\n },\n addAuthHandler: (authHandler) => {\n this.#auths.push(authHandler);\n },\n join: (roomId, accessKey) => {\n this.#socket.emit('join', roomId, accessKey);\n },\n from: (roomId = this.#defaultRoomId) => {\n return {\n subscribe: (event, handler) => {\n this.#subscribe('publish', roomId, event, handler);\n },\n once: (event, handler) => {\n this.#subscribe('publish', roomId, event, handler, true);\n }\n }\n },\n to: (roomId = this.#defaultRoomId) => {\n if (!this.#rooms.has(roomId)) {\n throw new Error(`Room ${roomId} not found`);\n }\n return {\n publish: (event, ...payload) => {\n this.#publish('publish', roomId, event, payload);\n }\n }\n },\n publish: (event, ...payload) => {\n this.#publish('publish', this.#defaultRoomId, event, payload);\n },\n subscribe: (event, handler) => {\n this.#subscribe('publish', this.#defaultRoomId, event, handler);\n },\n once: (event, handler) => {\n this.#subscribe('publish', this.#defaultRoomId, event, handler, true);\n },\n onChannelOpen: (roomId, handler) => {\n if (!this.#lifecycle.has(roomId)) {\n this.#lifecycle.set(roomId, {open: null, close: null});\n }\n this.#lifecycle.get(roomId).open = handler;\n },\n onChannelClose: (roomId, handler) => {\n if (!this.#lifecycle.has(roomId)) {\n this.#lifecycle.set(roomId, {open: null, close: null});\n }\n this.#lifecycle.get(roomId).close = handler;\n }\n }));\n\n return [signalActions, signalMiddleware];\n }\n\n #handleIceCandidate(roomId, peerId, event) {\n if (event.candidate) {\n this.#socket.emit('ice-candidate', roomId, peerId, event.candidate);\n } else {\n console.log('All ICE candidates have been sent');\n }\n }\n\n async #createResponse(type, roomId, peerId) {\n if (!this.#rooms.has(roomId)) {\n throw new Error(`Room ${roomId} not found`);\n }\n\n if (!this.#rooms.get(roomId).has(peerId)) {\n throw new Error(`Peer ${peerId} not found in room ${roomId}`);\n }\n \n const connection = this.#rooms.get(roomId).get(peerId);\n\n switch (type) {\n case 'offer':\n const offer = await connection.createOffer();\n await connection.setLocalDescription(offer);\n return offer;\n case 'answer':\n const answer = await connection.createAnswer();\n await connection.setLocalDescription(answer);\n return answer;\n }\n }\n\n #createConnection(roomId, peerId) {\n if (!this.#rooms.has(roomId)) {\n this.#rooms.set(roomId, new Map());\n }\n\n // Create a new RTCPeerConnection\n const connection = new RTCPeerConnection({\n iceServers: [\n { urls: 'stun:stun.l.google.com:19302' },\n {\n urls: [\n 'turn:165.227.218.103:3478?transport=udp',\n 'turn:165.227.218.103:3478?transport=tcp',\n 'turns:165.227.218.103:443?transport=tcp'\n ],\n username: 'webrtcuser',\n credential: 'demoPass123'\n }\n ]\n });\n\n this.#rooms.get(roomId).set(peerId, connection);\n \n return connection;\n }\n\n #createDataChannel(roomId, peerId) {\n if (!this.#rooms.has(roomId)) {\n throw new Error(`Room ${roomId} not found`);\n }\n\n if (!this.#rooms.get(roomId).has(peerId)) {\n throw new Error(`Peer ${peerId} not found in room ${roomId}`);\n }\n\n const connection = this.#rooms.get(roomId).get(peerId);\n const dataChannel = connection.createDataChannel(roomId);\n this.#handleDataChannel(roomId, dataChannel); \n\n return dataChannel;\n }\n\n #handleDataChannel(roomId, dataChannel) {\n dataChannel.onopen = () => {\n if (this.#lifecycle.get(roomId)?.open) {\n this.#lifecycle.get(roomId).open();\n this.#lifecycle.get(roomId).open = null;\n }\n };\n\n dataChannel.onmessage = ({ data }) => {\n const roomId = dataChannel.label;\n const { type, event, payload } = JSON.parse(data);\n this.#callSubscribers(roomId, type, event, payload);\n };\n\n dataChannel.onclose = () => {\n if (this.#lifecycle.get(roomId)?.close) {\n this.#lifecycle.get(roomId).close();\n this.#lifecycle.get(roomId).close = null;\n }\n };\n\n if (!this.#channels.has(roomId)) {\n this.#channels.set(roomId, [dataChannel]);\n } else {\n this.#channels.get(roomId).push(dataChannel);\n }\n }\n \n\n #subscribe(type, roomId, event, handler, once = false) {\n\n const subscribers = this.#subscribers.get(roomId) || new Map();\n if (!subscribers.has(event)) {\n subscribers.set(event, []);\n }\n const entry = {\n handler,\n once\n }\n subscribers.get(event).push(entry);\n this.#subscribers.set(roomId, subscribers);\n console.log('subscribers', this.#subscribers.get(roomId));\n return () => {\n subscribers.get(event).splice(subscribers.get(event).indexOf(entry), 1);\n }\n }\n\n #publish(type, roomId, event, payload) {\n const channels = this.#channels.get(roomId);\n if (!channels) {\n throw new Error(`Channel ${roomId} not found`);\n return;\n }\n channels.forEach(channel => channel.send(JSON.stringify({type, event, payload})));\n }\n\n #callSubscribers(roomId, type, event, payload) {\n try {\n const subscribers = this.#subscribers.get(roomId);\n if (subscribers) {\n const events = subscribers.get(event);\n if (events) {\n for (const entry of events) {\n if (typeof entry.handler === 'function') {\n entry.handler(...payload);\n }\n if (entry.once) {\n events.splice(events.indexOf(entry), 1);\n }\n }\n }\n }\n } catch (error) {\n console.error('Error calling subscribers', error);\n }\n }\n}", "import { Server } from 'socket.io';\nimport { ServiceProvider } from '@jucie.io/engine';\nconst DEFAULT_NAMESPACE = Symbol('DEFAULT_NAMESPACE');\n\nexport class SocketServer extends ServiceProvider {\n #io = null;\n #namespaces = new Map();\n #lifecycle = new Map();\n \n \n static manifest = {\n name: 'socket-server',\n namespace: 'socket',\n defaults: {\n cors: {},\n options: {\n transports: ['websocket', 'polling']\n },\n auth: null,\n }\n }\n\n initialize(useContext, config = {}) {\n const server = useContext('server');\n if (!server) {\n return;\n }\n const httpServer = server.getHttpServer();\n\n console.log('httpServer', httpServer);\n\n if (!httpServer) {\n return\n }\n this.#setupIO(httpServer);\n return this;\n }\n\n actions(useContext) {\n\n const actions = {\n start: (httpServer) => {\n httpServer = httpServer || useContext('server').getHttpServer();\n if (!httpServer) {\n throw new Error('HTTP server not found');\n }\n this.#setupIO(httpServer);\n return actions;\n },\n create: (name, options = {}) => {\n const namespace = this.#io.of(`/${name}`);\n this.#namespaces.set(name, namespace);\n return namespace;\n },\n get: (name = DEFAULT_NAMESPACE) => {\n if (this.#namespaces.has(name)) {\n return this.#namespaces.get(name);\n }\n return this.#io.of(`/${name}`);\n },\n destroy: (name) => {\n if (!this.#io) {\n throw new Error('Socket server not initialized');\n }\n const namespace = this.#namespaces.get(name);\n if (namespace) {\n namespace.close();\n }\n this.#namespaces.delete(name);\n return actions;\n }\n }\n return actions;\n }\n\n #setupIO(httpServer) {\n this.#io = new Server(httpServer, {...this.config });\n const defaultNamespace = this.#io.of('/');\n this.#setUpErrorHandlers(defaultNamespace);\n this.#setUpLifecycleHandlers(defaultNamespace);\n this.#namespaces.set(DEFAULT_NAMESPACE, defaultNamespace);\n return this;\n }\n\n #setUpErrorHandlers(socket) {\n socket.on('connect_error', (error) => {\n console.error('Socket connection error:', error);\n });\n }\n\n #setUpLifecycleHandlers(socket) {\n socket.on('connect', (clientSocket) => {\n console.log('Socket connected!');\n });\n }\n} ", "import { ServiceProvider } from '@jucie.io/engine';\nimport { SocketServer } from '@jucie.io/engine/socket/server';\nimport jwt from 'jsonwebtoken';\n\n\nexport class SignalServer extends ServiceProvider {\n #socket = null;\n\n static manifest = {\n name: 'signal-server',\n namespace: 'signal',\n dependencies: [SocketServer],\n defaults: {\n namespace: 'signal',\n }\n }\n\n initialize(useContext, config) {\n const socket = useContext('socket');\n this.#socket = socket.create(config.namespace);\n this.#socket.on('connection', (socket) => this.#handleConnection(socket));\n }\n\n getters() {\n return {\n namespace: () => this.#socket,\n connections: () => this.#socket.engine.clientsCount,\n sockets: () => this.#socket.sockets,\n socket: (socketId) => this.#socket.sockets.get(socketId)\n };\n }\n\n #handleConnection(socket) { \n try {\n socket.on('request-access', (accessToken, ...payload) => this.#handleRequestAccess(socket, accessToken, payload));\n socket.on('access-granted', (peerId, ...response) => this.#handleAccessGranted(socket, peerId, response));\n socket.on('access-denied', (peerId, ...response) => this.#handleAccessDenied(socket, peerId, response));\n socket.on('create-token', (data, options = {}, cb) => this.#handleCreateToken(data, options, cb)); \n socket.on('join', (roomId, accessToken) => this.#handleJoin(socket, roomId, accessToken));\n socket.on('signal', (roomId, peerId, data) => this.#handleSignal(socket, roomId, peerId, data));\n socket.on('ice-candidate', (roomId, peerId, candidate) => this.#handleIceCandidate(socket, roomId, peerId, candidate));\n socket.on('member-metadata', ({ roomId, metadata, targetMemberId }) => this.#handleMemberMetadata(socket, { roomId, metadata, targetMemberId }));\n socket.on('disconnect', () => this.#handleDisconnect(socket));\n } catch (error) {\n console.error('Error handling connection:', error);\n } finally {\n console.log('Connection handled');\n }\n }\n\n #handleRequestAccess(socket, accessToken, payload) {\n try {\n const token = jwt.verify(accessToken, config.jwtSecret);\n \n if (!token) {\n throw new Error('Invalid token');\n }\n\n const { id } = token;\n\n const room = socket.adapter.rooms.get(id);\n \n if (!room) {\n throw new Error('Room not found');\n }\n \n // Check if the room has members (excluding the current socket)\n const members = Array.from(room).filter(id => id !== socket.id);\n \n if (members.length === 0) {\n // Room exists but has no other members\n throw new Error('Room has no members');\n }\n\n socket.to(id).emit('request-access', socket.id, token, ...payload);\n \n } catch (error) {\n socket.emit('signal-error', { \n message: error.message \n });\n }\n }\n \n\n #handleAccessGranted(socket, peerId, response) {\n try {\n socket.to(peerId).emit('access-granted', ...response);\n } catch (error) {\n console.error('Error sending access granted:', error);\n }\n }\n\n #handleAccessDenied(socket, peerId, response) {\n try {\n socket.to(peerId).emit('access-denied', ...response);\n } catch (error) {\n console.error('Error sending access denied:', error);\n }\n }\n\n #handleCreateToken(data, options = {}, cb) {\n try {\n const token = jwt.sign(data, config.jwtSecret, options);\n cb(token);\n } catch (error) {\n console.error('Error creating token:', error);\n }\n }\n\n #handleJoin(socket, roomId, accessToken) {\n try {\n socket.join(roomId);\n socket.to(roomId).emit('peer-joined', roomId, socket.id, accessToken);\n console.log(`Signal user ${socket.id} joined room: ${roomId}`);\n } catch (error) {\n console.error('Error joining room:', error);\n }\n }\n\n #handleSignal(socket, roomId, peerId, data) {\n try {\n socket.to(peerId).emit('signal', roomId, socket.id, data);\n } catch (error) {\n console.error('Error sending signal:', error);\n }\n }\n\n #handleIceCandidate(socket, roomId, peerId, candidate) {\n try {\n socket.to(peerId).emit('ice-candidate', roomId, socket.id, candidate);\n } catch (error) {\n console.error('Error sending ICE candidate:', error);\n }\n }\n\n #handleMemberMetadata(socket, { roomId, metadata, targetMemberId }) {\n socket.to(targetMemberId).emit('room-metadata', {\n roomId,\n metadata\n });\n }\n\n #handleDisconnect(socket) {\n // Get all rooms this socket is in\n const rooms = Array.from(socket.rooms);\n \n // Remove the socket's own ID from the list (Socket.IO automatically adds the socket ID as a room)\n const userRooms = rooms.filter(room => room !== socket.id);\n \n // Notify all other users in each room that this user has disconnected\n userRooms.forEach(roomId => {\n socket.to(roomId).emit('peer-left', roomId, socket.id);\n });\n \n console.log(`Signal user ${socket.id} disconnected from rooms: ${userRooms.join(', ')}`);\n }\n} "],
5
+ "mappings": "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",
6
+ "names": ["GLOBAL_NS_OBJ", "checkType", "value", "expectedType", "name", "type", "matchesType", "typeNames", "getTypeName", "createTypeChecker", "DefinitionTypes", "Definitions", "createDefinition", "type", "returnTypes", "returnTypeChecker", "createTypeChecker", "DefinitionTypes", "definitionType", "name", "factory", "defaultArgs", "definition", "args", "combinedArgs", "res", "error", "Definitions", "BAD_KEYS", "RESERVED_NAMESPACES", "MAX_NAME_LENGTH", "VALID_NAME", "assertSafeKey", "key", "where", "assertNamespace", "ns", "defineMiddleware", "createDefinition", "defineActions", "defineUninstall", "defineInitialize", "defineGetters", "DefinitionBuilder", "_DefinitionBuilder", "namespace", "#ns", "#args", "#slots", "#set", "type", "factory", "creator", "defineMiddleware", "defineGetters", "defineActions", "defineInitialize", "defineUninstall", "ServiceProvider", "_ServiceProvider", "#services", "options", "useContext", "config", "namespace", "assertNamespace", "instance", "keys", "builder", "DefinitionBuilder", "setupContext", "factory", "maybe", "error", "ENGINE_CONTEXT", "Manager", "DEFAULT_NAMESPACE", "SocketClient", "ServiceProvider", "#io", "#namespaces", "#lifecycle", "useContext", "config", "#setupIO", "_", "url", "options", "name", "defaultNamespace", "namespace", "callback", "urls", "auth", "Manager", "#setUplLifecycleHandlers", "socket", "error", "SignalClient", "ServiceProvider", "#rooms", "#subscribers", "#channels", "#lifecycle", "#defaultRoomId", "#auths", "#socket", "SocketClient", "context", "config", "socket", "signalMiddleware", "defineMiddleware", "action", "args", "next", "useContext", "data", "options", "resolve", "reject", "token", "payload", "handler", "authHandler", "roomId", "accessKey", "event", "#subscribe", "#publish", "#handleIceCandidate", "peerId", "#createResponse", "type", "connection", "offer", "answer", "#createConnection", "#createDataChannel", "dataChannel", "#handleDataChannel", "#callSubscribers", "once", "subscribers", "entry", "channels", "channel", "events", "error", "Server", "DEFAULT_NAMESPACE", "SocketServer", "ServiceProvider", "#io", "#namespaces", "#lifecycle", "useContext", "config", "server", "httpServer", "#setupIO", "actions", "name", "options", "namespace", "Server", "defaultNamespace", "#setUpErrorHandlers", "#setUpLifecycleHandlers", "socket", "error", "clientSocket", "jwt", "SignalServer", "ServiceProvider", "#socket", "SocketServer", "useContext", "config", "socket", "#handleConnection", "socketId", "accessToken", "payload", "#handleRequestAccess", "peerId", "response", "#handleAccessGranted", "#handleAccessDenied", "data", "options", "cb", "#handleCreateToken", "roomId", "#handleJoin", "#handleSignal", "candidate", "#handleIceCandidate", "metadata", "targetMemberId", "#handleMemberMetadata", "#handleDisconnect", "error", "token", "id", "room", "userRooms"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Manager as W}from"socket.io-client";var H=Object.freeze(Object.create(null));function M(e,t,r="value"){if(Array.isArray(t)){for(let i of t)if(I(e,i))return!0;let n=t.map(d).join(" | ");throw new TypeError(`${r} must be one of: ${n}. Got ${d(e)}`)}if(!I(e,t))throw new TypeError(`${r} must be ${d(t)}. Got ${d(e)}`);return!0}function I(e,t){return t===String?typeof e=="string":t===Number?typeof e=="number"&&!isNaN(e):t===Boolean?typeof e=="boolean":t===Symbol?typeof e=="symbol":t===BigInt?typeof e=="bigint":t===Function?typeof e=="function":t===Array?Array.isArray(e):t===Object?e!==null&&typeof e=="object"&&!Array.isArray(e):e instanceof t}function d(e){return e===String?"String":e===Number?"Number":e===Boolean?"Boolean":e===Array?"Array":e===Object?"Object":e===Function?"Function":e===Date?"Date":e===RegExp?"RegExp":e===Promise?"Promise":e===Map?"Map":e===Set?"Set":e===WeakMap?"WeakMap":e===WeakSet?"WeakSet":e===Symbol?"Symbol":e===BigInt?"BigInt":e===Error?"Error":typeof e=="string"?"string":typeof e=="number"?"number":typeof e=="boolean"?"boolean":typeof e=="symbol"?"symbol":typeof e=="bigint"?"bigint":typeof e=="function"?"function":Array.isArray(e)?"Array":e===null?"null":e===void 0?"undefined":typeof e=="object"?e.constructor?.name||"Object":"unknown"}function f(e,t="value"){return r=>M(r,e,t)}var g=new Map,D=new WeakMap;var a=(e,t=[])=>{let r=t.length>0?f(t,"return value"):null;if(g.has(e))return console.warn(`Definition type "${e}" already exists`),g.get(e);let n=(i,s,...c)=>{f(String,"name")(i),f(Function,"factory")(s);let h=(...o)=>{try{let u=[...o,...c],y=s(...u);if(r&&y===void 0)throw new Error(`Factory ${e} must return a value for ${i}`);return r&&r(y),y}catch(u){throw console.error(`Error creating definition "${i}"`,u),u}};return Object.defineProperty(h,"_name",{value:i,enumerable:!1,configurable:!1}),D.set(h,e),h};return g.set(e,n),n};var v=new Set(["__proto__","prototype","constructor"]),U=new Set(["use","install","uninstall","relay","state","debug"]),$=64,z=/^[a-zA-Z_$][a-zA-Z_$0-9]*$/;function V(e,t="key"){if(v.has(e))throw new Error(`Illegal key "${e}" in ${t}`)}function m(e){if(V(e,"namespace"),typeof e!="string")throw new Error(`Namespace must be a string, got ${typeof e}`);if(!z.test(e))throw new Error(`Invalid namespace "${e}". Must be a valid JS identifier`);if(e.length>$)throw new Error(`Namespace "${e}" too long (max ${$} chars)`);if(U.has(e))throw new Error(`Namespace "${e}" is reserved`);return e}var b=a("MIDDLEWARE",[Function,Array]),w=a("ACTIONS",[Object]),A=a("UNINSTALL"),E=a("INITIALIZE"),x=a("GETTERS",[Object]);var p=class e{static create(t){return new e(t)}#t;#n;#e={MIDDLEWARE:null,GETTERS:null,ACTIONS:null,INITIALIZE:null,UNINSTALL:null};constructor(t){this.#t=t}#r(t,r,n){if(this.#e[t])throw new Error(`${t} already defined for ${this.#t}`);this.#e[t]=n(this.#t,r)}defineMiddleware=t=>this.#r("MIDDLEWARE",t,b);defineGetters=t=>this.#r("GETTERS",t,x);defineActions=t=>this.#r("ACTIONS",t,w);defineInitialize=t=>this.#r("INITIALIZE",t,E);defineUninstall=t=>this.#r("UNINSTALL",t,A);_toArray(){return[this.#e.MIDDLEWARE,this.#e.GETTERS,this.#e.ACTIONS,this.#e.INITIALIZE,this.#e.UNINSTALL].filter(Boolean)}};var l=class e{static#t=new Set;static manifest={name:"base",dependencies:[],version:"1.0.0",description:"Base extension template"};static config=null;static unique=!1;static configure(t={}){return{install:(r,n)=>this.install(r,n),manifest:this.manifest,config:{...this.config||this.manifest.defaults||{},...t},unique:!0,configured:!0}}static install(t,r){try{let{namespace:n}=this.manifest;m(n);let i=new this;e.#t.add(i),Object.defineProperty(i,"config",{value:Object.freeze({...r}),writable:!1,configurable:!1,enumerable:!1}),Object.defineProperty(i,"context",{get:()=>t(),configurable:!1,enumerable:!1}),Object.defineProperty(i,"useContext",{value:(...c)=>t(...c),writable:!1,configurable:!1,enumerable:!1});let s=p.create(n);if(i.setup){let c={defineActions:o=>s.defineActions(()=>o(t,r)),defineMiddleware:o=>s.defineMiddleware(()=>o(t,r)),defineGetters:o=>s.defineGetters(()=>o(t,r)),defineInitialize:o=>s.defineInitialize(()=>o(t,r)),defineUninstall:o=>s.defineUninstall(()=>o(t,r))},h=i.setup(c);return h?.then?h.then(()=>s._toArray()):s._toArray()}return i.middleware&&s.defineMiddleware(()=>i.middleware(t,r)),i.getters&&s.defineGetters(()=>i.getters(t,r)),i.actions&&s.defineActions(()=>i.actions(t,r)),i.initialize&&s.defineInitialize(()=>i.initialize(t,r)),i.uninstall&&s.defineUninstall(()=>i.uninstall(t,r)),s._toArray()}catch(n){throw n}}};var Ge=Symbol("jucie.engine");var S=Symbol("DEFAULT_NAMESPACE"),T=class extends l{#t=null;#n=new Map;#e={onConnect:new Set,onDisconnect:new Set,onError:new Set};static manifest={name:"socket-client",namespace:"socket",defaults:{url:null,auth:null,options:{path:"/socket.io",transports:["websocket","polling"],timeout:2e4,autoConnect:!0,reconnection:!0,reconnectionAttempts:5,reconnectionDelay:1e3,withCredentials:!1}}};initialize(t,r={}){if(r.url)return r.options||(r.options={}),this.#r(r.url,r.options),this}actions(t,r={}){return{initialize:(n,i={})=>{if(!n)throw new Error("URL is required");return i={...this.config.options,...i},this.#r(n,i),this},create:(n,i={})=>{let s=this.#n.get(S);i=i.auth?{...i}:{...i,auth:s.auth};let c=this.#t.socket(`/${n}`,i);return this.#n.set(n,c),c},get:n=>this.#n.get(n||S),destroy:n=>{let i=this.#n.get(n);i&&i.disconnect(),this.#n.delete(n)},onConnect:n=>(this.#e.onConnect.add(n),()=>this.#e.onConnect.delete(n)),onDisconnect:n=>(this.#e.onDisconnect.add(n),()=>this.#e.onDisconnect.delete(n)),onError:n=>(this.#e.onError.add(n),()=>this.#e.onError.delete(n))}}#r(t,r={},n=null){if(this.#t)return this;this.#t=new W(t,{...r});let i=this.#t.socket("/",{auth:n});return this.#n.set(S,i),this.#i(i),this}#i(t){t.on("connect_error",r=>{this.#e.onError.forEach(n=>n(r))}),t.on("connect",()=>{this.#e.onConnect.forEach(r=>r())}),t.on("disconnect",()=>{this.#e.onDisconnect.forEach(r=>r())})}};import{Server as q}from"socket.io";var j=Symbol("DEFAULT_NAMESPACE"),O=class extends l{#t=null;#n=new Map;#e=new Map;static manifest={name:"socket-server",namespace:"socket",defaults:{cors:{},options:{transports:["websocket","polling"]},auth:null}};initialize(t,r={}){let n=t("server");if(!n)return;let i=n.getHttpServer();if(console.log("httpServer",i),!!i)return this.#r(i),this}actions(t){let r={start:n=>{if(n=n||t("server").getHttpServer(),!n)throw new Error("HTTP server not found");return this.#r(n),r},create:(n,i={})=>{let s=this.#t.of(`/${n}`);return this.#n.set(n,s),s},get:(n=j)=>this.#n.has(n)?this.#n.get(n):this.#t.of(`/${n}`),destroy:n=>{if(!this.#t)throw new Error("Socket server not initialized");let i=this.#n.get(n);return i&&i.close(),this.#n.delete(n),r}};return r}#r(t){this.#t=new q(t,{...this.config});let r=this.#t.of("/");return this.#i(r),this.#s(r),this.#n.set(j,r),this}#i(t){t.on("connect_error",r=>{console.error("Socket connection error:",r)})}#s(t){t.on("connect",r=>{console.log("Socket connected!")})}};export{T as SocketClient,O as SocketServer};
2
+ //# sourceMappingURL=socket.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../services/socket/src/SocketClient.js", "../../src/lib/relay/src/Relay.js", "../../src/utils/typeChecker.js", "../../src/definitions/createDefinition.js", "../../src/utils/asserts.js", "../../src/definitions/defaults.js", "../../src/definitions/DefinitionBuilder.js", "../../src/ServiceProvider.js", "../../src/global.js", "../../services/socket/src/SocketServer.js"],
4
+ "sourcesContent": ["import { Manager } from 'socket.io-client';\nimport { ServiceProvider } from '@jucie.io/engine';\nconst DEFAULT_NAMESPACE = Symbol('DEFAULT_NAMESPACE');\n\nexport class SocketClient extends ServiceProvider {\n #io = null;\n #namespaces = new Map();\n #lifecycle = {\n onConnect: new Set(),\n onDisconnect: new Set(),\n onError: new Set()\n };\n\n static manifest = {\n name: 'socket-client',\n namespace: 'socket',\n defaults: {\n url: null,\n auth: null,\n options: {\n path: '/socket.io',\n transports: ['websocket', 'polling'],\n timeout: 20000,\n autoConnect: true,\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n withCredentials: false\n }\n }\n }\n\n initialize(useContext, config = {}) {\n if (!config.url) {\n return\n }\n if (!config.options) {\n config.options = {};\n }\n this.#setupIO(config.url, config.options);\n return this;\n }\n\n actions(_, config = {}) {\n return {\n initialize: (url, options = {}) => {\n if (!url) {\n throw new Error('URL is required');\n }\n\n options = {...this.config.options, ...options};\n this.#setupIO(url, options);\n return this;\n },\n create: (name, options = {}) => {\n const defaultNamespace = this.#namespaces.get(DEFAULT_NAMESPACE);\n options = options.auth ? { ...options } : { ...options, auth: defaultNamespace.auth };\n const namespace = this.#io.socket(`/${name}`, options);\n this.#namespaces.set(name, namespace);\n return namespace;\n },\n get: (name) => {\n return this.#namespaces.get(name || DEFAULT_NAMESPACE);\n },\n destroy: (name) => {\n const namespace = this.#namespaces.get(name);\n if (namespace) {\n namespace.disconnect();\n }\n this.#namespaces.delete(name);\n },\n onConnect: (callback) => {\n this.#lifecycle.onConnect.add(callback);\n return () => this.#lifecycle.onConnect.delete(callback);\n },\n onDisconnect: (callback) => {\n this.#lifecycle.onDisconnect.add(callback);\n return () => this.#lifecycle.onDisconnect.delete(callback);\n },\n onError: (callback) => {\n this.#lifecycle.onError.add(callback);\n return () => this.#lifecycle.onError.delete(callback);\n }\n }\n }\n\n #setupIO(urls, options = {}, auth = null) {\n if (this.#io) { return this; }\n this.#io = new Manager(urls, {...options});\n const defaultNamespace = this.#io.socket('/', { auth });\n\n this.#namespaces.set(DEFAULT_NAMESPACE, defaultNamespace);\n\n this.#setUplLifecycleHandlers(defaultNamespace);\n return this;\n }\n\n #setUplLifecycleHandlers(socket) {\n socket.on('connect_error', (error) => {\n this.#lifecycle.onError.forEach((callback) => callback(error));\n });\n socket.on('connect', () => {\n this.#lifecycle.onConnect.forEach((callback) => callback());\n });\n socket.on('disconnect', () => {\n this.#lifecycle.onDisconnect.forEach((callback) => callback());\n });\n }\n}\n", "// Simple, readable relay with wildcard matching and no indexing\n\nconst GLOBAL_NS_OBJ = Object.freeze(Object.create(null));\n\nfunction queueMicrotask(fn) {\n if (globalThis.queueMicrotask && typeof globalThis.queueMicrotask === 'function') {\n globalThis.queueMicrotask(fn);\n return;\n }\n setTimeout(fn, 0);\n}\n\nclass Channel {\n #nsObj; #relay;\n constructor(nsObj, relay) { this.#nsObj = nsObj; this.#relay = relay; }\n\n // Any source -> me\n on(event, handler) {\n return this.#relay.subscribe(event, GLOBAL_NS_OBJ, this.#nsObj, handler);\n }\n\n once(event, handler) {\n return this.#relay.once(event, GLOBAL_NS_OBJ, this.#nsObj, handler);\n }\n\n // Me -> everyone (sender never hears itself)\n broadcast(event, ...payload) {\n this.#relay.publish(event, this.#nsObj, GLOBAL_NS_OBJ, payload);\n }\n\n // Specific source -> me\n from(fromNs) {\n return {\n subscribe: (event, handler) => this.#relay.subscribe(event, fromNs, this.#nsObj, handler),\n once: (event, handler) => this.#relay.once(event, fromNs, this.#nsObj, handler),\n };\n }\n\n // Me -> specific target\n to(toNs) {\n return {\n publish: (event, ...payload) => this.#relay.publish(event, this.#nsObj, toNs, payload),\n publishAsync: (event, ...payload) => this.#relay.publishAsync(event, this.#nsObj, toNs, payload),\n };\n }\n}\n\nexport class Relay {\n #channels = new WeakMap(); // nsObj -> Channel\n #events = new Map(); // eventName -> Set<Listener>\n #onError = null;\n\n static create(config = {}) {\n return new Relay(config);\n }\n\n constructor({ onError = null } = {}) {\n this.#onError = onError;\n this.createChannel(GLOBAL_NS_OBJ);\n }\n\n // Public convenience\n channel(nsObj) { return this.createChannel(nsObj); }\n createChannel(nsObj) {\n if (this.#channels.has(nsObj)) return this.#channels.get(nsObj);\n const ch = new Channel(nsObj, this);\n this.#channels.set(nsObj, ch);\n return ch;\n }\n\n // Internal helpers\n #listeners(event) {\n let set = this.#events.get(event);\n if (!set) { set = new Set(); this.#events.set(event, set); }\n return set;\n }\n\n // Wildcard matcher:\n // - If published `from` is GLOBAL, it matches every listener.from\n // - If listener.from is GLOBAL, it matches every published from\n // Same for `to`. This makes broadcast (to = GLOBAL) hit specific targets too.\n static #matchSide(published, constraint) {\n return published === GLOBAL_NS_OBJ || constraint === GLOBAL_NS_OBJ || published === constraint;\n }\n\n static #matches(publishedFrom, publishedTo, listenerFrom, listenerTo) {\n return Relay.#matchSide(publishedFrom, listenerFrom)\n && Relay.#matchSide(publishedTo, listenerTo);\n }\n\n subscribe(event, from, to, handler) {\n const listener = { from, to, handler };\n this.#listeners(event).add(listener);\n return () => {\n const set = this.#events.get(event);\n if (set) set.delete(listener);\n };\n }\n\n once(event, from, to, handler) {\n let off = null;\n const wrapped = (payload) => {\n try { handler(payload); } finally { off && off(); }\n };\n off = this.subscribe(event, from, to, wrapped);\n return off;\n }\n\n offAllFor(nsObj) {\n for (const set of this.#events.values()) {\n for (const l of Array.from(set)) {\n if (l.from === nsObj || l.to === nsObj) set.delete(l);\n }\n }\n }\n\n listenerCount(event) {\n const set = this.#events.get(event);\n return set ? set.size : 0;\n }\n\n #deliver(event, from, to, payload) {\n const set = this.#events.get(event);\n if (!set || set.size === 0) return;\n\n for (const l of set) {\n // Always skip self-delivery\n if (l.to === from) continue;\n\n if (Relay.#matches(from, to, l.from, l.to)) {\n try { l.handler(...payload); }\n catch (err) { if (this.#onError) this.#onError(err, { event, from, to, listener: l }); }\n }\n }\n }\n\n publish(event, from, to, payload) {\n this.#deliver(event, from, to, payload);\n }\n\n publishAsync(event, from, to, payload) {\n queueMicrotask(() => this.#deliver(event, from, to, payload));\n }\n\n broadcast(event, from, payload) {\n this.publish(event, from, GLOBAL_NS_OBJ, payload);\n }\n}\n", "/**\n * Type Checker Utility\n * \n * Supports syntax like:\n * - createDefinition('action', [Array, Function]) // Array or Function\n * - createDefinition('name', String) // Must be String\n * - createDefinition('items', Array) // Must be Array\n * - createDefinition('callback', Function) // Must be Function\n * - createDefinition('value', [String, Number]) // String or Number\n */\n\n/**\n * Type definitions mapping constructor names to actual constructors\n */\nconst TYPE_MAP = {\n String,\n Number,\n Boolean,\n Array,\n Object,\n Function,\n Date,\n RegExp,\n Promise,\n Map,\n Set,\n WeakMap,\n WeakSet,\n Symbol,\n BigInt,\n Error,\n TypeError,\n RangeError,\n ReferenceError,\n SyntaxError,\n EvalError,\n URIError\n};\n\n/**\n * Checks if a value matches the expected type(s)\n * @param {*} value - The value to check\n * @param {Function|Array<Function>} expectedType - Single type or array of possible types\n * @param {string} name - Name of the parameter for error messages\n * @returns {boolean} - True if value matches expected type(s)\n */\nexport function checkType(value, expectedType, name = 'value') {\n // Handle array of possible types\n if (Array.isArray(expectedType)) {\n for (const type of expectedType) {\n if (matchesType(value, type)) {\n return true;\n }\n }\n \n const typeNames = expectedType.map(getTypeName).join(' | ');\n throw new TypeError(`${name} must be one of: ${typeNames}. Got ${getTypeName(value)}`);\n }\n \n // Handle single type\n if (!matchesType(value, expectedType)) {\n throw new TypeError(`${name} must be ${getTypeName(expectedType)}. Got ${getTypeName(value)}`);\n }\n \n return true;\n}\n\n/**\n * Checks if a value matches a specific type\n * @param {*} value - The value to check\n * @param {Function} type - The expected constructor/type\n * @returns {boolean} - True if value matches the type\n */\nfunction matchesType(value, type) {\n // Handle primitive constructors\n if (type === String) {\n return typeof value === 'string';\n }\n if (type === Number) {\n return typeof value === 'number' && !isNaN(value);\n }\n if (type === Boolean) {\n return typeof value === 'boolean';\n }\n if (type === Symbol) {\n return typeof value === 'symbol';\n }\n if (type === BigInt) {\n return typeof value === 'bigint';\n }\n if (type === Function) {\n return typeof value === 'function';\n }\n \n // Handle object constructors (including Array, Object, Date, etc.)\n if (type === Array) {\n return Array.isArray(value);\n }\n if (type === Object) {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n }\n \n // Handle other constructors (Date, RegExp, Map, Set, etc.)\n return value instanceof type;\n}\n\n/**\n * Gets a human-readable name for a type\n * @param {*} value - The value or constructor to get name for\n * @returns {string} - Human-readable type name\n */\nfunction getTypeName(value) {\n if (value === String) return 'String';\n if (value === Number) return 'Number';\n if (value === Boolean) return 'Boolean';\n if (value === Array) return 'Array';\n if (value === Object) return 'Object';\n if (value === Function) return 'Function';\n if (value === Date) return 'Date';\n if (value === RegExp) return 'RegExp';\n if (value === Promise) return 'Promise';\n if (value === Map) return 'Map';\n if (value === Set) return 'Set';\n if (value === WeakMap) return 'WeakMap';\n if (value === WeakSet) return 'WeakSet';\n if (value === Symbol) return 'Symbol';\n if (value === BigInt) return 'BigInt';\n if (value === Error) return 'Error';\n \n if (typeof value === 'string') return 'string';\n if (typeof value === 'number') return 'number';\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'symbol') return 'symbol';\n if (typeof value === 'bigint') return 'bigint';\n if (typeof value === 'function') return 'function';\n if (Array.isArray(value)) return 'Array';\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'object') {\n return value.constructor?.name || 'Object';\n }\n \n return 'unknown';\n}\n\n/**\n * Creates a type checker function for a specific parameter\n * @param {Function|Array<Function>} expectedType - Expected type(s)\n * @param {string} name - Parameter name\n * @returns {Function} - Type checker function\n */\nexport function createTypeChecker(expectedType, name = 'value') {\n return (value) => checkType(value, expectedType, name);\n}\n\n/**\n * Validates an object against a schema\n * @param {Object} obj - Object to validate\n * @param {Object} schema - Schema definition { prop: Type, prop2: [Type1, Type2] }\n * @param {string} objName - Name of the object for error messages\n */\nexport function validateObject(obj, schema, objName = 'object') {\n if (!obj || typeof obj !== 'object') {\n throw new TypeError(`${objName} must be an object`);\n }\n \n for (const [prop, expectedType] of Object.entries(schema)) {\n if (prop in obj) {\n checkType(obj[prop], expectedType, `${objName}.${prop}`);\n }\n }\n}\n\n/**\n * Creates a validator function for an object schema\n * @param {Object} schema - Schema definition\n * @param {string} objName - Name of the object\n * @returns {Function} - Validator function\n */\nexport function createObjectValidator(schema, objName = 'object') {\n return (obj) => validateObject(obj, schema, objName);\n}\n\n// Export the type map for advanced usage\nexport { TYPE_MAP };\n", "const DefinitionTypes = new Map();\nconst Definitions = new WeakMap();\nimport { createTypeChecker } from '../utils/typeChecker.js';\n\n/**\n * Creates a definition type with return type validation\n * @param {string} type - The definition type name\n * @param {Function|Array<Function>} returnTypes - Expected return type(s)\n * @returns {Function} - Definition creator function\n */\n\n\nexport const definitionType = (definition) => {\n if (Definitions.has(definition)) {\n return Definitions.get(definition);\n }\n return undefined;\n}\n\nexport const createDefinition = (type, returnTypes = []) => { \n // Create type checker for return values if returnTypes specified\n const returnTypeChecker = returnTypes.length > 0 ? createTypeChecker(returnTypes, 'return value') : null;\n \n if (DefinitionTypes.has(type)) {\n console.warn(`Definition type \"${type}\" already exists`);\n return DefinitionTypes.get(type);\n }\n\n const definitionType = (name, factory, ...defaultArgs) => {\n // Validate inputs using type checker\n createTypeChecker(String, 'name')(name);\n createTypeChecker(Function, 'factory')(factory);\n\n const definition = (...args) => {\n try {\n const combinedArgs = [...args, ...defaultArgs];\n const res = factory(...combinedArgs);\n \n if (returnTypeChecker && res === undefined) {\n throw new Error(`Factory ${type} must return a value for ${name}`);\n }\n\n // Use type checker to validate return value\n if (returnTypeChecker) {\n returnTypeChecker(res);\n }\n\n return res\n } catch (error) {\n console.error(`Error creating definition \"${name}\"`, error);\n throw error;\n }\n }\n\n Object.defineProperty(definition, '_name', {\n value: name,\n enumerable: false,\n configurable: false\n });\n\n Definitions.set(definition, type);\n\n return definition;\n }\n\n DefinitionTypes.set(type, definitionType);\n\n return definitionType;\n}; ", "// utils/asserts.js\n\nconst BAD_KEYS = new Set(['__proto__', 'prototype', 'constructor']);\nconst RESERVED_NAMESPACES = new Set(['use', 'install', 'uninstall', 'relay', 'state', 'debug']);\n\nconst MAX_NAME_LENGTH = 64;\nconst VALID_NAME = /^[a-zA-Z_$][a-zA-Z_$0-9]*$/;\n\n/**\n * Throw if key is unsafe (__proto__, constructor, etc.)\n */\nexport function assertSafeKey(key, where = 'key') {\n if (BAD_KEYS.has(key)) {\n throw new Error(`Illegal key \"${key}\" in ${where}`);\n }\n}\n\n/**\n * Validate a namespace string: format, length, reserved words, proto poisoning.\n */\nexport function assertNamespace(ns) {\n assertSafeKey(ns, 'namespace');\n if (typeof ns !== 'string') {\n throw new Error(`Namespace must be a string, got ${typeof ns}`);\n }\n if (!VALID_NAME.test(ns)) {\n throw new Error(`Invalid namespace \"${ns}\". Must be a valid JS identifier`);\n }\n if (ns.length > MAX_NAME_LENGTH) {\n throw new Error(`Namespace \"${ns}\" too long (max ${MAX_NAME_LENGTH} chars)`);\n }\n if (RESERVED_NAMESPACES.has(ns)) {\n throw new Error(`Namespace \"${ns}\" is reserved`);\n }\n return ns;\n}\n\n/**\n * Validate an action or getter name within a namespace.\n */\nexport function assertMemberName(name, namespace, kind = 'member') {\n assertSafeKey(name, `${kind}:${namespace}`);\n if (typeof name !== 'string') {\n throw new Error(`${kind} name in ${namespace} must be a string`);\n }\n if (!VALID_NAME.test(name)) {\n throw new Error(`Invalid ${kind} name \"${name}\" in ${namespace}`);\n }\n if (name.length > MAX_NAME_LENGTH) {\n throw new Error(\n `${kind} name \"${name}\" in ${namespace} too long (max ${MAX_NAME_LENGTH})`\n );\n }\n return name;\n}\n", "import { createDefinition, definitionType } from './createDefinition.js';\nexport const defineMiddleware = createDefinition('MIDDLEWARE', [Function, Array]);\nexport const defineActions = createDefinition('ACTIONS', [Object]);\nexport const defineUninstall = createDefinition('UNINSTALL');\nexport const defineInitialize = createDefinition('INITIALIZE');\nexport const defineGetters = createDefinition('GETTERS', [Object]);\nexport { createDefinition, definitionType };", "// DefinitionBuilder.js\nimport { defineActions, defineGetters, defineMiddleware, defineInitialize, defineUninstall } from './defaults.js';\n\nexport class DefinitionBuilder {\n static create(namespace) {\n return new DefinitionBuilder(namespace);\n }\n\n #ns; #args;\n #slots = { MIDDLEWARE:null, GETTERS:null, ACTIONS:null, INITIALIZE:null, UNINSTALL:null };\n constructor(namespace) { this.#ns = namespace }\n\n #set(type, factory, creator) {\n if (this.#slots[type]) throw new Error(`${type} already defined for ${this.#ns}`);\n this.#slots[type] = creator(this.#ns, factory);\n }\n\n defineMiddleware = (factory) => this.#set('MIDDLEWARE', factory, defineMiddleware);\n defineGetters = (factory) => this.#set('GETTERS', factory, defineGetters);\n defineActions = (factory) => this.#set('ACTIONS', factory, defineActions);\n defineInitialize = (factory) => this.#set('INITIALIZE', factory, defineInitialize);\n defineUninstall = (factory) => this.#set('UNINSTALL', factory, defineUninstall);\n\n _toArray() {\n return [\n this.#slots.MIDDLEWARE,\n this.#slots.GETTERS,\n this.#slots.ACTIONS,\n this.#slots.INITIALIZE,\n this.#slots.UNINSTALL\n ].filter(Boolean);\n }\n}\n\n", "import { assertNamespace } from './utils/asserts.js';\nimport { DefinitionBuilder } from './definitions/DefinitionBuilder.js';\n\n\nexport class ServiceProvider {\n static #services = new Set();\n\n static manifest = {\n name: 'base',\n dependencies: [],\n version: '1.0.0',\n description: 'Base extension template',\n };\n\n static config = null;\n\n static unique = false;\n\n static configure(options = {}) {\n return {\n install: (useContext, config) => this.install(useContext, config),\n manifest: this.manifest,\n config: { ...(this.config || this.manifest.defaults || {}), ...options },\n unique: true,\n configured: true\n };\n }\n\n static install(useContext, config) { \n try {\n const {namespace} = this.manifest;\n assertNamespace(namespace);\n\n // instantiate\n const instance = new this();\n ServiceProvider.#services.add(instance);\n\n // bind context/config\n // bind config (frozen to avoid accidental mutation)\n Object.defineProperty(instance, 'config', {\n value: Object.freeze({ ...config }),\n writable: false,\n configurable: false,\n enumerable: false,\n });\n\n // expose both a live context getter AND the keyed accessor\n Object.defineProperty(instance, 'context', {\n get: () => useContext(), // always fresh, via your proxy\n configurable: false,\n enumerable: false,\n });\n \n Object.defineProperty(instance, 'useContext', {\n value: (...keys) => useContext(...keys),\n writable: false,\n configurable: false,\n enumerable: false,\n });\n\n const builder = DefinitionBuilder.create(namespace);\n\n if (instance.setup) {\n // Create properly bound context for setup pattern\n const setupContext = {\n defineActions: (factory) => builder.defineActions(() => factory(useContext, config)),\n defineMiddleware: (factory) => builder.defineMiddleware(() => factory(useContext, config)),\n defineGetters: (factory) => builder.defineGetters(() => factory(useContext, config)),\n defineInitialize: (factory) => builder.defineInitialize(() => factory(useContext, config)),\n defineUninstall: (factory) => builder.defineUninstall(() => factory(useContext, config))\n };\n const maybe = instance.setup(setupContext);\n return maybe?.then ? maybe.then(() => builder._toArray()) : builder._toArray();\n }\n\n if (instance.middleware) builder.defineMiddleware(() => instance.middleware(useContext, config));\n if (instance.getters) builder.defineGetters (() => instance.getters(useContext, config));\n if (instance.actions) builder.defineActions (() => instance.actions(useContext, config));\n if (instance.initialize) builder.defineInitialize(() => instance.initialize(useContext, config));\n if (instance.uninstall) builder.defineUninstall (() => instance.uninstall(useContext, config));\n\n return builder._toArray();\n } catch (error) {\n throw error;\n }\n }\n}", "const ENGINE_CONTEXT = Symbol('jucie.engine');\n\n/**\n * Registers the engine globally, but only if no engine has already been set.\n * @param {object} engine \n */\n\nexport function provideEngine(engine) {\n if (!globalThis[ENGINE_CONTEXT]) {\n globalThis[ENGINE_CONTEXT] = engine;\n }\n}\n\nexport function hasEngine() {\n return globalThis[ENGINE_CONTEXT] !== undefined;\n}\n\n/**\n * Forcefully override the engine in the global context.\n * Useful for testing or resetting.\n */\nexport function forceEngine(engine) {\n globalThis[ENGINE_CONTEXT] = engine;\n}\n\n/**\n * Retrieves the globally registered engine.\n */\nexport function getEngine() {\n return globalThis[ENGINE_CONTEXT] || null;\n}\n\n/**\n * Retrieves the globally registered engine.\n */\nexport function useEngine() {\n return getEngine();\n}", "import { Server } from 'socket.io';\nimport { ServiceProvider } from '@jucie.io/engine';\nconst DEFAULT_NAMESPACE = Symbol('DEFAULT_NAMESPACE');\n\nexport class SocketServer extends ServiceProvider {\n #io = null;\n #namespaces = new Map();\n #lifecycle = new Map();\n \n \n static manifest = {\n name: 'socket-server',\n namespace: 'socket',\n defaults: {\n cors: {},\n options: {\n transports: ['websocket', 'polling']\n },\n auth: null,\n }\n }\n\n initialize(useContext, config = {}) {\n const server = useContext('server');\n if (!server) {\n return;\n }\n const httpServer = server.getHttpServer();\n\n console.log('httpServer', httpServer);\n\n if (!httpServer) {\n return\n }\n this.#setupIO(httpServer);\n return this;\n }\n\n actions(useContext) {\n\n const actions = {\n start: (httpServer) => {\n httpServer = httpServer || useContext('server').getHttpServer();\n if (!httpServer) {\n throw new Error('HTTP server not found');\n }\n this.#setupIO(httpServer);\n return actions;\n },\n create: (name, options = {}) => {\n const namespace = this.#io.of(`/${name}`);\n this.#namespaces.set(name, namespace);\n return namespace;\n },\n get: (name = DEFAULT_NAMESPACE) => {\n if (this.#namespaces.has(name)) {\n return this.#namespaces.get(name);\n }\n return this.#io.of(`/${name}`);\n },\n destroy: (name) => {\n if (!this.#io) {\n throw new Error('Socket server not initialized');\n }\n const namespace = this.#namespaces.get(name);\n if (namespace) {\n namespace.close();\n }\n this.#namespaces.delete(name);\n return actions;\n }\n }\n return actions;\n }\n\n #setupIO(httpServer) {\n this.#io = new Server(httpServer, {...this.config });\n const defaultNamespace = this.#io.of('/');\n this.#setUpErrorHandlers(defaultNamespace);\n this.#setUpLifecycleHandlers(defaultNamespace);\n this.#namespaces.set(DEFAULT_NAMESPACE, defaultNamespace);\n return this;\n }\n\n #setUpErrorHandlers(socket) {\n socket.on('connect_error', (error) => {\n console.error('Socket connection error:', error);\n });\n }\n\n #setUpLifecycleHandlers(socket) {\n socket.on('connect', (clientSocket) => {\n console.log('Socket connected!');\n });\n }\n} "],
5
+ "mappings": "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",
6
+ "names": ["Manager", "GLOBAL_NS_OBJ", "checkType", "value", "expectedType", "name", "type", "matchesType", "typeNames", "getTypeName", "createTypeChecker", "DefinitionTypes", "Definitions", "createDefinition", "type", "returnTypes", "returnTypeChecker", "createTypeChecker", "DefinitionTypes", "definitionType", "name", "factory", "defaultArgs", "definition", "args", "combinedArgs", "res", "error", "Definitions", "BAD_KEYS", "RESERVED_NAMESPACES", "MAX_NAME_LENGTH", "VALID_NAME", "assertSafeKey", "key", "where", "assertNamespace", "ns", "defineMiddleware", "createDefinition", "defineActions", "defineUninstall", "defineInitialize", "defineGetters", "DefinitionBuilder", "_DefinitionBuilder", "namespace", "#ns", "#args", "#slots", "#set", "type", "factory", "creator", "defineMiddleware", "defineGetters", "defineActions", "defineInitialize", "defineUninstall", "ServiceProvider", "_ServiceProvider", "#services", "options", "useContext", "config", "namespace", "assertNamespace", "instance", "keys", "builder", "DefinitionBuilder", "setupContext", "factory", "maybe", "error", "ENGINE_CONTEXT", "DEFAULT_NAMESPACE", "SocketClient", "ServiceProvider", "#io", "#namespaces", "#lifecycle", "useContext", "config", "#setupIO", "_", "url", "options", "name", "defaultNamespace", "namespace", "callback", "urls", "auth", "Manager", "#setUplLifecycleHandlers", "socket", "error", "Server", "DEFAULT_NAMESPACE", "SocketServer", "ServiceProvider", "#io", "#namespaces", "#lifecycle", "useContext", "config", "server", "httpServer", "#setupIO", "actions", "name", "options", "namespace", "Server", "defaultNamespace", "#setUpErrorHandlers", "#setUpLifecycleHandlers", "socket", "error", "clientSocket"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var Z=Object.freeze(Object.create(null));function _(n,e,t="value"){if(Array.isArray(e)){for(let i of e)if(I(n,i))return!0;let r=e.map(y).join(" | ");throw new TypeError(`${t} must be one of: ${r}. Got ${y(n)}`)}if(!I(n,e))throw new TypeError(`${t} must be ${y(e)}. Got ${y(n)}`);return!0}function I(n,e){return e===String?typeof n=="string":e===Number?typeof n=="number"&&!isNaN(n):e===Boolean?typeof n=="boolean":e===Symbol?typeof n=="symbol":e===BigInt?typeof n=="bigint":e===Function?typeof n=="function":e===Array?Array.isArray(n):e===Object?n!==null&&typeof n=="object"&&!Array.isArray(n):n instanceof e}function y(n){return n===String?"String":n===Number?"Number":n===Boolean?"Boolean":n===Array?"Array":n===Object?"Object":n===Function?"Function":n===Date?"Date":n===RegExp?"RegExp":n===Promise?"Promise":n===Map?"Map":n===Set?"Set":n===WeakMap?"WeakMap":n===WeakSet?"WeakSet":n===Symbol?"Symbol":n===BigInt?"BigInt":n===Error?"Error":typeof n=="string"?"string":typeof n=="number"?"number":typeof n=="boolean"?"boolean":typeof n=="symbol"?"symbol":typeof n=="bigint"?"bigint":typeof n=="function"?"function":Array.isArray(n)?"Array":n===null?"null":n===void 0?"undefined":typeof n=="object"?n.constructor?.name||"Object":"unknown"}function d(n,e="value"){return t=>_(t,n,e)}var w=new Map,A=new WeakMap,u=n=>{if(A.has(n))return A.get(n)},f=(n,e=[])=>{let t=e.length>0?d(e,"return value"):null;if(w.has(n))return console.warn(`Definition type "${n}" already exists`),w.get(n);let r=(i,s,...h)=>{d(String,"name")(i),d(Function,"factory")(s);let o=(...a)=>{try{let c=[...a,...h],l=s(...c);if(t&&l===void 0)throw new Error(`Factory ${n} must return a value for ${i}`);return t&&t(l),l}catch(c){throw console.error(`Error creating definition "${i}"`,c),c}};return Object.defineProperty(o,"_name",{value:i,enumerable:!1,configurable:!1}),A.set(o,n),o};return w.set(n,r),r};var V=new Set(["__proto__","prototype","constructor"]),B=new Set(["use","install","uninstall","relay","state","debug"]),k=64,U=/^[a-zA-Z_$][a-zA-Z_$0-9]*$/;function z(n,e="key"){if(V.has(n))throw new Error(`Illegal key "${n}" in ${e}`)}function x(n){if(z(n,"namespace"),typeof n!="string")throw new Error(`Namespace must be a string, got ${typeof n}`);if(!U.test(n))throw new Error(`Invalid namespace "${n}". Must be a valid JS identifier`);if(n.length>k)throw new Error(`Namespace "${n}" too long (max ${k} chars)`);if(B.has(n))throw new Error(`Namespace "${n}" is reserved`);return n}var E=f("MIDDLEWARE",[Function,Array]),S=f("ACTIONS",[Object]),T=f("UNINSTALL"),C=f("INITIALIZE"),M=f("GETTERS",[Object]);var g=class n{static create(e){return new n(e)}#e;#i;#t={MIDDLEWARE:null,GETTERS:null,ACTIONS:null,INITIALIZE:null,UNINSTALL:null};constructor(e){this.#e=e}#n(e,t,r){if(this.#t[e])throw new Error(`${e} already defined for ${this.#e}`);this.#t[e]=r(this.#e,t)}defineMiddleware=e=>this.#n("MIDDLEWARE",e,E);defineGetters=e=>this.#n("GETTERS",e,M);defineActions=e=>this.#n("ACTIONS",e,S);defineInitialize=e=>this.#n("INITIALIZE",e,C);defineUninstall=e=>this.#n("UNINSTALL",e,T);_toArray(){return[this.#t.MIDDLEWARE,this.#t.GETTERS,this.#t.ACTIONS,this.#t.INITIALIZE,this.#t.UNINSTALL].filter(Boolean)}};var p=class n{static#e=new Set;static manifest={name:"base",dependencies:[],version:"1.0.0",description:"Base extension template"};static config=null;static unique=!1;static configure(e={}){return{install:(t,r)=>this.install(t,r),manifest:this.manifest,config:{...this.config||this.manifest.defaults||{},...e},unique:!0,configured:!0}}static install(e,t){try{let{namespace:r}=this.manifest;x(r);let i=new this;n.#e.add(i),Object.defineProperty(i,"config",{value:Object.freeze({...t}),writable:!1,configurable:!1,enumerable:!1}),Object.defineProperty(i,"context",{get:()=>e(),configurable:!1,enumerable:!1}),Object.defineProperty(i,"useContext",{value:(...h)=>e(...h),writable:!1,configurable:!1,enumerable:!1});let s=g.create(r);if(i.setup){let h={defineActions:a=>s.defineActions(()=>a(e,t)),defineMiddleware:a=>s.defineMiddleware(()=>a(e,t)),defineGetters:a=>s.defineGetters(()=>a(e,t)),defineInitialize:a=>s.defineInitialize(()=>a(e,t)),defineUninstall:a=>s.defineUninstall(()=>a(e,t))},o=i.setup(h);return o?.then?o.then(()=>s._toArray()):s._toArray()}return i.middleware&&s.defineMiddleware(()=>i.middleware(e,t)),i.getters&&s.defineGetters(()=>i.getters(e,t)),i.actions&&s.defineActions(()=>i.actions(e,t)),i.initialize&&s.defineInitialize(()=>i.initialize(e,t)),i.uninstall&&s.defineUninstall(()=>i.uninstall(e,t)),s._toArray()}catch(r){throw r}}};var Ge=Symbol("jucie.engine");var m={TRANSITION:"TRANSITION",MACHINE:"MACHINE"},q=f(m.TRANSITION,[Object]),D=f(m.MACHINE,[Object]),O=class extends p{static manifest={name:"stateMachine",namespace:"stateMachine",dependencies:[],version:"1.0.0",description:"State machine extension for handling complex state transitions",author:"",license:"MIT",homepage:"",repository:{type:"git",url:""},defaults:{debug:!1}};#e=null;initialize(e){let t=e("state");t||(t=createState().install(OnChange)),this.#e=t.ref("_transitions")}actions(e,t){return{create:r=>{let i=D(r,()=>t);this.#i(i)},use:(...r)=>{for(let i of r)this.#i(i)},transition:(r,i)=>this.transition(r,i),getCurrentState:r=>this.getCurrentState(r)}}getters(){return{transitions:()=>this.#e.get()}}#i(e){if(u(e)!==m.MACHINE)throw new Error("Machine must be a machine definition");let t=e._name,r=e();if(!t||typeof t!="string")throw new Error("Machine ID must be a string");if(!r||typeof r!="object")throw new Error("Machine config must be an object");this.createMachine(t,r)}createMachine(e,t){if(this.#e.set([e],{currentState:t.initialState,transitions:{},actions:{},conditions:{}}),t.actions&&this.#e.set([e,"actions"],t.actions),t.conditions&&this.#e.set([e,"conditions"],t.conditions),t.transitions)if(Array.isArray(t.transitions)){for(let i of t.transitions)if(u(i)===m.TRANSITION){let s=i._name,{entry:h=null,loop:o=null,exit:a=null,on:c=null,actions:l=null,conditions:$=null}=i(this.useContext);this.#e.set([e,"transitions",s],{entry:h,loop:o,exit:a,on:c}),l&&this.#e.update([e,"actions"],b=>({...b,...l})),$&&this.#e.update([e,"conditions"],b=>({...b,...$}))}}else this.#e.set([e,"transitions"],t.transitions);let r=this.#e.get([e,"transitions",t.initialState]);r.entry&&this.executeAction(e,r.entry)}findValidTransition(e,t){if(!Array.isArray(t))return t.when?this.evaluateCondition(e,t.when)?t:null:t;for(let r of t)if(r.to){if(Array.isArray(r.to)){if(!r.when||this.evaluateCondition(e,r.when)){let i=this.findValidTransition(e,r.to);if(i)return i}}else if(!r.when||this.evaluateCondition(e,r.when))return r}return null}transition(e,t,r={}){let i=this.#e.get([e]);if(!i)return;let s=i.transitions[i.currentState];if(!s){console.warn(`[StateMachine] No current state found for machine "${i.currentState}" in machine "${e}"`);return}let h=s.on?.[t]||[],o=this.findValidTransition(e,h);if(o){if(o.do&&this.executeAction(e,o.do,r),(o.to===i.currentState||o.to==="self")&&s.loop){this.executeAction(e,s.loop,r);return}s.exit&&this.executeAction(e,s.exit);let c=o.to==="self"?i.currentState:o.to,l=i.transitions[c];if(!l){console.warn(`[StateMachine] No next state found for machine "${e}" - must be a valid state name`,c);return}this.#e.set([e,"currentState"],c),l.entry&&this.executeAction(e,l.entry),this.log&&console.log(`[StateMachine:${e}] ${i.currentState} -> ${c}`)}}executeAction(e,t,r=[]){if(!t)return;let i=this.#e.get([e]);if(typeof t=="string"){let s=i.actions[t];typeof s=="function"?s(this._engine):console.warn(`[StateMachine] Action "${t}" not found in machine "${e}"`);return}if(typeof t=="function"){t(this._engine,...r);return}console.warn(`[StateMachine] Invalid action type in machine "${e}" - must be string or function`,t)}evaluateCondition(e,t){if(!t)return!0;let r=this.#e.get([e]);if(typeof t=="string"){let i=r.conditions[t];return typeof i=="function"?!!i(this):(console.warn(`[StateMachine] Condition "${t}" not found in machine "${e}"`),!1)}return typeof t=="function"?!!t(this):this.reactors.isReactor(t)?!!t.value:t?.all&&Array.isArray(t.all)?t.all.every(i=>this.evaluateCondition(e,i)):t?.some&&Array.isArray(t.some)?t.some.some(i=>this.evaluateCondition(e,i)):(console.warn(`[StateMachine] Invalid condition type in machine "${e}" - must be string, function, array, or computed`,t),!1)}getCurrentState(e){return this.#e.get([e,"currentState"])}};export{O as StateMachine,D as defineMachine,q as defineTransition};
2
+ //# sourceMappingURL=state-machine.js.map