@objectstack/runtime 1.0.10 → 1.0.11
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.
- package/.turbo/turbo-build.log +7 -7
- package/CHANGELOG.md +8 -0
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/http-dispatcher.ts +3 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/runtime.ts","../src/route-manager.ts","../src/rest-server.ts","../src/api-registry-plugin.ts","../src/driver-plugin.ts","../src/app-plugin.ts","../src/http-server.ts","../src/http-dispatcher.ts","../src/middleware.ts"],"sourcesContent":["// Export Kernels\nexport { ObjectKernel } from '@objectstack/core';\n\n// Export Runtime\nexport { Runtime } from './runtime.js';\nexport type { RuntimeConfig } from './runtime.js';\n\n// Export Plugins\nexport { DriverPlugin } from './driver-plugin.js';\nexport { AppPlugin } from './app-plugin.js';\nexport { createApiRegistryPlugin } from './api-registry-plugin.js';\nexport type { ApiRegistryConfig } from './api-registry-plugin.js';\n\n// Export HTTP Server Components\nexport { HttpServer } from './http-server.js';\nexport { HttpDispatcher } from './http-dispatcher.js';\nexport type { HttpProtocolContext, HttpDispatcherResult } from './http-dispatcher.js';\nexport { RestServer } from './rest-server.js';\nexport { RouteManager, RouteGroupBuilder } from './route-manager.js';\nexport type { RouteEntry } from './route-manager.js';\nexport { MiddlewareManager } from './middleware.js';\n\n// Export Types\nexport * from '@objectstack/core';\n\n\n\n","import { ObjectKernel, Plugin, IHttpServer, ObjectKernelConfig } from '@objectstack/core';\nimport { createApiRegistryPlugin, ApiRegistryConfig } from './api-registry-plugin.js';\n\nexport interface RuntimeConfig {\n /**\n * Optional existing server instance (e.g. Hono, Express app)\n * If provided, Runtime will use it as the 'http.server' service.\n * If not provided, Runtime expects a server plugin (like HonoServerPlugin) to be registered manually.\n */\n server?: IHttpServer;\n \n /**\n * API Registry Configuration\n */\n api?: ApiRegistryConfig;\n\n /**\n * Kernel Configuration\n */\n kernel?: ObjectKernelConfig;\n}\n\n/**\n * ObjectStack Runtime\n * \n * High-level entry point for bootstrapping an ObjectStack application.\n * Wraps ObjectKernel and provides standard orchestration for:\n * - HTTP Server binding\n * - API Registry (REST Routes)\n * - Plugin Management\n */\nexport class Runtime {\n readonly kernel: ObjectKernel;\n \n constructor(config: RuntimeConfig = {}) {\n this.kernel = new ObjectKernel(config.kernel);\n \n // If external server provided, register it immediately\n if (config.server) {\n // If the provided server is not already an HttpServer wrapper, wrap it?\n // Since IHttpServer is the interface, we assume it complies.\n // But HttpServer class in runtime is an adapter.\n // If user passes raw Hono, it won't work unless they wrapped it.\n // We'll assume they pass a compliant IHttpServer.\n this.kernel.registerService('http.server', config.server);\n }\n \n // Register API Registry by default\n // This plugin is passive (wait for services) so it's safe to add early.\n this.kernel.use(createApiRegistryPlugin(config.api));\n }\n \n /**\n * Register a plugin\n */\n use(plugin: Plugin) {\n this.kernel.use(plugin);\n return this;\n }\n \n /**\n * Start the runtime\n * 1. Initializes all plugins (init phase)\n * 2. Starts all plugins (start phase)\n */\n async start() {\n await this.kernel.bootstrap();\n return this;\n }\n \n /**\n * Get the kernel instance\n */\n getKernel() {\n return this.kernel;\n }\n}\n","import { RouteHandler, IHttpServer } from '@objectstack/core';\nimport { System, Shared } from '@objectstack/spec';\nimport { z } from 'zod';\n\ntype RouteHandlerMetadata = System.RouteHandlerMetadata;\ntype HttpMethod = z.infer<typeof Shared.HttpMethod>;\n\n/**\n * Route Entry\n * Internal representation of registered routes\n */\nexport interface RouteEntry {\n method: HttpMethod;\n path: string;\n handler: RouteHandler;\n metadata?: RouteHandlerMetadata['metadata'];\n security?: RouteHandlerMetadata['security'];\n}\n\n/**\n * RouteManager\n * \n * Manages route registration and organization for HTTP servers.\n * Provides:\n * - Route registration with metadata\n * - Route lookup and querying\n * - Bulk route registration\n * - Route grouping by prefix\n * \n * @example\n * const manager = new RouteManager(server);\n * \n * // Register individual route\n * manager.register({\n * method: 'GET',\n * path: '/api/users/:id',\n * handler: getUserHandler,\n * metadata: {\n * summary: 'Get user by ID',\n * tags: ['users']\n * }\n * });\n * \n * // Register route group\n * manager.group('/api/users', (group) => {\n * group.get('/', listUsersHandler);\n * group.post('/', createUserHandler);\n * group.get('/:id', getUserHandler);\n * });\n */\nexport class RouteManager {\n private server: IHttpServer;\n private routes: Map<string, RouteEntry>;\n \n constructor(server: IHttpServer) {\n this.server = server;\n this.routes = new Map();\n }\n \n /**\n * Register a route\n * @param entry - Route entry with method, path, handler, and metadata\n */\n register(entry: Omit<RouteEntry, 'handler'> & { handler: RouteHandler | string }): void {\n // Validate handler type - string handlers not yet supported\n if (typeof entry.handler === 'string') {\n throw new Error(\n `String-based route handlers are not supported yet. ` +\n `Received handler identifier \"${entry.handler}\". ` +\n `Please provide a RouteHandler function instead.`\n );\n }\n \n const handler: RouteHandler = entry.handler;\n \n const routeEntry: RouteEntry = {\n method: entry.method,\n path: entry.path,\n handler,\n metadata: entry.metadata,\n security: entry.security,\n };\n \n const key = this.getRouteKey(entry.method, entry.path);\n this.routes.set(key, routeEntry);\n \n // Register with underlying server\n this.registerWithServer(routeEntry);\n }\n \n /**\n * Register multiple routes\n * @param entries - Array of route entries\n */\n registerMany(entries: Array<Omit<RouteEntry, 'handler'> & { handler: RouteHandler | string }>): void {\n entries.forEach(entry => this.register(entry));\n }\n \n /**\n * Unregister a route\n * @param method - HTTP method\n * @param path - Route path\n */\n unregister(method: HttpMethod, path: string): void {\n const key = this.getRouteKey(method, path);\n this.routes.delete(key);\n // Note: Most server frameworks don't support unregistering routes at runtime\n // This just removes it from our registry\n }\n \n /**\n * Get route by method and path\n * @param method - HTTP method\n * @param path - Route path\n */\n get(method: HttpMethod, path: string): RouteEntry | undefined {\n const key = this.getRouteKey(method, path);\n return this.routes.get(key);\n }\n \n /**\n * Get all routes\n */\n getAll(): RouteEntry[] {\n return Array.from(this.routes.values());\n }\n \n /**\n * Get routes by method\n * @param method - HTTP method\n */\n getByMethod(method: HttpMethod): RouteEntry[] {\n return this.getAll().filter(route => route.method === method);\n }\n \n /**\n * Get routes by path prefix\n * @param prefix - Path prefix\n */\n getByPrefix(prefix: string): RouteEntry[] {\n return this.getAll().filter(route => route.path.startsWith(prefix));\n }\n \n /**\n * Get routes by tag\n * @param tag - Tag name\n */\n getByTag(tag: string): RouteEntry[] {\n return this.getAll().filter(route => \n route.metadata?.tags?.includes(tag)\n );\n }\n \n /**\n * Create a route group with common prefix\n * @param prefix - Common path prefix\n * @param configure - Function to configure routes in the group\n */\n group(prefix: string, configure: (group: RouteGroupBuilder) => void): void {\n const builder = new RouteGroupBuilder(this, prefix);\n configure(builder);\n }\n \n /**\n * Get route count\n */\n count(): number {\n return this.routes.size;\n }\n \n /**\n * Clear all routes\n */\n clear(): void {\n this.routes.clear();\n }\n \n /**\n * Get route key for storage\n */\n private getRouteKey(method: HttpMethod, path: string): string {\n return `${method}:${path}`;\n }\n \n /**\n * Register route with underlying server\n */\n private registerWithServer(entry: RouteEntry): void {\n const { method, path, handler } = entry;\n \n switch (method) {\n case 'GET':\n this.server.get(path, handler);\n break;\n case 'POST':\n this.server.post(path, handler);\n break;\n case 'PUT':\n this.server.put(path, handler);\n break;\n case 'DELETE':\n this.server.delete(path, handler);\n break;\n case 'PATCH':\n this.server.patch(path, handler);\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n }\n}\n\n/**\n * RouteGroupBuilder\n * \n * Builder for creating route groups with common prefix\n */\nexport class RouteGroupBuilder {\n private manager: RouteManager;\n private prefix: string;\n \n constructor(manager: RouteManager, prefix: string) {\n this.manager = manager;\n this.prefix = prefix;\n }\n \n /**\n * Register GET route in group\n */\n get(path: string, handler: RouteHandler, metadata?: RouteHandlerMetadata['metadata']): this {\n this.manager.register({\n method: 'GET',\n path: this.resolvePath(path),\n handler,\n metadata,\n });\n return this;\n }\n \n /**\n * Register POST route in group\n */\n post(path: string, handler: RouteHandler, metadata?: RouteHandlerMetadata['metadata']): this {\n this.manager.register({\n method: 'POST',\n path: this.resolvePath(path),\n handler,\n metadata,\n });\n return this;\n }\n \n /**\n * Register PUT route in group\n */\n put(path: string, handler: RouteHandler, metadata?: RouteHandlerMetadata['metadata']): this {\n this.manager.register({\n method: 'PUT',\n path: this.resolvePath(path),\n handler,\n metadata,\n });\n return this;\n }\n \n /**\n * Register PATCH route in group\n */\n patch(path: string, handler: RouteHandler, metadata?: RouteHandlerMetadata['metadata']): this {\n this.manager.register({\n method: 'PATCH',\n path: this.resolvePath(path),\n handler,\n metadata,\n });\n return this;\n }\n \n /**\n * Register DELETE route in group\n */\n delete(path: string, handler: RouteHandler, metadata?: RouteHandlerMetadata['metadata']): this {\n this.manager.register({\n method: 'DELETE',\n path: this.resolvePath(path),\n handler,\n metadata,\n });\n return this;\n }\n \n /**\n * Resolve full path with prefix\n */\n private resolvePath(path: string): string {\n // Normalize slashes\n const normalizedPrefix = this.prefix.endsWith('/') \n ? this.prefix.slice(0, -1) \n : this.prefix;\n const normalizedPath = path.startsWith('/') \n ? path \n : '/' + path;\n \n return normalizedPrefix + normalizedPath;\n }\n}\n","import { IHttpServer } from '@objectstack/core';\nimport { RouteManager } from './route-manager.js';\nimport { RestServerConfig, RestApiConfig, CrudEndpointsConfig, MetadataEndpointsConfig, BatchEndpointsConfig, RouteGenerationConfig } from '@objectstack/spec/api';\nimport { ObjectStackProtocol } from '@objectstack/spec/api';\n\n/**\n * Normalized REST Server Configuration\n * All nested properties are required after normalization\n */\ntype NormalizedRestServerConfig = {\n api: {\n version: string;\n basePath: string;\n apiPath: string | undefined;\n enableCrud: boolean;\n enableMetadata: boolean;\n enableBatch: boolean;\n enableDiscovery: boolean;\n documentation: RestApiConfig['documentation'];\n responseFormat: RestApiConfig['responseFormat'];\n };\n crud: {\n operations: {\n create: boolean;\n read: boolean;\n update: boolean;\n delete: boolean;\n list: boolean;\n };\n patterns: CrudEndpointsConfig['patterns'];\n dataPrefix: string;\n objectParamStyle: 'path' | 'query';\n };\n metadata: {\n prefix: string;\n enableCache: boolean;\n cacheTtl: number;\n endpoints: {\n types: boolean;\n items: boolean;\n item: boolean;\n schema: boolean;\n };\n };\n batch: {\n maxBatchSize: number;\n enableBatchEndpoint: boolean;\n operations: {\n createMany: boolean;\n updateMany: boolean;\n deleteMany: boolean;\n upsertMany: boolean;\n };\n defaultAtomic: boolean;\n };\n routes: {\n includeObjects: string[] | undefined;\n excludeObjects: string[] | undefined;\n nameTransform: 'none' | 'plural' | 'kebab-case' | 'camelCase';\n overrides: RouteGenerationConfig['overrides'];\n };\n};\n\n/**\n * RestServer\n * \n * Provides automatic REST API endpoint generation for ObjectStack.\n * Generates standard RESTful CRUD endpoints, metadata endpoints, and batch operations\n * based on the configured protocol provider.\n * \n * Features:\n * - Automatic CRUD endpoint generation (GET, POST, PUT, PATCH, DELETE)\n * - Metadata API endpoints (/meta)\n * - Batch operation endpoints (/batch, /createMany, /updateMany, /deleteMany)\n * - Discovery endpoint\n * - Configurable path prefixes and patterns\n * \n * @example\n * const restServer = new RestServer(httpServer, protocolProvider, {\n * api: {\n * version: 'v1',\n * basePath: '/api'\n * },\n * crud: {\n * dataPrefix: '/data'\n * }\n * });\n * \n * restServer.registerRoutes();\n */\nexport class RestServer {\n private protocol: ObjectStackProtocol;\n private config: NormalizedRestServerConfig;\n private routeManager: RouteManager;\n \n constructor(\n server: IHttpServer, \n protocol: ObjectStackProtocol, \n config: RestServerConfig = {}\n ) {\n this.protocol = protocol;\n this.config = this.normalizeConfig(config);\n this.routeManager = new RouteManager(server);\n }\n \n /**\n * Normalize configuration with defaults\n */\n private normalizeConfig(config: RestServerConfig): NormalizedRestServerConfig {\n const api = (config.api ?? {}) as Partial<RestApiConfig>;\n const crud = (config.crud ?? {}) as Partial<CrudEndpointsConfig>;\n const metadata = (config.metadata ?? {}) as Partial<MetadataEndpointsConfig>;\n const batch = (config.batch ?? {}) as Partial<BatchEndpointsConfig>;\n const routes = (config.routes ?? {}) as Partial<RouteGenerationConfig>;\n \n return {\n api: {\n version: api.version ?? 'v1',\n basePath: api.basePath ?? '/api',\n apiPath: api.apiPath,\n enableCrud: api.enableCrud ?? true,\n enableMetadata: api.enableMetadata ?? true,\n enableBatch: api.enableBatch ?? true,\n enableDiscovery: api.enableDiscovery ?? true,\n documentation: api.documentation,\n responseFormat: api.responseFormat,\n },\n crud: {\n operations: crud.operations ?? {\n create: true,\n read: true,\n update: true,\n delete: true,\n list: true,\n },\n patterns: crud.patterns,\n dataPrefix: crud.dataPrefix ?? '/data',\n objectParamStyle: crud.objectParamStyle ?? 'path',\n },\n metadata: {\n prefix: metadata.prefix ?? '/meta',\n enableCache: metadata.enableCache ?? true,\n cacheTtl: metadata.cacheTtl ?? 3600,\n endpoints: metadata.endpoints ?? {\n types: true,\n items: true,\n item: true,\n schema: true,\n },\n },\n batch: {\n maxBatchSize: batch.maxBatchSize ?? 200,\n enableBatchEndpoint: batch.enableBatchEndpoint ?? true,\n operations: batch.operations ?? {\n createMany: true,\n updateMany: true,\n deleteMany: true,\n upsertMany: true,\n },\n defaultAtomic: batch.defaultAtomic ?? true,\n },\n routes: {\n includeObjects: routes.includeObjects,\n excludeObjects: routes.excludeObjects,\n nameTransform: routes.nameTransform ?? 'none',\n overrides: routes.overrides,\n },\n };\n }\n \n /**\n * Get the full API base path\n */\n private getApiBasePath(): string {\n const { api } = this.config;\n return api.apiPath ?? `${api.basePath}/${api.version}`;\n }\n \n /**\n * Register all REST API routes\n */\n registerRoutes(): void {\n const basePath = this.getApiBasePath();\n \n // Discovery endpoint\n if (this.config.api.enableDiscovery) {\n this.registerDiscoveryEndpoints(basePath);\n }\n \n // Metadata endpoints\n if (this.config.api.enableMetadata) {\n this.registerMetadataEndpoints(basePath);\n }\n \n // CRUD endpoints\n if (this.config.api.enableCrud) {\n this.registerCrudEndpoints(basePath);\n }\n \n // Batch endpoints\n if (this.config.api.enableBatch) {\n this.registerBatchEndpoints(basePath);\n }\n }\n \n /**\n * Register discovery endpoints\n */\n private registerDiscoveryEndpoints(basePath: string): void {\n this.routeManager.register({\n method: 'GET',\n path: basePath,\n handler: async (_req: any, res: any) => {\n try {\n const discovery = await this.protocol.getDiscovery({});\n \n // Override discovery information with actual server configuration\n discovery.version = this.config.api.version;\n \n if (discovery.endpoints) {\n // Ensure endpoints match the actual mounted paths\n if (this.config.api.enableCrud) {\n discovery.endpoints.data = `${basePath}${this.config.crud.dataPrefix}`;\n }\n \n if (this.config.api.enableMetadata) {\n discovery.endpoints.metadata = `${basePath}${this.config.metadata.prefix}`;\n }\n\n // Align auth endpoint with the versioned base path if present\n if (discovery.endpoints.auth) {\n discovery.endpoints.auth = `${basePath}/auth`;\n }\n }\n\n res.json(discovery);\n } catch (error: any) {\n res.status(500).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Get API discovery information',\n tags: ['discovery'],\n },\n });\n }\n \n /**\n * Register metadata endpoints\n */\n private registerMetadataEndpoints(basePath: string): void {\n const { metadata } = this.config;\n const metaPath = `${basePath}${metadata.prefix}`;\n \n // GET /meta - List all metadata types\n if (metadata.endpoints.types !== false) {\n this.routeManager.register({\n method: 'GET',\n path: metaPath,\n handler: async (_req: any, res: any) => {\n try {\n const types = await this.protocol.getMetaTypes({});\n res.json(types);\n } catch (error: any) {\n res.status(500).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'List all metadata types',\n tags: ['metadata'],\n },\n });\n }\n \n // GET /meta/:type - List items of a type\n if (metadata.endpoints.items !== false) {\n this.routeManager.register({\n method: 'GET',\n path: `${metaPath}/:type`,\n handler: async (req: any, res: any) => {\n try {\n const items = await this.protocol.getMetaItems({ type: req.params.type });\n res.json(items);\n } catch (error: any) {\n res.status(404).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'List metadata items of a type',\n tags: ['metadata'],\n },\n });\n }\n \n // GET /meta/:type/:name - Get specific item\n if (metadata.endpoints.item !== false) {\n this.routeManager.register({\n method: 'GET',\n path: `${metaPath}/:type/:name`,\n handler: async (req: any, res: any) => {\n try {\n // Check if cached version is available\n if (metadata.enableCache && this.protocol.getMetaItemCached) {\n const cacheRequest = {\n ifNoneMatch: req.headers['if-none-match'] as string,\n ifModifiedSince: req.headers['if-modified-since'] as string,\n };\n \n const result = await this.protocol.getMetaItemCached({\n type: req.params.type,\n name: req.params.name,\n cacheRequest\n });\n \n if (result.notModified) {\n res.status(304).send();\n return;\n }\n \n // Set cache headers\n if (result.etag) {\n const etagValue = result.etag.weak \n ? `W/\"${result.etag.value}\"` \n : `\"${result.etag.value}\"`;\n res.header('ETag', etagValue);\n }\n if (result.lastModified) {\n res.header('Last-Modified', new Date(result.lastModified).toUTCString());\n }\n if (result.cacheControl) {\n const directives = result.cacheControl.directives.join(', ');\n const maxAge = result.cacheControl.maxAge \n ? `, max-age=${result.cacheControl.maxAge}` \n : '';\n res.header('Cache-Control', directives + maxAge);\n }\n \n res.json(result.data);\n } else {\n // Non-cached version\n const item = await this.protocol.getMetaItem({ type: req.params.type, name: req.params.name });\n res.json(item);\n }\n } catch (error: any) {\n res.status(404).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Get specific metadata item',\n tags: ['metadata'],\n },\n });\n }\n\n // PUT /meta/:type/:name - Save metadata item\n // We always register this route, but return 501 if protocol doesn't support it\n // This makes it discoverable even if not implemented\n this.routeManager.register({\n method: 'PUT',\n path: `${metaPath}/:type/:name`,\n handler: async (req: any, res: any) => {\n try {\n if (!this.protocol.saveMetaItem) {\n res.status(501).json({ error: 'Save operation not supported by protocol implementation' });\n return;\n }\n\n const result = await this.protocol.saveMetaItem({\n type: req.params.type,\n name: req.params.name,\n item: req.body\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Save specific metadata item',\n tags: ['metadata'],\n },\n });\n }\n \n /**\n * Register CRUD endpoints for data operations\n */\n private registerCrudEndpoints(basePath: string): void {\n const { crud } = this.config;\n const dataPath = `${basePath}${crud.dataPrefix}`;\n \n const operations = crud.operations;\n \n // GET /data/:object - List/query records\n if (operations.list) {\n this.routeManager.register({\n method: 'GET',\n path: `${dataPath}/:object`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.findData({\n object: req.params.object, \n query: req.query\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Query records',\n tags: ['data', 'crud'],\n },\n });\n }\n \n // GET /data/:object/:id - Get single record\n if (operations.read) {\n this.routeManager.register({\n method: 'GET',\n path: `${dataPath}/:object/:id`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.getData({\n object: req.params.object, \n id: req.params.id\n });\n res.json(result);\n } catch (error: any) {\n res.status(404).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Get record by ID',\n tags: ['data', 'crud'],\n },\n });\n }\n \n // POST /data/:object - Create record\n if (operations.create) {\n this.routeManager.register({\n method: 'POST',\n path: `${dataPath}/:object`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.createData({\n object: req.params.object, \n data: req.body\n });\n res.status(201).json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Create record',\n tags: ['data', 'crud'],\n },\n });\n }\n \n // PATCH /data/:object/:id - Update record\n if (operations.update) {\n this.routeManager.register({\n method: 'PATCH',\n path: `${dataPath}/:object/:id`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.updateData({\n object: req.params.object,\n id: req.params.id,\n data: req.body\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Update record',\n tags: ['data', 'crud'],\n },\n });\n }\n \n // DELETE /data/:object/:id - Delete record\n if (operations.delete) {\n this.routeManager.register({\n method: 'DELETE',\n path: `${dataPath}/:object/:id`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.deleteData({\n object: req.params.object, \n id: req.params.id\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Delete record',\n tags: ['data', 'crud'],\n },\n });\n }\n }\n \n /**\n * Register batch operation endpoints\n */\n private registerBatchEndpoints(basePath: string): void {\n const { crud, batch } = this.config;\n const dataPath = `${basePath}${crud.dataPrefix}`;\n \n const operations = batch.operations;\n \n // POST /data/:object/batch - Generic batch endpoint\n if (batch.enableBatchEndpoint && this.protocol.batchData) {\n this.routeManager.register({\n method: 'POST',\n path: `${dataPath}/:object/batch`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.batchData!({\n object: req.params.object, \n request: req.body\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Batch operations',\n tags: ['data', 'batch'],\n },\n });\n }\n \n // POST /data/:object/createMany - Bulk create\n if (operations.createMany && this.protocol.createManyData) {\n this.routeManager.register({\n method: 'POST',\n path: `${dataPath}/:object/createMany`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.createManyData!({\n object: req.params.object,\n records: req.body || []\n });\n res.status(201).json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Create multiple records',\n tags: ['data', 'batch'],\n },\n });\n }\n \n // POST /data/:object/updateMany - Bulk update\n if (operations.updateMany && this.protocol.updateManyData) {\n this.routeManager.register({\n method: 'POST',\n path: `${dataPath}/:object/updateMany`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.updateManyData!({\n object: req.params.object,\n ...req.body\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Update multiple records',\n tags: ['data', 'batch'],\n },\n });\n }\n \n // POST /data/:object/deleteMany - Bulk delete\n if (operations.deleteMany && this.protocol.deleteManyData) {\n this.routeManager.register({\n method: 'POST',\n path: `${dataPath}/:object/deleteMany`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.deleteManyData!({\n object: req.params.object, \n ...req.body\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Delete multiple records',\n tags: ['data', 'batch'],\n },\n });\n }\n }\n \n /**\n * Get the route manager\n */\n getRouteManager(): RouteManager {\n return this.routeManager;\n }\n \n /**\n * Get all registered routes\n */\n getRoutes() {\n return this.routeManager.getAll();\n }\n}\n","import { Plugin, PluginContext, IHttpServer } from '@objectstack/core';\nimport { RestServer } from './rest-server.js';\nimport { ObjectStackProtocol, RestServerConfig } from '@objectstack/spec/api';\n\nexport interface ApiRegistryConfig {\n serverServiceName?: string;\n protocolServiceName?: string;\n api?: RestServerConfig;\n}\n\n/**\n * ApiRegistryPlugin\n * \n * Responsibilities:\n * 1. Consumes 'http.server' (or configured service)\n * 2. Consumes 'protocol' (ObjectStackProtocol)\n * 3. Instantiates RestServer to auto-generate routes\n */\nexport function createApiRegistryPlugin(config: ApiRegistryConfig = {}): Plugin {\n return {\n name: 'com.objectstack.runtime.api-registry',\n version: '1.0.0',\n \n init: async (_ctx: PluginContext) => {\n // No service registration, this is a consumer plugin\n },\n \n start: async (ctx: PluginContext) => {\n const serverService = config.serverServiceName || 'http.server';\n const protocolService = config.protocolServiceName || 'protocol';\n \n let server: IHttpServer | undefined;\n let protocol: ObjectStackProtocol | undefined;\n\n try {\n server = ctx.getService<IHttpServer>(serverService);\n } catch (e) {\n // Ignore missing service\n }\n\n try {\n protocol = ctx.getService<ObjectStackProtocol>(protocolService);\n } catch (e) {\n // Ignore missing service\n }\n \n if (!server) {\n ctx.logger.warn(`ApiRegistryPlugin: HTTP Server service '${serverService}' not found. REST routes skipped.`);\n return;\n }\n \n if (!protocol) {\n ctx.logger.warn(`ApiRegistryPlugin: Protocol service '${protocolService}' not found. REST routes skipped.`);\n return;\n }\n \n ctx.logger.info('Hydrating REST API from Protocol...');\n \n try {\n const restServer = new RestServer(server, protocol, config.api as any);\n restServer.registerRoutes();\n \n ctx.logger.info('REST API successfully registered');\n } catch (err: any) {\n ctx.logger.error('Failed to register REST API routes', { error: err.message } as any);\n throw err;\n }\n }\n };\n}\n","import { Plugin, PluginContext } from '@objectstack/core';\n\n/**\n * Driver Plugin\n * \n * Generic plugin wrapper for ObjectQL drivers.\n * Registers a driver with the ObjectQL engine.\n * \n * Dependencies: None (Registers service for ObjectQL to discover)\n * Services: driver.{name}\n * \n * @example\n * const memoryDriver = new InMemoryDriver();\n * const driverPlugin = new DriverPlugin(memoryDriver, 'memory');\n * kernel.use(driverPlugin);\n */\nexport class DriverPlugin implements Plugin {\n name: string;\n type = 'driver';\n version = '1.0.0';\n // dependencies = ['com.objectstack.engine.objectql']; // Removed: Driver is a producer, not strictly a consumer during init\n\n private driver: any;\n\n constructor(driver: any, driverName?: string) {\n this.driver = driver;\n this.name = `com.objectstack.driver.${driverName || driver.name || 'unknown'}`;\n }\n\n init = async (ctx: PluginContext) => {\n // Register driver as a service instead of directly to objectql\n const serviceName = `driver.${this.driver.name || 'unknown'}`;\n ctx.registerService(serviceName, this.driver);\n ctx.logger.info('Driver service registered', { \n serviceName, \n driverName: this.driver.name,\n driverVersion: this.driver.version \n });\n }\n\n start = async (ctx: PluginContext) => {\n // Drivers don't need start phase, initialization happens in init\n // Auto-configure alias for shorter access if it follows reverse domain standard\n if (this.name.startsWith('com.objectstack.driver.')) {\n // const shortName = this.name.split('.').pop();\n // Optional: ctx.registerService(`driver.${shortName}`, this.driver);\n }\n\n // Auto-configure 'default' datasource if none exists\n // We do this in 'start' phase to ensure metadata service is likely available\n try {\n const metadata = ctx.getService<any>('metadata');\n if (metadata && metadata.addDatasource) {\n // Check if default datasource exists\n const datasources = metadata.getDatasources ? metadata.getDatasources() : [];\n const hasDefault = datasources.some((ds: any) => ds.name === 'default');\n\n if (!hasDefault) {\n ctx.logger.info(`[DriverPlugin] No 'default' datasource found. Auto-configuring '${this.driver.name}' as default.`);\n await metadata.addDatasource({\n name: 'default',\n driver: this.driver.name, // The driver's internal name (e.g. com.objectstack.driver.memory)\n });\n }\n }\n } catch (e) {\n // Metadata service might not be ready or available, which is fine\n // We just skip auto-configuration\n ctx.logger.debug('[DriverPlugin] Failed to auto-configure default datasource (Metadata service missing?)', { error: e });\n }\n\n ctx.logger.debug('Driver plugin started', { driverName: this.driver.name || 'unknown' });\n }\n}\n","import { Plugin, PluginContext } from '@objectstack/core';\n\n/**\n * AppPlugin\n * \n * Adapts a generic App Bundle (Manifest + Runtime Code) into a Kernel Plugin.\n * \n * Responsibilities:\n * 1. Register App Manifest as a service (for ObjectQL discovery)\n * 2. Execute Runtime `onEnable` hook (for code logic)\n */\nexport class AppPlugin implements Plugin {\n name: string;\n type = 'app';\n version?: string;\n \n private bundle: any;\n\n constructor(bundle: any) {\n this.bundle = bundle;\n // Support both direct manifest (legacy) and Stack Definition (nested manifest)\n const sys = bundle.manifest || bundle;\n const appId = sys.id || sys.name || 'unnamed-app';\n \n this.name = `plugin.app.${appId}`;\n this.version = sys.version;\n }\n\n init = async (ctx: PluginContext) => {\n const sys = this.bundle.manifest || this.bundle;\n const appId = sys.id || sys.name;\n\n ctx.logger.info('Registering App Service', { \n appId, \n pluginName: this.name,\n version: this.version \n });\n \n // Register the app manifest as a service\n // ObjectQLPlugin will discover this and call ql.registerApp()\n const serviceName = `app.${appId}`;\n\n // Merge manifest with the bundle to ensure objects/apps are accessible at root\n // This supports both Legacy Manifests and new Stack Definitions\n const servicePayload = this.bundle.manifest \n ? { ...this.bundle.manifest, ...this.bundle }\n : this.bundle;\n\n ctx.registerService(serviceName, servicePayload);\n }\n\n start = async (ctx: PluginContext) => {\n const sys = this.bundle.manifest || this.bundle;\n const appId = sys.id || sys.name;\n \n // Execute Runtime Step\n // Retrieve ObjectQL engine from services\n // We cast to any/ObjectQL because ctx.getService returns unknown\n const ql = ctx.getService('objectql') as any;\n \n if (!ql) {\n ctx.logger.warn('ObjectQL engine service not found', { \n appName: this.name,\n appId \n });\n return;\n }\n\n ctx.logger.debug('Retrieved ObjectQL engine service', { appId });\n\n const runtime = this.bundle.default || this.bundle;\n \n if (runtime && typeof runtime.onEnable === 'function') {\n ctx.logger.info('Executing runtime.onEnable', { \n appName: this.name,\n appId \n });\n \n // Construct the Host Context (mirroring old ObjectQL.use logic)\n const hostContext = {\n ...ctx,\n ql,\n logger: ctx.logger,\n drivers: {\n register: (driver: any) => {\n ctx.logger.debug('Registering driver via app runtime', { \n driverName: driver.name,\n appId \n });\n ql.registerDriver(driver);\n }\n },\n };\n \n await runtime.onEnable(hostContext);\n ctx.logger.debug('Runtime.onEnable completed', { appId });\n } else {\n ctx.logger.debug('No runtime.onEnable function found', { appId });\n }\n\n // Data Seeding\n // Check for 'data' in manifest (Legacy or Stack Definition)\n const manifest = this.bundle.manifest || this.bundle;\n if (manifest && Array.isArray(manifest.data)) {\n ctx.logger.info(`[AppPlugin] Found initial data for ${appId}`, { count: manifest.data.length });\n for (const dataset of manifest.data) {\n if (dataset.object && Array.isArray(dataset.records)) {\n ctx.logger.info(`[Seeder] Seeding ${dataset.records.length} records for ${dataset.object}`);\n for (const record of dataset.records) {\n try {\n // Use ObjectQL engine to insert data\n // This ensures driver resolution and hook execution\n // Use 'insert' which corresponds to 'create' in driver\n await ql.insert(dataset.object, record);\n } catch (err: any) {\n // Ignore duplicate errors if needed, or log/warn\n ctx.logger.warn(`[Seeder] Failed to insert ${dataset.object} record:`, { error: err.message });\n }\n }\n }\n }\n ctx.logger.info('[Seeder] Data seeding complete.');\n }\n }\n}\n","import { IHttpServer, RouteHandler, Middleware } from '@objectstack/core';\n\n/**\n * HttpServer - Unified HTTP Server Abstraction\n * \n * Provides a framework-agnostic HTTP server interface that wraps\n * underlying server implementations (Hono, Express, Fastify, etc.)\n * \n * This class serves as an adapter between the IHttpServer interface\n * and concrete server implementations, allowing plugins to register\n * routes and middleware without depending on specific frameworks.\n * \n * Features:\n * - Unified route registration API\n * - Middleware management with ordering\n * - Request/response lifecycle hooks\n * - Framework-agnostic abstractions\n */\nexport class HttpServer implements IHttpServer {\n protected server: IHttpServer;\n protected routes: Map<string, RouteHandler>;\n protected middlewares: Middleware[];\n \n /**\n * Create an HTTP server wrapper\n * @param server - The underlying server implementation (Hono, Express, etc.)\n */\n constructor(server: IHttpServer) {\n this.server = server;\n this.routes = new Map();\n this.middlewares = [];\n }\n \n /**\n * Register a GET route handler\n * @param path - Route path (e.g., '/api/users/:id')\n * @param handler - Route handler function\n */\n get(path: string, handler: RouteHandler): void {\n const key = `GET:${path}`;\n this.routes.set(key, handler);\n this.server.get(path, handler);\n }\n \n /**\n * Register a POST route handler\n * @param path - Route path\n * @param handler - Route handler function\n */\n post(path: string, handler: RouteHandler): void {\n const key = `POST:${path}`;\n this.routes.set(key, handler);\n this.server.post(path, handler);\n }\n \n /**\n * Register a PUT route handler\n * @param path - Route path\n * @param handler - Route handler function\n */\n put(path: string, handler: RouteHandler): void {\n const key = `PUT:${path}`;\n this.routes.set(key, handler);\n this.server.put(path, handler);\n }\n \n /**\n * Register a DELETE route handler\n * @param path - Route path\n * @param handler - Route handler function\n */\n delete(path: string, handler: RouteHandler): void {\n const key = `DELETE:${path}`;\n this.routes.set(key, handler);\n this.server.delete(path, handler);\n }\n \n /**\n * Register a PATCH route handler\n * @param path - Route path\n * @param handler - Route handler function\n */\n patch(path: string, handler: RouteHandler): void {\n const key = `PATCH:${path}`;\n this.routes.set(key, handler);\n this.server.patch(path, handler);\n }\n \n /**\n * Register middleware\n * @param path - Optional path to apply middleware to (if omitted, applies globally)\n * @param handler - Middleware function\n */\n use(path: string | Middleware, handler?: Middleware): void {\n if (typeof path === 'function') {\n // Global middleware\n this.middlewares.push(path);\n this.server.use(path);\n } else if (handler) {\n // Path-specific middleware\n this.middlewares.push(handler);\n this.server.use(path, handler);\n }\n }\n \n /**\n * Start the HTTP server\n * @param port - Port number to listen on\n * @returns Promise that resolves when server is ready\n */\n async listen(port: number): Promise<void> {\n await this.server.listen(port);\n }\n \n /**\n * Stop the HTTP server\n * @returns Promise that resolves when server is stopped\n */\n async close(): Promise<void> {\n if (this.server.close) {\n await this.server.close();\n }\n }\n \n /**\n * Get registered routes\n * @returns Map of route keys to handlers\n */\n getRoutes(): Map<string, RouteHandler> {\n return new Map(this.routes);\n }\n \n /**\n * Get registered middlewares\n * @returns Array of middleware functions\n */\n getMiddlewares(): Middleware[] {\n return [...this.middlewares];\n }\n}\n","import { ObjectKernel, getEnv } from '@objectstack/core';\nimport { CoreServiceName } from '@objectstack/spec/system';\n\nexport interface HttpProtocolContext {\n request: any;\n response?: any;\n}\n\nexport interface HttpDispatcherResult {\n handled: boolean;\n response?: {\n status: number;\n body?: any;\n headers?: Record<string, string>;\n };\n result?: any; // For flexible return types or direct response objects (Response/NextResponse)\n}\n\nexport class HttpDispatcher {\n private kernel: any; // Casting to any to access dynamic props like broker, services, graphql\n\n constructor(kernel: ObjectKernel) {\n this.kernel = kernel;\n }\n\n private success(data: any, meta?: any) {\n return {\n status: 200,\n body: { success: true, data, meta }\n };\n }\n\n private error(message: string, code: number = 500, details?: any) {\n return {\n status: code,\n body: { success: false, error: { message, code, details } }\n };\n }\n\n private ensureBroker() {\n if (!this.kernel.broker) {\n throw { statusCode: 500, message: 'Kernel Broker not available' };\n }\n return this.kernel.broker;\n }\n\n /**\n * Generates the discovery JSON response for the API root\n */\n getDiscoveryInfo(prefix: string) {\n const services = this.getServicesMap();\n \n const hasGraphQL = !!(services[CoreServiceName.enum.graphql] || this.kernel.graphql);\n const hasSearch = !!services[CoreServiceName.enum.search];\n const hasWebSockets = !!services[CoreServiceName.enum.realtime];\n const hasFiles = !!(services[CoreServiceName.enum['file-storage']] || services['storage']?.supportsFiles);\n const hasAnalytics = !!services[CoreServiceName.enum.analytics];\n const hasHub = !!services[CoreServiceName.enum.hub];\n\n return {\n name: 'ObjectOS',\n version: '1.0.0',\n environment: getEnv('NODE_ENV', 'development'),\n routes: {\n data: `${prefix}/data`,\n metadata: `${prefix}/metadata`,\n auth: `${prefix}/auth`,\n graphql: hasGraphQL ? `${prefix}/graphql` : undefined,\n storage: hasFiles ? `${prefix}/storage` : undefined,\n analytics: hasAnalytics ? `${prefix}/analytics` : undefined,\n hub: hasHub ? `${prefix}/hub` : undefined,\n },\n features: {\n graphql: hasGraphQL,\n search: hasSearch,\n websockets: hasWebSockets,\n files: hasFiles,\n analytics: hasAnalytics,\n hub: hasHub,\n },\n locale: {\n default: 'en',\n supported: ['en', 'zh-CN'],\n timezone: 'UTC'\n }\n };\n }\n\n /**\n * Handles GraphQL requests\n */\n async handleGraphQL(body: { query: string; variables?: any }, context: HttpProtocolContext) {\n if (!body || !body.query) {\n throw { statusCode: 400, message: 'Missing query in request body' };\n }\n \n if (typeof this.kernel.graphql !== 'function') {\n throw { statusCode: 501, message: 'GraphQL service not available' };\n }\n\n return this.kernel.graphql(body.query, body.variables, { \n request: context.request \n });\n }\n\n /**\n * Handles Auth requests\n * path: sub-path after /auth/\n */\n async handleAuth(path: string, method: string, body: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n // 1. Try generic Auth Service\n const authService = this.getService(CoreServiceName.enum.auth);\n if (authService && typeof authService.handler === 'function') {\n const response = await authService.handler(context.request, context.response);\n return { handled: true, result: response };\n }\n\n // 2. Legacy Login\n const normalizedPath = path.replace(/^\\/+/, '');\n if (normalizedPath === 'login' && method.toUpperCase() === 'POST') {\n const broker = this.ensureBroker();\n const data = await broker.call('auth.login', body, { request: context.request });\n return { handled: true, response: { status: 200, body: data } };\n }\n\n return { handled: false };\n }\n\n /**\n * Handles Metadata requests\n * Standard: /metadata/:type/:name\n * Fallback for backward compat: /metadata (all objects), /metadata/:objectName (get object)\n */\n async handleMetadata(path: string, context: HttpProtocolContext, method?: string, body?: any): Promise<HttpDispatcherResult> {\n const broker = this.ensureBroker();\n const parts = path.replace(/^\\/+/, '').split('/').filter(Boolean);\n \n // GET /metadata/types\n if (parts[0] === 'types') {\n // This would normally come from a registry service\n // For now we mock the types supported by core\n return { handled: true, response: this.success({ types: ['objects', 'apps', 'plugins'] }) };\n }\n\n // /metadata/:type/:name\n if (parts.length === 2) {\n const [type, name] = parts;\n\n // PUT /metadata/:type/:name (Save)\n if (method === 'PUT' && body) {\n // Try to get the protocol service directly\n const protocol = this.kernel?.context?.getService ? this.kernel.context.getService('protocol') : null;\n \n if (protocol && typeof protocol.saveMetaItem === 'function') {\n try {\n const result = await protocol.saveMetaItem({ type, name, item: body });\n return { handled: true, response: this.success(result) };\n } catch (e: any) {\n return { handled: true, response: this.error(e.message, 400) };\n }\n }\n \n // Fallback to broker if protocol not available (legacy)\n try {\n const data = await broker.call('metadata.saveItem', { type, name, item: body }, { request: context.request });\n return { handled: true, response: this.success(data) };\n } catch (e: any) {\n // If broker doesn't support it either\n return { handled: true, response: this.error(e.message || 'Save not supported', 501) };\n }\n }\n\n try {\n // Try specific calls based on type\n if (type === 'objects') {\n const data = await broker.call('metadata.getObject', { objectName: name }, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n // Generic call for other types if supported\n const data = await broker.call(`metadata.get${this.capitalize(type.slice(0, -1))}`, { name }, { request: context.request });\n return { handled: true, response: this.success(data) };\n } catch (e: any) {\n // Fallback: treat first part as object name if only 1 part (handled below)\n // But here we are deep in 2 parts. Must be an error.\n return { handled: true, response: this.error(e.message, 404) };\n }\n }\n \n // GET /metadata/:type (List items of type) OR /metadata/:objectName (Legacy)\n if (parts.length === 1) {\n const typeOrName = parts[0];\n \n // Heuristic: if it maps to a known type, list it. Else treat as object name.\n if (['objects', 'apps', 'plugins'].includes(typeOrName)) {\n if (typeOrName === 'objects') {\n const data = await broker.call('metadata.objects', {}, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n // Try generic list\n const data = await broker.call(`metadata.${typeOrName}`, {}, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n\n // Legacy: /metadata/:objectName\n const data = await broker.call('metadata.getObject', { objectName: typeOrName }, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n\n // GET /metadata (List Objects - Default)\n if (parts.length === 0) {\n const data = await broker.call('metadata.objects', {}, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n \n return { handled: false };\n }\n\n /**\n * Handles Data requests\n * path: sub-path after /data/ (e.g. \"contacts\", \"contacts/123\", \"contacts/query\")\n */\n async handleData(path: string, method: string, body: any, query: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const broker = this.ensureBroker();\n const parts = path.replace(/^\\/+/, '').split('/');\n const objectName = parts[0];\n \n if (!objectName) {\n return { handled: true, response: this.error('Object name required', 400) };\n }\n\n const m = method.toUpperCase();\n\n // 1. Custom Actions (query, batch)\n if (parts.length > 1) {\n const action = parts[1];\n \n // POST /data/:object/query\n if (action === 'query' && m === 'POST') {\n const result = await broker.call('data.query', { object: objectName, ...body }, { request: context.request });\n return { handled: true, response: this.success(result.data, { count: result.count, limit: body.limit, skip: body.skip }) };\n }\n\n // POST /data/:object/batch\n if (action === 'batch' && m === 'POST') {\n // Spec complaint: forward the whole body { operation, records, options }\n // Implementation in Kernel should handle the 'operation' field\n const result = await broker.call('data.batch', { object: objectName, ...body }, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n\n // GET /data/:object/:id\n if (parts.length === 2 && m === 'GET') {\n const id = parts[1];\n const data = await broker.call('data.get', { object: objectName, id, ...query }, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n\n // PATCH /data/:object/:id\n if (parts.length === 2 && m === 'PATCH') {\n const id = parts[1];\n const data = await broker.call('data.update', { object: objectName, id, data: body }, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n\n // DELETE /data/:object/:id\n if (parts.length === 2 && m === 'DELETE') {\n const id = parts[1];\n await broker.call('data.delete', { object: objectName, id }, { request: context.request });\n return { handled: true, response: this.success({ id, deleted: true }) };\n }\n } else {\n // GET /data/:object (List)\n if (m === 'GET') {\n const result = await broker.call('data.query', { object: objectName, filters: query }, { request: context.request });\n return { handled: true, response: this.success(result.data, { count: result.count }) };\n }\n\n // POST /data/:object (Create)\n if (m === 'POST') {\n const data = await broker.call('data.create', { object: objectName, data: body }, { request: context.request });\n // Note: ideally 201\n const res = this.success(data);\n res.status = 201;\n return { handled: true, response: res };\n }\n }\n \n return { handled: false };\n }\n\n /**\n * Handles Analytics requests\n * path: sub-path after /analytics/\n */\n async handleAnalytics(path: string, method: string, body: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const analyticsService = this.getService(CoreServiceName.enum.analytics);\n if (!analyticsService) return { handled: false }; // 404 handled by caller if unhandled\n\n const m = method.toUpperCase();\n const subPath = path.replace(/^\\/+/, '');\n\n // POST /analytics/query\n if (subPath === 'query' && m === 'POST') {\n const result = await analyticsService.query(body, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n\n // GET /analytics/meta\n if (subPath === 'meta' && m === 'GET') {\n const result = await analyticsService.getMetadata({ request: context.request });\n return { handled: true, response: this.success(result) };\n }\n\n // POST /analytics/sql (Dry-run or debug)\n if (subPath === 'sql' && m === 'POST') {\n // Assuming service has generateSql method\n const result = await analyticsService.generateSql(body, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n\n return { handled: false };\n }\n\n /**\n * Handles Hub requests\n * path: sub-path after /hub/\n */\n async handleHub(path: string, method: string, body: any, query: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const hubService = this.getService(CoreServiceName.enum.hub);\n if (!hubService) return { handled: false };\n\n const m = method.toUpperCase();\n const parts = path.replace(/^\\/+/, '').split('/');\n \n // Resource-based routing: /hub/:resource/:id\n if (parts.length > 0) {\n const resource = parts[0]; // spaces, plugins, etc.\n \n // Allow mapping \"spaces\" -> \"createSpace\", \"listSpaces\" etc.\n // Convention: \n // GET /spaces -> listSpaces\n // POST /spaces -> createSpace\n // GET /spaces/:id -> getSpace\n // PATCH /spaces/:id -> updateSpace\n // DELETE /spaces/:id -> deleteSpace\n \n const actionBase = resource.endsWith('s') ? resource.slice(0, -1) : resource; // space\n const id = parts[1];\n\n try {\n if (parts.length === 1) {\n // Collection Operations\n if (m === 'GET') {\n const capitalizedAction = 'list' + this.capitalize(resource); // listSpaces\n if (typeof hubService[capitalizedAction] === 'function') {\n const result = await hubService[capitalizedAction](query, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n if (m === 'POST') {\n const capitalizedAction = 'create' + this.capitalize(actionBase); // createSpace\n if (typeof hubService[capitalizedAction] === 'function') {\n const result = await hubService[capitalizedAction](body, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n } else if (parts.length === 2) {\n // Item Operations\n if (m === 'GET') {\n const capitalizedAction = 'get' + this.capitalize(actionBase); // getSpace\n if (typeof hubService[capitalizedAction] === 'function') {\n const result = await hubService[capitalizedAction](id, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n if (m === 'PATCH' || m === 'PUT') {\n const capitalizedAction = 'update' + this.capitalize(actionBase); // updateSpace\n if (typeof hubService[capitalizedAction] === 'function') {\n const result = await hubService[capitalizedAction](id, body, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n if (m === 'DELETE') {\n const capitalizedAction = 'delete' + this.capitalize(actionBase); // deleteSpace\n if (typeof hubService[capitalizedAction] === 'function') {\n const result = await hubService[capitalizedAction](id, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n }\n } catch(e: any) {\n return { handled: true, response: this.error(e.message, 500) };\n }\n }\n \n return { handled: false };\n }\n\n /**\n * Handles Storage requests\n * path: sub-path after /storage/\n */\n async handleStorage(path: string, method: string, file: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const storageService = this.getService(CoreServiceName.enum['file-storage']) || this.kernel.services?.['file-storage'];\n if (!storageService) {\n return { handled: true, response: this.error('File storage not configured', 501) };\n }\n \n const m = method.toUpperCase();\n const parts = path.replace(/^\\/+/, '').split('/');\n \n // POST /storage/upload\n if (parts[0] === 'upload' && m === 'POST') {\n if (!file) {\n return { handled: true, response: this.error('No file provided', 400) };\n }\n const result = await storageService.upload(file, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n \n // GET /storage/file/:id\n if (parts[0] === 'file' && parts[1] && m === 'GET') {\n const id = parts[1];\n const result = await storageService.download(id, { request: context.request });\n \n // Result can be URL (redirect), Stream/Blob, or metadata\n if (result.url && result.redirect) {\n // Must be handled by adapter to do actual redirect\n return { handled: true, result: { type: 'redirect', url: result.url } };\n }\n \n if (result.stream) {\n // Must be handled by adapter to pipe stream\n return { \n handled: true, \n result: { \n type: 'stream', \n stream: result.stream, \n headers: {\n 'Content-Type': result.mimeType || 'application/octet-stream',\n 'Content-Length': result.size\n }\n } \n };\n }\n \n return { handled: true, response: this.success(result) };\n }\n \n return { handled: false };\n }\n\n /**\n * Handles Automation requests\n * path: sub-path after /automation/\n */\n async handleAutomation(path: string, method: string, body: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const automationService = this.getService(CoreServiceName.enum.automation);\n if (!automationService) return { handled: false };\n\n const m = method.toUpperCase();\n const parts = path.replace(/^\\/+/, '').split('/');\n \n // POST /automation/trigger/:name\n if (parts[0] === 'trigger' && parts[1] && m === 'POST') {\n const triggerName = parts[1];\n if (typeof automationService.trigger === 'function') {\n const result = await automationService.trigger(triggerName, body, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n \n return { handled: false };\n }\n\n private getServicesMap(): Record<string, any> {\n if (this.kernel.services instanceof Map) {\n return Object.fromEntries(this.kernel.services);\n }\n return this.kernel.services || {};\n }\n\n private getService(name: CoreServiceName) {\n if (typeof this.kernel.getService === 'function') {\n return this.kernel.getService(name);\n }\n const services = this.getServicesMap();\n return services[name];\n }\n\n private capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1);\n }\n\n /**\n * Main Dispatcher Entry Point\n * Routes the request to the appropriate handler based on path and precedence\n */\n async dispatch(method: string, path: string, body: any, query: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const cleanPath = path.replace(/\\/$/, ''); // Remove trailing slash if present, but strict on clean paths\n\n // 1. System Protocols (Prefix-based)\n if (cleanPath.startsWith('/auth')) {\n return this.handleAuth(cleanPath.substring(5), method, body, context);\n }\n \n if (cleanPath.startsWith('/metadata')) {\n return this.handleMetadata(cleanPath.substring(9), context);\n }\n\n if (cleanPath.startsWith('/data')) {\n return this.handleData(cleanPath.substring(5), method, body, query, context);\n }\n \n if (cleanPath.startsWith('/graphql')) {\n if (method === 'POST') return this.handleGraphQL(body, context);\n // GraphQL usually GET for Playground is handled by middleware but we can return 405 or handle it\n }\n\n if (cleanPath.startsWith('/storage')) {\n return this.handleStorage(cleanPath.substring(8), method, body, context); // body here is file/stream for upload\n }\n \n if (cleanPath.startsWith('/automation')) {\n return this.handleAutomation(cleanPath.substring(11), method, body, context);\n }\n \n if (cleanPath.startsWith('/analytics')) {\n return this.handleAnalytics(cleanPath.substring(10), method, body, context);\n }\n\n if (cleanPath.startsWith('/hub')) {\n return this.handleHub(cleanPath.substring(4), method, body, query, context);\n }\n\n // OpenAPI Specification\n if (cleanPath === '/openapi.json' && method === 'GET') {\n const broker = this.ensureBroker();\n try {\n const result = await broker.call('metadata.generateOpenApi', {}, { request: context.request });\n return { handled: true, response: this.success(result) };\n } catch (e) {\n // If not implemented, fall through or return 404\n }\n }\n\n // 2. Custom API Endpoints (Registry lookup)\n // Check if there is a custom endpoint defined for this path\n const result = await this.handleApiEndpoint(cleanPath, method, body, query, context);\n if (result.handled) return result;\n\n // 3. Fallback (404)\n return { handled: false };\n }\n\n /**\n * Handles Custom API Endpoints defined in metadata\n */\n async handleApiEndpoint(path: string, method: string, body: any, query: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const broker = this.ensureBroker();\n try {\n // Attempt to find a matching endpoint in the registry\n // This assumes a 'metadata.matchEndpoint' action exists in the kernel/registry\n // path should include initial slash e.g. /api/v1/customers\n const endpoint = await broker.call('metadata.matchEndpoint', { path, method });\n \n if (endpoint) {\n // Execute the endpoint target logic\n if (endpoint.type === 'flow') {\n const result = await broker.call('automation.runFlow', { \n flowId: endpoint.target, \n inputs: { ...query, ...body, _request: context.request } \n });\n return { handled: true, response: this.success(result) };\n }\n \n if (endpoint.type === 'script') {\n const result = await broker.call('automation.runScript', { \n scriptName: endpoint.target, \n context: { ...query, ...body, request: context.request } \n }, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n\n if (endpoint.type === 'object_operation') {\n // e.g. Proxy to an object action\n if (endpoint.objectParams) {\n const { object, operation } = endpoint.objectParams;\n // Map standard CRUD operations\n if (operation === 'find') {\n const result = await broker.call('data.query', { object, filters: query }, { request: context.request });\n return { handled: true, response: this.success(result.data, { count: result.count }) };\n }\n if (operation === 'get' && query.id) {\n const result = await broker.call('data.get', { object, id: query.id }, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n if (operation === 'create') {\n const result = await broker.call('data.create', { object, data: body }, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n }\n\n if (endpoint.type === 'proxy') {\n // Simple proxy implementation (requires a network call, which usually is done by a service but here we can stub return)\n // In real implementation this might fetch(endpoint.target)\n // For now, return target info\n return { \n handled: true, \n response: { \n status: 200, \n body: { proxy: true, target: endpoint.target, note: 'Proxy execution requires http-client service' } \n } \n };\n }\n }\n } catch (e) {\n // If matchEndpoint fails (e.g. not found), we just return not handled\n // so we can fallback to 404 or other handlers\n }\n\n return { handled: false };\n }\n}\n","import { Middleware, IHttpRequest, IHttpResponse } from '@objectstack/core';\nimport { MiddlewareConfig, MiddlewareType } from '@objectstack/spec/system';\n\n/**\n * Middleware Entry\n * Internal representation of registered middleware\n */\ninterface MiddlewareEntry {\n name: string;\n type: MiddlewareType;\n middleware: Middleware;\n order: number;\n enabled: boolean;\n paths?: {\n include?: string[];\n exclude?: string[];\n };\n}\n\n/**\n * MiddlewareManager\n * \n * Manages middleware registration, ordering, and execution.\n * Provides fine-grained control over middleware chains with:\n * - Execution order management\n * - Path-based filtering\n * - Enable/disable individual middleware\n * - Middleware categorization by type\n * \n * @example\n * const manager = new MiddlewareManager();\n * \n * // Register middleware with configuration\n * manager.register({\n * name: 'auth',\n * type: 'authentication',\n * order: 10,\n * paths: { exclude: ['/health', '/metrics'] }\n * }, authMiddleware);\n * \n * // Get sorted middleware chain\n * const chain = manager.getMiddlewareChain();\n * chain.forEach(mw => server.use(mw));\n */\nexport class MiddlewareManager {\n private middlewares: Map<string, MiddlewareEntry>;\n \n constructor() {\n this.middlewares = new Map();\n }\n \n /**\n * Register middleware with configuration\n * @param config - Middleware configuration\n * @param middleware - Middleware function\n */\n register(config: MiddlewareConfig, middleware: Middleware): void {\n const entry: MiddlewareEntry = {\n name: config.name,\n type: config.type,\n middleware,\n order: config.order ?? 100,\n enabled: config.enabled ?? true,\n paths: config.paths,\n };\n \n this.middlewares.set(config.name, entry);\n }\n \n /**\n * Unregister middleware by name\n * @param name - Middleware name\n */\n unregister(name: string): void {\n this.middlewares.delete(name);\n }\n \n /**\n * Enable middleware by name\n * @param name - Middleware name\n */\n enable(name: string): void {\n const entry = this.middlewares.get(name);\n if (entry) {\n entry.enabled = true;\n }\n }\n \n /**\n * Disable middleware by name\n * @param name - Middleware name\n */\n disable(name: string): void {\n const entry = this.middlewares.get(name);\n if (entry) {\n entry.enabled = false;\n }\n }\n \n /**\n * Get middleware entry by name\n * @param name - Middleware name\n */\n get(name: string): MiddlewareEntry | undefined {\n return this.middlewares.get(name);\n }\n \n /**\n * Get all middleware entries\n */\n getAll(): MiddlewareEntry[] {\n return Array.from(this.middlewares.values());\n }\n \n /**\n * Get middleware by type\n * @param type - Middleware type\n */\n getByType(type: MiddlewareType): MiddlewareEntry[] {\n return this.getAll().filter(entry => entry.type === type);\n }\n \n /**\n * Get middleware chain sorted by order\n * Returns only enabled middleware\n */\n getMiddlewareChain(): Middleware[] {\n return this.getAll()\n .filter(entry => entry.enabled)\n .sort((a, b) => a.order - b.order)\n .map(entry => entry.middleware);\n }\n \n /**\n * Get middleware chain with path filtering\n * @param path - Request path to match against\n */\n getMiddlewareChainForPath(path: string): Middleware[] {\n return this.getAll()\n .filter(entry => {\n if (!entry.enabled) return false;\n \n // Check path filters\n if (entry.paths) {\n // Check exclude patterns\n if (entry.paths.exclude) {\n const excluded = entry.paths.exclude.some(pattern => \n this.matchPath(path, pattern)\n );\n if (excluded) return false;\n }\n \n // Check include patterns (if specified)\n if (entry.paths.include) {\n const included = entry.paths.include.some(pattern => \n this.matchPath(path, pattern)\n );\n if (!included) return false;\n }\n }\n \n return true;\n })\n .sort((a, b) => a.order - b.order)\n .map(entry => entry.middleware);\n }\n \n /**\n * Match path against pattern (simple glob matching)\n * @param path - Request path\n * @param pattern - Pattern to match (supports * wildcard)\n */\n private matchPath(path: string, pattern: string): boolean {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n \n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(path);\n }\n \n /**\n * Clear all middleware\n */\n clear(): void {\n this.middlewares.clear();\n }\n \n /**\n * Get middleware count\n */\n count(): number {\n return this.middlewares.size;\n }\n \n /**\n * Create a composite middleware from the chain\n * This can be used to apply all middleware at once\n */\n createCompositeMiddleware(): Middleware {\n const chain = this.getMiddlewareChain();\n \n return async (req: IHttpRequest, res: IHttpResponse, next: () => void | Promise<void>) => {\n let index = 0;\n \n const executeNext = async (): Promise<void> => {\n if (index >= chain.length) {\n await next();\n return;\n }\n \n const middleware = chain[index++];\n await middleware(req, res, executeNext);\n };\n \n await executeNext();\n };\n }\n}\n"],"mappings":"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","names":["import_core","import_core","data","result"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/runtime.ts","../src/route-manager.ts","../src/rest-server.ts","../src/api-registry-plugin.ts","../src/driver-plugin.ts","../src/app-plugin.ts","../src/http-server.ts","../src/http-dispatcher.ts","../src/middleware.ts"],"sourcesContent":["// Export Kernels\nexport { ObjectKernel } from '@objectstack/core';\n\n// Export Runtime\nexport { Runtime } from './runtime.js';\nexport type { RuntimeConfig } from './runtime.js';\n\n// Export Plugins\nexport { DriverPlugin } from './driver-plugin.js';\nexport { AppPlugin } from './app-plugin.js';\nexport { createApiRegistryPlugin } from './api-registry-plugin.js';\nexport type { ApiRegistryConfig } from './api-registry-plugin.js';\n\n// Export HTTP Server Components\nexport { HttpServer } from './http-server.js';\nexport { HttpDispatcher } from './http-dispatcher.js';\nexport type { HttpProtocolContext, HttpDispatcherResult } from './http-dispatcher.js';\nexport { RestServer } from './rest-server.js';\nexport { RouteManager, RouteGroupBuilder } from './route-manager.js';\nexport type { RouteEntry } from './route-manager.js';\nexport { MiddlewareManager } from './middleware.js';\n\n// Export Types\nexport * from '@objectstack/core';\n\n\n\n","import { ObjectKernel, Plugin, IHttpServer, ObjectKernelConfig } from '@objectstack/core';\nimport { createApiRegistryPlugin, ApiRegistryConfig } from './api-registry-plugin.js';\n\nexport interface RuntimeConfig {\n /**\n * Optional existing server instance (e.g. Hono, Express app)\n * If provided, Runtime will use it as the 'http.server' service.\n * If not provided, Runtime expects a server plugin (like HonoServerPlugin) to be registered manually.\n */\n server?: IHttpServer;\n \n /**\n * API Registry Configuration\n */\n api?: ApiRegistryConfig;\n\n /**\n * Kernel Configuration\n */\n kernel?: ObjectKernelConfig;\n}\n\n/**\n * ObjectStack Runtime\n * \n * High-level entry point for bootstrapping an ObjectStack application.\n * Wraps ObjectKernel and provides standard orchestration for:\n * - HTTP Server binding\n * - API Registry (REST Routes)\n * - Plugin Management\n */\nexport class Runtime {\n readonly kernel: ObjectKernel;\n \n constructor(config: RuntimeConfig = {}) {\n this.kernel = new ObjectKernel(config.kernel);\n \n // If external server provided, register it immediately\n if (config.server) {\n // If the provided server is not already an HttpServer wrapper, wrap it?\n // Since IHttpServer is the interface, we assume it complies.\n // But HttpServer class in runtime is an adapter.\n // If user passes raw Hono, it won't work unless they wrapped it.\n // We'll assume they pass a compliant IHttpServer.\n this.kernel.registerService('http.server', config.server);\n }\n \n // Register API Registry by default\n // This plugin is passive (wait for services) so it's safe to add early.\n this.kernel.use(createApiRegistryPlugin(config.api));\n }\n \n /**\n * Register a plugin\n */\n use(plugin: Plugin) {\n this.kernel.use(plugin);\n return this;\n }\n \n /**\n * Start the runtime\n * 1. Initializes all plugins (init phase)\n * 2. Starts all plugins (start phase)\n */\n async start() {\n await this.kernel.bootstrap();\n return this;\n }\n \n /**\n * Get the kernel instance\n */\n getKernel() {\n return this.kernel;\n }\n}\n","import { RouteHandler, IHttpServer } from '@objectstack/core';\nimport { System, Shared } from '@objectstack/spec';\nimport { z } from 'zod';\n\ntype RouteHandlerMetadata = System.RouteHandlerMetadata;\ntype HttpMethod = z.infer<typeof Shared.HttpMethod>;\n\n/**\n * Route Entry\n * Internal representation of registered routes\n */\nexport interface RouteEntry {\n method: HttpMethod;\n path: string;\n handler: RouteHandler;\n metadata?: RouteHandlerMetadata['metadata'];\n security?: RouteHandlerMetadata['security'];\n}\n\n/**\n * RouteManager\n * \n * Manages route registration and organization for HTTP servers.\n * Provides:\n * - Route registration with metadata\n * - Route lookup and querying\n * - Bulk route registration\n * - Route grouping by prefix\n * \n * @example\n * const manager = new RouteManager(server);\n * \n * // Register individual route\n * manager.register({\n * method: 'GET',\n * path: '/api/users/:id',\n * handler: getUserHandler,\n * metadata: {\n * summary: 'Get user by ID',\n * tags: ['users']\n * }\n * });\n * \n * // Register route group\n * manager.group('/api/users', (group) => {\n * group.get('/', listUsersHandler);\n * group.post('/', createUserHandler);\n * group.get('/:id', getUserHandler);\n * });\n */\nexport class RouteManager {\n private server: IHttpServer;\n private routes: Map<string, RouteEntry>;\n \n constructor(server: IHttpServer) {\n this.server = server;\n this.routes = new Map();\n }\n \n /**\n * Register a route\n * @param entry - Route entry with method, path, handler, and metadata\n */\n register(entry: Omit<RouteEntry, 'handler'> & { handler: RouteHandler | string }): void {\n // Validate handler type - string handlers not yet supported\n if (typeof entry.handler === 'string') {\n throw new Error(\n `String-based route handlers are not supported yet. ` +\n `Received handler identifier \"${entry.handler}\". ` +\n `Please provide a RouteHandler function instead.`\n );\n }\n \n const handler: RouteHandler = entry.handler;\n \n const routeEntry: RouteEntry = {\n method: entry.method,\n path: entry.path,\n handler,\n metadata: entry.metadata,\n security: entry.security,\n };\n \n const key = this.getRouteKey(entry.method, entry.path);\n this.routes.set(key, routeEntry);\n \n // Register with underlying server\n this.registerWithServer(routeEntry);\n }\n \n /**\n * Register multiple routes\n * @param entries - Array of route entries\n */\n registerMany(entries: Array<Omit<RouteEntry, 'handler'> & { handler: RouteHandler | string }>): void {\n entries.forEach(entry => this.register(entry));\n }\n \n /**\n * Unregister a route\n * @param method - HTTP method\n * @param path - Route path\n */\n unregister(method: HttpMethod, path: string): void {\n const key = this.getRouteKey(method, path);\n this.routes.delete(key);\n // Note: Most server frameworks don't support unregistering routes at runtime\n // This just removes it from our registry\n }\n \n /**\n * Get route by method and path\n * @param method - HTTP method\n * @param path - Route path\n */\n get(method: HttpMethod, path: string): RouteEntry | undefined {\n const key = this.getRouteKey(method, path);\n return this.routes.get(key);\n }\n \n /**\n * Get all routes\n */\n getAll(): RouteEntry[] {\n return Array.from(this.routes.values());\n }\n \n /**\n * Get routes by method\n * @param method - HTTP method\n */\n getByMethod(method: HttpMethod): RouteEntry[] {\n return this.getAll().filter(route => route.method === method);\n }\n \n /**\n * Get routes by path prefix\n * @param prefix - Path prefix\n */\n getByPrefix(prefix: string): RouteEntry[] {\n return this.getAll().filter(route => route.path.startsWith(prefix));\n }\n \n /**\n * Get routes by tag\n * @param tag - Tag name\n */\n getByTag(tag: string): RouteEntry[] {\n return this.getAll().filter(route => \n route.metadata?.tags?.includes(tag)\n );\n }\n \n /**\n * Create a route group with common prefix\n * @param prefix - Common path prefix\n * @param configure - Function to configure routes in the group\n */\n group(prefix: string, configure: (group: RouteGroupBuilder) => void): void {\n const builder = new RouteGroupBuilder(this, prefix);\n configure(builder);\n }\n \n /**\n * Get route count\n */\n count(): number {\n return this.routes.size;\n }\n \n /**\n * Clear all routes\n */\n clear(): void {\n this.routes.clear();\n }\n \n /**\n * Get route key for storage\n */\n private getRouteKey(method: HttpMethod, path: string): string {\n return `${method}:${path}`;\n }\n \n /**\n * Register route with underlying server\n */\n private registerWithServer(entry: RouteEntry): void {\n const { method, path, handler } = entry;\n \n switch (method) {\n case 'GET':\n this.server.get(path, handler);\n break;\n case 'POST':\n this.server.post(path, handler);\n break;\n case 'PUT':\n this.server.put(path, handler);\n break;\n case 'DELETE':\n this.server.delete(path, handler);\n break;\n case 'PATCH':\n this.server.patch(path, handler);\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n }\n}\n\n/**\n * RouteGroupBuilder\n * \n * Builder for creating route groups with common prefix\n */\nexport class RouteGroupBuilder {\n private manager: RouteManager;\n private prefix: string;\n \n constructor(manager: RouteManager, prefix: string) {\n this.manager = manager;\n this.prefix = prefix;\n }\n \n /**\n * Register GET route in group\n */\n get(path: string, handler: RouteHandler, metadata?: RouteHandlerMetadata['metadata']): this {\n this.manager.register({\n method: 'GET',\n path: this.resolvePath(path),\n handler,\n metadata,\n });\n return this;\n }\n \n /**\n * Register POST route in group\n */\n post(path: string, handler: RouteHandler, metadata?: RouteHandlerMetadata['metadata']): this {\n this.manager.register({\n method: 'POST',\n path: this.resolvePath(path),\n handler,\n metadata,\n });\n return this;\n }\n \n /**\n * Register PUT route in group\n */\n put(path: string, handler: RouteHandler, metadata?: RouteHandlerMetadata['metadata']): this {\n this.manager.register({\n method: 'PUT',\n path: this.resolvePath(path),\n handler,\n metadata,\n });\n return this;\n }\n \n /**\n * Register PATCH route in group\n */\n patch(path: string, handler: RouteHandler, metadata?: RouteHandlerMetadata['metadata']): this {\n this.manager.register({\n method: 'PATCH',\n path: this.resolvePath(path),\n handler,\n metadata,\n });\n return this;\n }\n \n /**\n * Register DELETE route in group\n */\n delete(path: string, handler: RouteHandler, metadata?: RouteHandlerMetadata['metadata']): this {\n this.manager.register({\n method: 'DELETE',\n path: this.resolvePath(path),\n handler,\n metadata,\n });\n return this;\n }\n \n /**\n * Resolve full path with prefix\n */\n private resolvePath(path: string): string {\n // Normalize slashes\n const normalizedPrefix = this.prefix.endsWith('/') \n ? this.prefix.slice(0, -1) \n : this.prefix;\n const normalizedPath = path.startsWith('/') \n ? path \n : '/' + path;\n \n return normalizedPrefix + normalizedPath;\n }\n}\n","import { IHttpServer } from '@objectstack/core';\nimport { RouteManager } from './route-manager.js';\nimport { RestServerConfig, RestApiConfig, CrudEndpointsConfig, MetadataEndpointsConfig, BatchEndpointsConfig, RouteGenerationConfig } from '@objectstack/spec/api';\nimport { ObjectStackProtocol } from '@objectstack/spec/api';\n\n/**\n * Normalized REST Server Configuration\n * All nested properties are required after normalization\n */\ntype NormalizedRestServerConfig = {\n api: {\n version: string;\n basePath: string;\n apiPath: string | undefined;\n enableCrud: boolean;\n enableMetadata: boolean;\n enableBatch: boolean;\n enableDiscovery: boolean;\n documentation: RestApiConfig['documentation'];\n responseFormat: RestApiConfig['responseFormat'];\n };\n crud: {\n operations: {\n create: boolean;\n read: boolean;\n update: boolean;\n delete: boolean;\n list: boolean;\n };\n patterns: CrudEndpointsConfig['patterns'];\n dataPrefix: string;\n objectParamStyle: 'path' | 'query';\n };\n metadata: {\n prefix: string;\n enableCache: boolean;\n cacheTtl: number;\n endpoints: {\n types: boolean;\n items: boolean;\n item: boolean;\n schema: boolean;\n };\n };\n batch: {\n maxBatchSize: number;\n enableBatchEndpoint: boolean;\n operations: {\n createMany: boolean;\n updateMany: boolean;\n deleteMany: boolean;\n upsertMany: boolean;\n };\n defaultAtomic: boolean;\n };\n routes: {\n includeObjects: string[] | undefined;\n excludeObjects: string[] | undefined;\n nameTransform: 'none' | 'plural' | 'kebab-case' | 'camelCase';\n overrides: RouteGenerationConfig['overrides'];\n };\n};\n\n/**\n * RestServer\n * \n * Provides automatic REST API endpoint generation for ObjectStack.\n * Generates standard RESTful CRUD endpoints, metadata endpoints, and batch operations\n * based on the configured protocol provider.\n * \n * Features:\n * - Automatic CRUD endpoint generation (GET, POST, PUT, PATCH, DELETE)\n * - Metadata API endpoints (/meta)\n * - Batch operation endpoints (/batch, /createMany, /updateMany, /deleteMany)\n * - Discovery endpoint\n * - Configurable path prefixes and patterns\n * \n * @example\n * const restServer = new RestServer(httpServer, protocolProvider, {\n * api: {\n * version: 'v1',\n * basePath: '/api'\n * },\n * crud: {\n * dataPrefix: '/data'\n * }\n * });\n * \n * restServer.registerRoutes();\n */\nexport class RestServer {\n private protocol: ObjectStackProtocol;\n private config: NormalizedRestServerConfig;\n private routeManager: RouteManager;\n \n constructor(\n server: IHttpServer, \n protocol: ObjectStackProtocol, \n config: RestServerConfig = {}\n ) {\n this.protocol = protocol;\n this.config = this.normalizeConfig(config);\n this.routeManager = new RouteManager(server);\n }\n \n /**\n * Normalize configuration with defaults\n */\n private normalizeConfig(config: RestServerConfig): NormalizedRestServerConfig {\n const api = (config.api ?? {}) as Partial<RestApiConfig>;\n const crud = (config.crud ?? {}) as Partial<CrudEndpointsConfig>;\n const metadata = (config.metadata ?? {}) as Partial<MetadataEndpointsConfig>;\n const batch = (config.batch ?? {}) as Partial<BatchEndpointsConfig>;\n const routes = (config.routes ?? {}) as Partial<RouteGenerationConfig>;\n \n return {\n api: {\n version: api.version ?? 'v1',\n basePath: api.basePath ?? '/api',\n apiPath: api.apiPath,\n enableCrud: api.enableCrud ?? true,\n enableMetadata: api.enableMetadata ?? true,\n enableBatch: api.enableBatch ?? true,\n enableDiscovery: api.enableDiscovery ?? true,\n documentation: api.documentation,\n responseFormat: api.responseFormat,\n },\n crud: {\n operations: crud.operations ?? {\n create: true,\n read: true,\n update: true,\n delete: true,\n list: true,\n },\n patterns: crud.patterns,\n dataPrefix: crud.dataPrefix ?? '/data',\n objectParamStyle: crud.objectParamStyle ?? 'path',\n },\n metadata: {\n prefix: metadata.prefix ?? '/meta',\n enableCache: metadata.enableCache ?? true,\n cacheTtl: metadata.cacheTtl ?? 3600,\n endpoints: metadata.endpoints ?? {\n types: true,\n items: true,\n item: true,\n schema: true,\n },\n },\n batch: {\n maxBatchSize: batch.maxBatchSize ?? 200,\n enableBatchEndpoint: batch.enableBatchEndpoint ?? true,\n operations: batch.operations ?? {\n createMany: true,\n updateMany: true,\n deleteMany: true,\n upsertMany: true,\n },\n defaultAtomic: batch.defaultAtomic ?? true,\n },\n routes: {\n includeObjects: routes.includeObjects,\n excludeObjects: routes.excludeObjects,\n nameTransform: routes.nameTransform ?? 'none',\n overrides: routes.overrides,\n },\n };\n }\n \n /**\n * Get the full API base path\n */\n private getApiBasePath(): string {\n const { api } = this.config;\n return api.apiPath ?? `${api.basePath}/${api.version}`;\n }\n \n /**\n * Register all REST API routes\n */\n registerRoutes(): void {\n const basePath = this.getApiBasePath();\n \n // Discovery endpoint\n if (this.config.api.enableDiscovery) {\n this.registerDiscoveryEndpoints(basePath);\n }\n \n // Metadata endpoints\n if (this.config.api.enableMetadata) {\n this.registerMetadataEndpoints(basePath);\n }\n \n // CRUD endpoints\n if (this.config.api.enableCrud) {\n this.registerCrudEndpoints(basePath);\n }\n \n // Batch endpoints\n if (this.config.api.enableBatch) {\n this.registerBatchEndpoints(basePath);\n }\n }\n \n /**\n * Register discovery endpoints\n */\n private registerDiscoveryEndpoints(basePath: string): void {\n this.routeManager.register({\n method: 'GET',\n path: basePath,\n handler: async (_req: any, res: any) => {\n try {\n const discovery = await this.protocol.getDiscovery({});\n \n // Override discovery information with actual server configuration\n discovery.version = this.config.api.version;\n \n if (discovery.endpoints) {\n // Ensure endpoints match the actual mounted paths\n if (this.config.api.enableCrud) {\n discovery.endpoints.data = `${basePath}${this.config.crud.dataPrefix}`;\n }\n \n if (this.config.api.enableMetadata) {\n discovery.endpoints.metadata = `${basePath}${this.config.metadata.prefix}`;\n }\n\n // Align auth endpoint with the versioned base path if present\n if (discovery.endpoints.auth) {\n discovery.endpoints.auth = `${basePath}/auth`;\n }\n }\n\n res.json(discovery);\n } catch (error: any) {\n res.status(500).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Get API discovery information',\n tags: ['discovery'],\n },\n });\n }\n \n /**\n * Register metadata endpoints\n */\n private registerMetadataEndpoints(basePath: string): void {\n const { metadata } = this.config;\n const metaPath = `${basePath}${metadata.prefix}`;\n \n // GET /meta - List all metadata types\n if (metadata.endpoints.types !== false) {\n this.routeManager.register({\n method: 'GET',\n path: metaPath,\n handler: async (_req: any, res: any) => {\n try {\n const types = await this.protocol.getMetaTypes({});\n res.json(types);\n } catch (error: any) {\n res.status(500).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'List all metadata types',\n tags: ['metadata'],\n },\n });\n }\n \n // GET /meta/:type - List items of a type\n if (metadata.endpoints.items !== false) {\n this.routeManager.register({\n method: 'GET',\n path: `${metaPath}/:type`,\n handler: async (req: any, res: any) => {\n try {\n const items = await this.protocol.getMetaItems({ type: req.params.type });\n res.json(items);\n } catch (error: any) {\n res.status(404).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'List metadata items of a type',\n tags: ['metadata'],\n },\n });\n }\n \n // GET /meta/:type/:name - Get specific item\n if (metadata.endpoints.item !== false) {\n this.routeManager.register({\n method: 'GET',\n path: `${metaPath}/:type/:name`,\n handler: async (req: any, res: any) => {\n try {\n // Check if cached version is available\n if (metadata.enableCache && this.protocol.getMetaItemCached) {\n const cacheRequest = {\n ifNoneMatch: req.headers['if-none-match'] as string,\n ifModifiedSince: req.headers['if-modified-since'] as string,\n };\n \n const result = await this.protocol.getMetaItemCached({\n type: req.params.type,\n name: req.params.name,\n cacheRequest\n });\n \n if (result.notModified) {\n res.status(304).send();\n return;\n }\n \n // Set cache headers\n if (result.etag) {\n const etagValue = result.etag.weak \n ? `W/\"${result.etag.value}\"` \n : `\"${result.etag.value}\"`;\n res.header('ETag', etagValue);\n }\n if (result.lastModified) {\n res.header('Last-Modified', new Date(result.lastModified).toUTCString());\n }\n if (result.cacheControl) {\n const directives = result.cacheControl.directives.join(', ');\n const maxAge = result.cacheControl.maxAge \n ? `, max-age=${result.cacheControl.maxAge}` \n : '';\n res.header('Cache-Control', directives + maxAge);\n }\n \n res.json(result.data);\n } else {\n // Non-cached version\n const item = await this.protocol.getMetaItem({ type: req.params.type, name: req.params.name });\n res.json(item);\n }\n } catch (error: any) {\n res.status(404).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Get specific metadata item',\n tags: ['metadata'],\n },\n });\n }\n\n // PUT /meta/:type/:name - Save metadata item\n // We always register this route, but return 501 if protocol doesn't support it\n // This makes it discoverable even if not implemented\n this.routeManager.register({\n method: 'PUT',\n path: `${metaPath}/:type/:name`,\n handler: async (req: any, res: any) => {\n try {\n if (!this.protocol.saveMetaItem) {\n res.status(501).json({ error: 'Save operation not supported by protocol implementation' });\n return;\n }\n\n const result = await this.protocol.saveMetaItem({\n type: req.params.type,\n name: req.params.name,\n item: req.body\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Save specific metadata item',\n tags: ['metadata'],\n },\n });\n }\n \n /**\n * Register CRUD endpoints for data operations\n */\n private registerCrudEndpoints(basePath: string): void {\n const { crud } = this.config;\n const dataPath = `${basePath}${crud.dataPrefix}`;\n \n const operations = crud.operations;\n \n // GET /data/:object - List/query records\n if (operations.list) {\n this.routeManager.register({\n method: 'GET',\n path: `${dataPath}/:object`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.findData({\n object: req.params.object, \n query: req.query\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Query records',\n tags: ['data', 'crud'],\n },\n });\n }\n \n // GET /data/:object/:id - Get single record\n if (operations.read) {\n this.routeManager.register({\n method: 'GET',\n path: `${dataPath}/:object/:id`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.getData({\n object: req.params.object, \n id: req.params.id\n });\n res.json(result);\n } catch (error: any) {\n res.status(404).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Get record by ID',\n tags: ['data', 'crud'],\n },\n });\n }\n \n // POST /data/:object - Create record\n if (operations.create) {\n this.routeManager.register({\n method: 'POST',\n path: `${dataPath}/:object`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.createData({\n object: req.params.object, \n data: req.body\n });\n res.status(201).json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Create record',\n tags: ['data', 'crud'],\n },\n });\n }\n \n // PATCH /data/:object/:id - Update record\n if (operations.update) {\n this.routeManager.register({\n method: 'PATCH',\n path: `${dataPath}/:object/:id`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.updateData({\n object: req.params.object,\n id: req.params.id,\n data: req.body\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Update record',\n tags: ['data', 'crud'],\n },\n });\n }\n \n // DELETE /data/:object/:id - Delete record\n if (operations.delete) {\n this.routeManager.register({\n method: 'DELETE',\n path: `${dataPath}/:object/:id`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.deleteData({\n object: req.params.object, \n id: req.params.id\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Delete record',\n tags: ['data', 'crud'],\n },\n });\n }\n }\n \n /**\n * Register batch operation endpoints\n */\n private registerBatchEndpoints(basePath: string): void {\n const { crud, batch } = this.config;\n const dataPath = `${basePath}${crud.dataPrefix}`;\n \n const operations = batch.operations;\n \n // POST /data/:object/batch - Generic batch endpoint\n if (batch.enableBatchEndpoint && this.protocol.batchData) {\n this.routeManager.register({\n method: 'POST',\n path: `${dataPath}/:object/batch`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.batchData!({\n object: req.params.object, \n request: req.body\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Batch operations',\n tags: ['data', 'batch'],\n },\n });\n }\n \n // POST /data/:object/createMany - Bulk create\n if (operations.createMany && this.protocol.createManyData) {\n this.routeManager.register({\n method: 'POST',\n path: `${dataPath}/:object/createMany`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.createManyData!({\n object: req.params.object,\n records: req.body || []\n });\n res.status(201).json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Create multiple records',\n tags: ['data', 'batch'],\n },\n });\n }\n \n // POST /data/:object/updateMany - Bulk update\n if (operations.updateMany && this.protocol.updateManyData) {\n this.routeManager.register({\n method: 'POST',\n path: `${dataPath}/:object/updateMany`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.updateManyData!({\n object: req.params.object,\n ...req.body\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Update multiple records',\n tags: ['data', 'batch'],\n },\n });\n }\n \n // POST /data/:object/deleteMany - Bulk delete\n if (operations.deleteMany && this.protocol.deleteManyData) {\n this.routeManager.register({\n method: 'POST',\n path: `${dataPath}/:object/deleteMany`,\n handler: async (req: any, res: any) => {\n try {\n const result = await this.protocol.deleteManyData!({\n object: req.params.object, \n ...req.body\n });\n res.json(result);\n } catch (error: any) {\n res.status(400).json({ error: error.message });\n }\n },\n metadata: {\n summary: 'Delete multiple records',\n tags: ['data', 'batch'],\n },\n });\n }\n }\n \n /**\n * Get the route manager\n */\n getRouteManager(): RouteManager {\n return this.routeManager;\n }\n \n /**\n * Get all registered routes\n */\n getRoutes() {\n return this.routeManager.getAll();\n }\n}\n","import { Plugin, PluginContext, IHttpServer } from '@objectstack/core';\nimport { RestServer } from './rest-server.js';\nimport { ObjectStackProtocol, RestServerConfig } from '@objectstack/spec/api';\n\nexport interface ApiRegistryConfig {\n serverServiceName?: string;\n protocolServiceName?: string;\n api?: RestServerConfig;\n}\n\n/**\n * ApiRegistryPlugin\n * \n * Responsibilities:\n * 1. Consumes 'http.server' (or configured service)\n * 2. Consumes 'protocol' (ObjectStackProtocol)\n * 3. Instantiates RestServer to auto-generate routes\n */\nexport function createApiRegistryPlugin(config: ApiRegistryConfig = {}): Plugin {\n return {\n name: 'com.objectstack.runtime.api-registry',\n version: '1.0.0',\n \n init: async (_ctx: PluginContext) => {\n // No service registration, this is a consumer plugin\n },\n \n start: async (ctx: PluginContext) => {\n const serverService = config.serverServiceName || 'http.server';\n const protocolService = config.protocolServiceName || 'protocol';\n \n let server: IHttpServer | undefined;\n let protocol: ObjectStackProtocol | undefined;\n\n try {\n server = ctx.getService<IHttpServer>(serverService);\n } catch (e) {\n // Ignore missing service\n }\n\n try {\n protocol = ctx.getService<ObjectStackProtocol>(protocolService);\n } catch (e) {\n // Ignore missing service\n }\n \n if (!server) {\n ctx.logger.warn(`ApiRegistryPlugin: HTTP Server service '${serverService}' not found. REST routes skipped.`);\n return;\n }\n \n if (!protocol) {\n ctx.logger.warn(`ApiRegistryPlugin: Protocol service '${protocolService}' not found. REST routes skipped.`);\n return;\n }\n \n ctx.logger.info('Hydrating REST API from Protocol...');\n \n try {\n const restServer = new RestServer(server, protocol, config.api as any);\n restServer.registerRoutes();\n \n ctx.logger.info('REST API successfully registered');\n } catch (err: any) {\n ctx.logger.error('Failed to register REST API routes', { error: err.message } as any);\n throw err;\n }\n }\n };\n}\n","import { Plugin, PluginContext } from '@objectstack/core';\n\n/**\n * Driver Plugin\n * \n * Generic plugin wrapper for ObjectQL drivers.\n * Registers a driver with the ObjectQL engine.\n * \n * Dependencies: None (Registers service for ObjectQL to discover)\n * Services: driver.{name}\n * \n * @example\n * const memoryDriver = new InMemoryDriver();\n * const driverPlugin = new DriverPlugin(memoryDriver, 'memory');\n * kernel.use(driverPlugin);\n */\nexport class DriverPlugin implements Plugin {\n name: string;\n type = 'driver';\n version = '1.0.0';\n // dependencies = ['com.objectstack.engine.objectql']; // Removed: Driver is a producer, not strictly a consumer during init\n\n private driver: any;\n\n constructor(driver: any, driverName?: string) {\n this.driver = driver;\n this.name = `com.objectstack.driver.${driverName || driver.name || 'unknown'}`;\n }\n\n init = async (ctx: PluginContext) => {\n // Register driver as a service instead of directly to objectql\n const serviceName = `driver.${this.driver.name || 'unknown'}`;\n ctx.registerService(serviceName, this.driver);\n ctx.logger.info('Driver service registered', { \n serviceName, \n driverName: this.driver.name,\n driverVersion: this.driver.version \n });\n }\n\n start = async (ctx: PluginContext) => {\n // Drivers don't need start phase, initialization happens in init\n // Auto-configure alias for shorter access if it follows reverse domain standard\n if (this.name.startsWith('com.objectstack.driver.')) {\n // const shortName = this.name.split('.').pop();\n // Optional: ctx.registerService(`driver.${shortName}`, this.driver);\n }\n\n // Auto-configure 'default' datasource if none exists\n // We do this in 'start' phase to ensure metadata service is likely available\n try {\n const metadata = ctx.getService<any>('metadata');\n if (metadata && metadata.addDatasource) {\n // Check if default datasource exists\n const datasources = metadata.getDatasources ? metadata.getDatasources() : [];\n const hasDefault = datasources.some((ds: any) => ds.name === 'default');\n\n if (!hasDefault) {\n ctx.logger.info(`[DriverPlugin] No 'default' datasource found. Auto-configuring '${this.driver.name}' as default.`);\n await metadata.addDatasource({\n name: 'default',\n driver: this.driver.name, // The driver's internal name (e.g. com.objectstack.driver.memory)\n });\n }\n }\n } catch (e) {\n // Metadata service might not be ready or available, which is fine\n // We just skip auto-configuration\n ctx.logger.debug('[DriverPlugin] Failed to auto-configure default datasource (Metadata service missing?)', { error: e });\n }\n\n ctx.logger.debug('Driver plugin started', { driverName: this.driver.name || 'unknown' });\n }\n}\n","import { Plugin, PluginContext } from '@objectstack/core';\n\n/**\n * AppPlugin\n * \n * Adapts a generic App Bundle (Manifest + Runtime Code) into a Kernel Plugin.\n * \n * Responsibilities:\n * 1. Register App Manifest as a service (for ObjectQL discovery)\n * 2. Execute Runtime `onEnable` hook (for code logic)\n */\nexport class AppPlugin implements Plugin {\n name: string;\n type = 'app';\n version?: string;\n \n private bundle: any;\n\n constructor(bundle: any) {\n this.bundle = bundle;\n // Support both direct manifest (legacy) and Stack Definition (nested manifest)\n const sys = bundle.manifest || bundle;\n const appId = sys.id || sys.name || 'unnamed-app';\n \n this.name = `plugin.app.${appId}`;\n this.version = sys.version;\n }\n\n init = async (ctx: PluginContext) => {\n const sys = this.bundle.manifest || this.bundle;\n const appId = sys.id || sys.name;\n\n ctx.logger.info('Registering App Service', { \n appId, \n pluginName: this.name,\n version: this.version \n });\n \n // Register the app manifest as a service\n // ObjectQLPlugin will discover this and call ql.registerApp()\n const serviceName = `app.${appId}`;\n\n // Merge manifest with the bundle to ensure objects/apps are accessible at root\n // This supports both Legacy Manifests and new Stack Definitions\n const servicePayload = this.bundle.manifest \n ? { ...this.bundle.manifest, ...this.bundle }\n : this.bundle;\n\n ctx.registerService(serviceName, servicePayload);\n }\n\n start = async (ctx: PluginContext) => {\n const sys = this.bundle.manifest || this.bundle;\n const appId = sys.id || sys.name;\n \n // Execute Runtime Step\n // Retrieve ObjectQL engine from services\n // We cast to any/ObjectQL because ctx.getService returns unknown\n const ql = ctx.getService('objectql') as any;\n \n if (!ql) {\n ctx.logger.warn('ObjectQL engine service not found', { \n appName: this.name,\n appId \n });\n return;\n }\n\n ctx.logger.debug('Retrieved ObjectQL engine service', { appId });\n\n const runtime = this.bundle.default || this.bundle;\n \n if (runtime && typeof runtime.onEnable === 'function') {\n ctx.logger.info('Executing runtime.onEnable', { \n appName: this.name,\n appId \n });\n \n // Construct the Host Context (mirroring old ObjectQL.use logic)\n const hostContext = {\n ...ctx,\n ql,\n logger: ctx.logger,\n drivers: {\n register: (driver: any) => {\n ctx.logger.debug('Registering driver via app runtime', { \n driverName: driver.name,\n appId \n });\n ql.registerDriver(driver);\n }\n },\n };\n \n await runtime.onEnable(hostContext);\n ctx.logger.debug('Runtime.onEnable completed', { appId });\n } else {\n ctx.logger.debug('No runtime.onEnable function found', { appId });\n }\n\n // Data Seeding\n // Check for 'data' in manifest (Legacy or Stack Definition)\n const manifest = this.bundle.manifest || this.bundle;\n if (manifest && Array.isArray(manifest.data)) {\n ctx.logger.info(`[AppPlugin] Found initial data for ${appId}`, { count: manifest.data.length });\n for (const dataset of manifest.data) {\n if (dataset.object && Array.isArray(dataset.records)) {\n ctx.logger.info(`[Seeder] Seeding ${dataset.records.length} records for ${dataset.object}`);\n for (const record of dataset.records) {\n try {\n // Use ObjectQL engine to insert data\n // This ensures driver resolution and hook execution\n // Use 'insert' which corresponds to 'create' in driver\n await ql.insert(dataset.object, record);\n } catch (err: any) {\n // Ignore duplicate errors if needed, or log/warn\n ctx.logger.warn(`[Seeder] Failed to insert ${dataset.object} record:`, { error: err.message });\n }\n }\n }\n }\n ctx.logger.info('[Seeder] Data seeding complete.');\n }\n }\n}\n","import { IHttpServer, RouteHandler, Middleware } from '@objectstack/core';\n\n/**\n * HttpServer - Unified HTTP Server Abstraction\n * \n * Provides a framework-agnostic HTTP server interface that wraps\n * underlying server implementations (Hono, Express, Fastify, etc.)\n * \n * This class serves as an adapter between the IHttpServer interface\n * and concrete server implementations, allowing plugins to register\n * routes and middleware without depending on specific frameworks.\n * \n * Features:\n * - Unified route registration API\n * - Middleware management with ordering\n * - Request/response lifecycle hooks\n * - Framework-agnostic abstractions\n */\nexport class HttpServer implements IHttpServer {\n protected server: IHttpServer;\n protected routes: Map<string, RouteHandler>;\n protected middlewares: Middleware[];\n \n /**\n * Create an HTTP server wrapper\n * @param server - The underlying server implementation (Hono, Express, etc.)\n */\n constructor(server: IHttpServer) {\n this.server = server;\n this.routes = new Map();\n this.middlewares = [];\n }\n \n /**\n * Register a GET route handler\n * @param path - Route path (e.g., '/api/users/:id')\n * @param handler - Route handler function\n */\n get(path: string, handler: RouteHandler): void {\n const key = `GET:${path}`;\n this.routes.set(key, handler);\n this.server.get(path, handler);\n }\n \n /**\n * Register a POST route handler\n * @param path - Route path\n * @param handler - Route handler function\n */\n post(path: string, handler: RouteHandler): void {\n const key = `POST:${path}`;\n this.routes.set(key, handler);\n this.server.post(path, handler);\n }\n \n /**\n * Register a PUT route handler\n * @param path - Route path\n * @param handler - Route handler function\n */\n put(path: string, handler: RouteHandler): void {\n const key = `PUT:${path}`;\n this.routes.set(key, handler);\n this.server.put(path, handler);\n }\n \n /**\n * Register a DELETE route handler\n * @param path - Route path\n * @param handler - Route handler function\n */\n delete(path: string, handler: RouteHandler): void {\n const key = `DELETE:${path}`;\n this.routes.set(key, handler);\n this.server.delete(path, handler);\n }\n \n /**\n * Register a PATCH route handler\n * @param path - Route path\n * @param handler - Route handler function\n */\n patch(path: string, handler: RouteHandler): void {\n const key = `PATCH:${path}`;\n this.routes.set(key, handler);\n this.server.patch(path, handler);\n }\n \n /**\n * Register middleware\n * @param path - Optional path to apply middleware to (if omitted, applies globally)\n * @param handler - Middleware function\n */\n use(path: string | Middleware, handler?: Middleware): void {\n if (typeof path === 'function') {\n // Global middleware\n this.middlewares.push(path);\n this.server.use(path);\n } else if (handler) {\n // Path-specific middleware\n this.middlewares.push(handler);\n this.server.use(path, handler);\n }\n }\n \n /**\n * Start the HTTP server\n * @param port - Port number to listen on\n * @returns Promise that resolves when server is ready\n */\n async listen(port: number): Promise<void> {\n await this.server.listen(port);\n }\n \n /**\n * Stop the HTTP server\n * @returns Promise that resolves when server is stopped\n */\n async close(): Promise<void> {\n if (this.server.close) {\n await this.server.close();\n }\n }\n \n /**\n * Get registered routes\n * @returns Map of route keys to handlers\n */\n getRoutes(): Map<string, RouteHandler> {\n return new Map(this.routes);\n }\n \n /**\n * Get registered middlewares\n * @returns Array of middleware functions\n */\n getMiddlewares(): Middleware[] {\n return [...this.middlewares];\n }\n}\n","import { ObjectKernel, getEnv } from '@objectstack/core';\nimport { CoreServiceName } from '@objectstack/spec/system';\n\nexport interface HttpProtocolContext {\n request: any;\n response?: any;\n}\n\nexport interface HttpDispatcherResult {\n handled: boolean;\n response?: {\n status: number;\n body?: any;\n headers?: Record<string, string>;\n };\n result?: any; // For flexible return types or direct response objects (Response/NextResponse)\n}\n\nexport class HttpDispatcher {\n private kernel: any; // Casting to any to access dynamic props like broker, services, graphql\n\n constructor(kernel: ObjectKernel) {\n this.kernel = kernel;\n }\n\n private success(data: any, meta?: any) {\n return {\n status: 200,\n body: { success: true, data, meta }\n };\n }\n\n private error(message: string, code: number = 500, details?: any) {\n return {\n status: code,\n body: { success: false, error: { message, code, details } }\n };\n }\n\n private ensureBroker() {\n if (!this.kernel.broker) {\n throw { statusCode: 500, message: 'Kernel Broker not available' };\n }\n return this.kernel.broker;\n }\n\n /**\n * Generates the discovery JSON response for the API root\n */\n getDiscoveryInfo(prefix: string) {\n const services = this.getServicesMap();\n \n const hasGraphQL = !!(services[CoreServiceName.enum.graphql] || this.kernel.graphql);\n const hasSearch = !!services[CoreServiceName.enum.search];\n const hasWebSockets = !!services[CoreServiceName.enum.realtime];\n const hasFiles = !!(services[CoreServiceName.enum['file-storage']] || services['storage']?.supportsFiles);\n const hasAnalytics = !!services[CoreServiceName.enum.analytics];\n const hasHub = !!services[CoreServiceName.enum.hub];\n\n return {\n name: 'ObjectOS',\n version: '1.0.0',\n environment: getEnv('NODE_ENV', 'development'),\n routes: {\n data: `${prefix}/data`,\n metadata: `${prefix}/meta`,\n auth: `${prefix}/auth`,\n graphql: hasGraphQL ? `${prefix}/graphql` : undefined,\n storage: hasFiles ? `${prefix}/storage` : undefined,\n analytics: hasAnalytics ? `${prefix}/analytics` : undefined,\n hub: hasHub ? `${prefix}/hub` : undefined,\n },\n features: {\n graphql: hasGraphQL,\n search: hasSearch,\n websockets: hasWebSockets,\n files: hasFiles,\n analytics: hasAnalytics,\n hub: hasHub,\n },\n locale: {\n default: 'en',\n supported: ['en', 'zh-CN'],\n timezone: 'UTC'\n }\n };\n }\n\n /**\n * Handles GraphQL requests\n */\n async handleGraphQL(body: { query: string; variables?: any }, context: HttpProtocolContext) {\n if (!body || !body.query) {\n throw { statusCode: 400, message: 'Missing query in request body' };\n }\n \n if (typeof this.kernel.graphql !== 'function') {\n throw { statusCode: 501, message: 'GraphQL service not available' };\n }\n\n return this.kernel.graphql(body.query, body.variables, { \n request: context.request \n });\n }\n\n /**\n * Handles Auth requests\n * path: sub-path after /auth/\n */\n async handleAuth(path: string, method: string, body: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n // 1. Try generic Auth Service\n const authService = this.getService(CoreServiceName.enum.auth);\n if (authService && typeof authService.handler === 'function') {\n const response = await authService.handler(context.request, context.response);\n return { handled: true, result: response };\n }\n\n // 2. Legacy Login\n const normalizedPath = path.replace(/^\\/+/, '');\n if (normalizedPath === 'login' && method.toUpperCase() === 'POST') {\n const broker = this.ensureBroker();\n const data = await broker.call('auth.login', body, { request: context.request });\n return { handled: true, response: { status: 200, body: data } };\n }\n\n return { handled: false };\n }\n\n /**\n * Handles Metadata requests\n * Standard: /metadata/:type/:name\n * Fallback for backward compat: /metadata (all objects), /metadata/:objectName (get object)\n */\n async handleMetadata(path: string, context: HttpProtocolContext, method?: string, body?: any): Promise<HttpDispatcherResult> {\n const broker = this.ensureBroker();\n const parts = path.replace(/^\\/+/, '').split('/').filter(Boolean);\n \n // GET /metadata/types\n if (parts[0] === 'types') {\n // This would normally come from a registry service\n // For now we mock the types supported by core\n return { handled: true, response: this.success({ types: ['objects', 'apps', 'plugins'] }) };\n }\n\n // /metadata/:type/:name\n if (parts.length === 2) {\n const [type, name] = parts;\n\n // PUT /metadata/:type/:name (Save)\n if (method === 'PUT' && body) {\n // Try to get the protocol service directly\n const protocol = this.kernel?.context?.getService ? this.kernel.context.getService('protocol') : null;\n \n if (protocol && typeof protocol.saveMetaItem === 'function') {\n try {\n const result = await protocol.saveMetaItem({ type, name, item: body });\n return { handled: true, response: this.success(result) };\n } catch (e: any) {\n return { handled: true, response: this.error(e.message, 400) };\n }\n }\n \n // Fallback to broker if protocol not available (legacy)\n try {\n const data = await broker.call('metadata.saveItem', { type, name, item: body }, { request: context.request });\n return { handled: true, response: this.success(data) };\n } catch (e: any) {\n // If broker doesn't support it either\n return { handled: true, response: this.error(e.message || 'Save not supported', 501) };\n }\n }\n\n try {\n // Try specific calls based on type\n if (type === 'objects') {\n const data = await broker.call('metadata.getObject', { objectName: name }, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n // Generic call for other types if supported\n const data = await broker.call(`metadata.get${this.capitalize(type.slice(0, -1))}`, { name }, { request: context.request });\n return { handled: true, response: this.success(data) };\n } catch (e: any) {\n // Fallback: treat first part as object name if only 1 part (handled below)\n // But here we are deep in 2 parts. Must be an error.\n return { handled: true, response: this.error(e.message, 404) };\n }\n }\n \n // GET /metadata/:type (List items of type) OR /metadata/:objectName (Legacy)\n if (parts.length === 1) {\n const typeOrName = parts[0];\n \n // Heuristic: if it maps to a known type, list it. Else treat as object name.\n if (['objects', 'apps', 'plugins'].includes(typeOrName)) {\n if (typeOrName === 'objects') {\n const data = await broker.call('metadata.objects', {}, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n // Try generic list\n const data = await broker.call(`metadata.${typeOrName}`, {}, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n\n // Legacy: /metadata/:objectName\n const data = await broker.call('metadata.getObject', { objectName: typeOrName }, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n\n // GET /metadata (List Objects - Default)\n if (parts.length === 0) {\n const data = await broker.call('metadata.objects', {}, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n \n return { handled: false };\n }\n\n /**\n * Handles Data requests\n * path: sub-path after /data/ (e.g. \"contacts\", \"contacts/123\", \"contacts/query\")\n */\n async handleData(path: string, method: string, body: any, query: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const broker = this.ensureBroker();\n const parts = path.replace(/^\\/+/, '').split('/');\n const objectName = parts[0];\n \n if (!objectName) {\n return { handled: true, response: this.error('Object name required', 400) };\n }\n\n const m = method.toUpperCase();\n\n // 1. Custom Actions (query, batch)\n if (parts.length > 1) {\n const action = parts[1];\n \n // POST /data/:object/query\n if (action === 'query' && m === 'POST') {\n const result = await broker.call('data.query', { object: objectName, ...body }, { request: context.request });\n return { handled: true, response: this.success(result.data, { count: result.count, limit: body.limit, skip: body.skip }) };\n }\n\n // POST /data/:object/batch\n if (action === 'batch' && m === 'POST') {\n // Spec complaint: forward the whole body { operation, records, options }\n // Implementation in Kernel should handle the 'operation' field\n const result = await broker.call('data.batch', { object: objectName, ...body }, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n\n // GET /data/:object/:id\n if (parts.length === 2 && m === 'GET') {\n const id = parts[1];\n const data = await broker.call('data.get', { object: objectName, id, ...query }, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n\n // PATCH /data/:object/:id\n if (parts.length === 2 && m === 'PATCH') {\n const id = parts[1];\n const data = await broker.call('data.update', { object: objectName, id, data: body }, { request: context.request });\n return { handled: true, response: this.success(data) };\n }\n\n // DELETE /data/:object/:id\n if (parts.length === 2 && m === 'DELETE') {\n const id = parts[1];\n await broker.call('data.delete', { object: objectName, id }, { request: context.request });\n return { handled: true, response: this.success({ id, deleted: true }) };\n }\n } else {\n // GET /data/:object (List)\n if (m === 'GET') {\n const result = await broker.call('data.query', { object: objectName, filters: query }, { request: context.request });\n return { handled: true, response: this.success(result.data, { count: result.count }) };\n }\n\n // POST /data/:object (Create)\n if (m === 'POST') {\n const data = await broker.call('data.create', { object: objectName, data: body }, { request: context.request });\n // Note: ideally 201\n const res = this.success(data);\n res.status = 201;\n return { handled: true, response: res };\n }\n }\n \n return { handled: false };\n }\n\n /**\n * Handles Analytics requests\n * path: sub-path after /analytics/\n */\n async handleAnalytics(path: string, method: string, body: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const analyticsService = this.getService(CoreServiceName.enum.analytics);\n if (!analyticsService) return { handled: false }; // 404 handled by caller if unhandled\n\n const m = method.toUpperCase();\n const subPath = path.replace(/^\\/+/, '');\n\n // POST /analytics/query\n if (subPath === 'query' && m === 'POST') {\n const result = await analyticsService.query(body, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n\n // GET /analytics/meta\n if (subPath === 'meta' && m === 'GET') {\n const result = await analyticsService.getMetadata({ request: context.request });\n return { handled: true, response: this.success(result) };\n }\n\n // POST /analytics/sql (Dry-run or debug)\n if (subPath === 'sql' && m === 'POST') {\n // Assuming service has generateSql method\n const result = await analyticsService.generateSql(body, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n\n return { handled: false };\n }\n\n /**\n * Handles Hub requests\n * path: sub-path after /hub/\n */\n async handleHub(path: string, method: string, body: any, query: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const hubService = this.getService(CoreServiceName.enum.hub);\n if (!hubService) return { handled: false };\n\n const m = method.toUpperCase();\n const parts = path.replace(/^\\/+/, '').split('/');\n \n // Resource-based routing: /hub/:resource/:id\n if (parts.length > 0) {\n const resource = parts[0]; // spaces, plugins, etc.\n \n // Allow mapping \"spaces\" -> \"createSpace\", \"listSpaces\" etc.\n // Convention: \n // GET /spaces -> listSpaces\n // POST /spaces -> createSpace\n // GET /spaces/:id -> getSpace\n // PATCH /spaces/:id -> updateSpace\n // DELETE /spaces/:id -> deleteSpace\n \n const actionBase = resource.endsWith('s') ? resource.slice(0, -1) : resource; // space\n const id = parts[1];\n\n try {\n if (parts.length === 1) {\n // Collection Operations\n if (m === 'GET') {\n const capitalizedAction = 'list' + this.capitalize(resource); // listSpaces\n if (typeof hubService[capitalizedAction] === 'function') {\n const result = await hubService[capitalizedAction](query, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n if (m === 'POST') {\n const capitalizedAction = 'create' + this.capitalize(actionBase); // createSpace\n if (typeof hubService[capitalizedAction] === 'function') {\n const result = await hubService[capitalizedAction](body, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n } else if (parts.length === 2) {\n // Item Operations\n if (m === 'GET') {\n const capitalizedAction = 'get' + this.capitalize(actionBase); // getSpace\n if (typeof hubService[capitalizedAction] === 'function') {\n const result = await hubService[capitalizedAction](id, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n if (m === 'PATCH' || m === 'PUT') {\n const capitalizedAction = 'update' + this.capitalize(actionBase); // updateSpace\n if (typeof hubService[capitalizedAction] === 'function') {\n const result = await hubService[capitalizedAction](id, body, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n if (m === 'DELETE') {\n const capitalizedAction = 'delete' + this.capitalize(actionBase); // deleteSpace\n if (typeof hubService[capitalizedAction] === 'function') {\n const result = await hubService[capitalizedAction](id, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n }\n } catch(e: any) {\n return { handled: true, response: this.error(e.message, 500) };\n }\n }\n \n return { handled: false };\n }\n\n /**\n * Handles Storage requests\n * path: sub-path after /storage/\n */\n async handleStorage(path: string, method: string, file: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const storageService = this.getService(CoreServiceName.enum['file-storage']) || this.kernel.services?.['file-storage'];\n if (!storageService) {\n return { handled: true, response: this.error('File storage not configured', 501) };\n }\n \n const m = method.toUpperCase();\n const parts = path.replace(/^\\/+/, '').split('/');\n \n // POST /storage/upload\n if (parts[0] === 'upload' && m === 'POST') {\n if (!file) {\n return { handled: true, response: this.error('No file provided', 400) };\n }\n const result = await storageService.upload(file, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n \n // GET /storage/file/:id\n if (parts[0] === 'file' && parts[1] && m === 'GET') {\n const id = parts[1];\n const result = await storageService.download(id, { request: context.request });\n \n // Result can be URL (redirect), Stream/Blob, or metadata\n if (result.url && result.redirect) {\n // Must be handled by adapter to do actual redirect\n return { handled: true, result: { type: 'redirect', url: result.url } };\n }\n \n if (result.stream) {\n // Must be handled by adapter to pipe stream\n return { \n handled: true, \n result: { \n type: 'stream', \n stream: result.stream, \n headers: {\n 'Content-Type': result.mimeType || 'application/octet-stream',\n 'Content-Length': result.size\n }\n } \n };\n }\n \n return { handled: true, response: this.success(result) };\n }\n \n return { handled: false };\n }\n\n /**\n * Handles Automation requests\n * path: sub-path after /automation/\n */\n async handleAutomation(path: string, method: string, body: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const automationService = this.getService(CoreServiceName.enum.automation);\n if (!automationService) return { handled: false };\n\n const m = method.toUpperCase();\n const parts = path.replace(/^\\/+/, '').split('/');\n \n // POST /automation/trigger/:name\n if (parts[0] === 'trigger' && parts[1] && m === 'POST') {\n const triggerName = parts[1];\n if (typeof automationService.trigger === 'function') {\n const result = await automationService.trigger(triggerName, body, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n \n return { handled: false };\n }\n\n private getServicesMap(): Record<string, any> {\n if (this.kernel.services instanceof Map) {\n return Object.fromEntries(this.kernel.services);\n }\n return this.kernel.services || {};\n }\n\n private getService(name: CoreServiceName) {\n if (typeof this.kernel.getService === 'function') {\n return this.kernel.getService(name);\n }\n const services = this.getServicesMap();\n return services[name];\n }\n\n private capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1);\n }\n\n /**\n * Main Dispatcher Entry Point\n * Routes the request to the appropriate handler based on path and precedence\n */\n async dispatch(method: string, path: string, body: any, query: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const cleanPath = path.replace(/\\/$/, ''); // Remove trailing slash if present, but strict on clean paths\n\n // 1. System Protocols (Prefix-based)\n if (cleanPath.startsWith('/auth')) {\n return this.handleAuth(cleanPath.substring(5), method, body, context);\n }\n \n if (cleanPath.startsWith('/meta')) {\n return this.handleMetadata(cleanPath.substring(5), context);\n }\n\n if (cleanPath.startsWith('/data')) {\n return this.handleData(cleanPath.substring(5), method, body, query, context);\n }\n \n if (cleanPath.startsWith('/graphql')) {\n if (method === 'POST') return this.handleGraphQL(body, context);\n // GraphQL usually GET for Playground is handled by middleware but we can return 405 or handle it\n }\n\n if (cleanPath.startsWith('/storage')) {\n return this.handleStorage(cleanPath.substring(8), method, body, context); // body here is file/stream for upload\n }\n \n if (cleanPath.startsWith('/automation')) {\n return this.handleAutomation(cleanPath.substring(11), method, body, context);\n }\n \n if (cleanPath.startsWith('/analytics')) {\n return this.handleAnalytics(cleanPath.substring(10), method, body, context);\n }\n\n if (cleanPath.startsWith('/hub')) {\n return this.handleHub(cleanPath.substring(4), method, body, query, context);\n }\n\n // OpenAPI Specification\n if (cleanPath === '/openapi.json' && method === 'GET') {\n const broker = this.ensureBroker();\n try {\n const result = await broker.call('metadata.generateOpenApi', {}, { request: context.request });\n return { handled: true, response: this.success(result) };\n } catch (e) {\n // If not implemented, fall through or return 404\n }\n }\n\n // 2. Custom API Endpoints (Registry lookup)\n // Check if there is a custom endpoint defined for this path\n const result = await this.handleApiEndpoint(cleanPath, method, body, query, context);\n if (result.handled) return result;\n\n // 3. Fallback (404)\n return { handled: false };\n }\n\n /**\n * Handles Custom API Endpoints defined in metadata\n */\n async handleApiEndpoint(path: string, method: string, body: any, query: any, context: HttpProtocolContext): Promise<HttpDispatcherResult> {\n const broker = this.ensureBroker();\n try {\n // Attempt to find a matching endpoint in the registry\n // This assumes a 'metadata.matchEndpoint' action exists in the kernel/registry\n // path should include initial slash e.g. /api/v1/customers\n const endpoint = await broker.call('metadata.matchEndpoint', { path, method });\n \n if (endpoint) {\n // Execute the endpoint target logic\n if (endpoint.type === 'flow') {\n const result = await broker.call('automation.runFlow', { \n flowId: endpoint.target, \n inputs: { ...query, ...body, _request: context.request } \n });\n return { handled: true, response: this.success(result) };\n }\n \n if (endpoint.type === 'script') {\n const result = await broker.call('automation.runScript', { \n scriptName: endpoint.target, \n context: { ...query, ...body, request: context.request } \n }, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n\n if (endpoint.type === 'object_operation') {\n // e.g. Proxy to an object action\n if (endpoint.objectParams) {\n const { object, operation } = endpoint.objectParams;\n // Map standard CRUD operations\n if (operation === 'find') {\n const result = await broker.call('data.query', { object, filters: query }, { request: context.request });\n return { handled: true, response: this.success(result.data, { count: result.count }) };\n }\n if (operation === 'get' && query.id) {\n const result = await broker.call('data.get', { object, id: query.id }, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n if (operation === 'create') {\n const result = await broker.call('data.create', { object, data: body }, { request: context.request });\n return { handled: true, response: this.success(result) };\n }\n }\n }\n\n if (endpoint.type === 'proxy') {\n // Simple proxy implementation (requires a network call, which usually is done by a service but here we can stub return)\n // In real implementation this might fetch(endpoint.target)\n // For now, return target info\n return { \n handled: true, \n response: { \n status: 200, \n body: { proxy: true, target: endpoint.target, note: 'Proxy execution requires http-client service' } \n } \n };\n }\n }\n } catch (e) {\n // If matchEndpoint fails (e.g. not found), we just return not handled\n // so we can fallback to 404 or other handlers\n }\n\n return { handled: false };\n }\n}\n","import { Middleware, IHttpRequest, IHttpResponse } from '@objectstack/core';\nimport { MiddlewareConfig, MiddlewareType } from '@objectstack/spec/system';\n\n/**\n * Middleware Entry\n * Internal representation of registered middleware\n */\ninterface MiddlewareEntry {\n name: string;\n type: MiddlewareType;\n middleware: Middleware;\n order: number;\n enabled: boolean;\n paths?: {\n include?: string[];\n exclude?: string[];\n };\n}\n\n/**\n * MiddlewareManager\n * \n * Manages middleware registration, ordering, and execution.\n * Provides fine-grained control over middleware chains with:\n * - Execution order management\n * - Path-based filtering\n * - Enable/disable individual middleware\n * - Middleware categorization by type\n * \n * @example\n * const manager = new MiddlewareManager();\n * \n * // Register middleware with configuration\n * manager.register({\n * name: 'auth',\n * type: 'authentication',\n * order: 10,\n * paths: { exclude: ['/health', '/metrics'] }\n * }, authMiddleware);\n * \n * // Get sorted middleware chain\n * const chain = manager.getMiddlewareChain();\n * chain.forEach(mw => server.use(mw));\n */\nexport class MiddlewareManager {\n private middlewares: Map<string, MiddlewareEntry>;\n \n constructor() {\n this.middlewares = new Map();\n }\n \n /**\n * Register middleware with configuration\n * @param config - Middleware configuration\n * @param middleware - Middleware function\n */\n register(config: MiddlewareConfig, middleware: Middleware): void {\n const entry: MiddlewareEntry = {\n name: config.name,\n type: config.type,\n middleware,\n order: config.order ?? 100,\n enabled: config.enabled ?? true,\n paths: config.paths,\n };\n \n this.middlewares.set(config.name, entry);\n }\n \n /**\n * Unregister middleware by name\n * @param name - Middleware name\n */\n unregister(name: string): void {\n this.middlewares.delete(name);\n }\n \n /**\n * Enable middleware by name\n * @param name - Middleware name\n */\n enable(name: string): void {\n const entry = this.middlewares.get(name);\n if (entry) {\n entry.enabled = true;\n }\n }\n \n /**\n * Disable middleware by name\n * @param name - Middleware name\n */\n disable(name: string): void {\n const entry = this.middlewares.get(name);\n if (entry) {\n entry.enabled = false;\n }\n }\n \n /**\n * Get middleware entry by name\n * @param name - Middleware name\n */\n get(name: string): MiddlewareEntry | undefined {\n return this.middlewares.get(name);\n }\n \n /**\n * Get all middleware entries\n */\n getAll(): MiddlewareEntry[] {\n return Array.from(this.middlewares.values());\n }\n \n /**\n * Get middleware by type\n * @param type - Middleware type\n */\n getByType(type: MiddlewareType): MiddlewareEntry[] {\n return this.getAll().filter(entry => entry.type === type);\n }\n \n /**\n * Get middleware chain sorted by order\n * Returns only enabled middleware\n */\n getMiddlewareChain(): Middleware[] {\n return this.getAll()\n .filter(entry => entry.enabled)\n .sort((a, b) => a.order - b.order)\n .map(entry => entry.middleware);\n }\n \n /**\n * Get middleware chain with path filtering\n * @param path - Request path to match against\n */\n getMiddlewareChainForPath(path: string): Middleware[] {\n return this.getAll()\n .filter(entry => {\n if (!entry.enabled) return false;\n \n // Check path filters\n if (entry.paths) {\n // Check exclude patterns\n if (entry.paths.exclude) {\n const excluded = entry.paths.exclude.some(pattern => \n this.matchPath(path, pattern)\n );\n if (excluded) return false;\n }\n \n // Check include patterns (if specified)\n if (entry.paths.include) {\n const included = entry.paths.include.some(pattern => \n this.matchPath(path, pattern)\n );\n if (!included) return false;\n }\n }\n \n return true;\n })\n .sort((a, b) => a.order - b.order)\n .map(entry => entry.middleware);\n }\n \n /**\n * Match path against pattern (simple glob matching)\n * @param path - Request path\n * @param pattern - Pattern to match (supports * wildcard)\n */\n private matchPath(path: string, pattern: string): boolean {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n \n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(path);\n }\n \n /**\n * Clear all middleware\n */\n clear(): void {\n this.middlewares.clear();\n }\n \n /**\n * Get middleware count\n */\n count(): number {\n return this.middlewares.size;\n }\n \n /**\n * Create a composite middleware from the chain\n * This can be used to apply all middleware at once\n */\n createCompositeMiddleware(): Middleware {\n const chain = this.getMiddlewareChain();\n \n return async (req: IHttpRequest, res: IHttpResponse, next: () => void | Promise<void>) => {\n let index = 0;\n \n const executeNext = async (): Promise<void> => {\n if (index >= chain.length) {\n await next();\n return;\n }\n \n const middleware = chain[index++];\n await middleware(req, res, executeNext);\n };\n \n await executeNext();\n };\n }\n}\n"],"mappings":"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","names":["import_core","import_core","data","result"]}
|