{"_id":"@deltic/service-dispatcher","_rev":"5-4ef9d8a539a70f2ac9a2555cfcea5bc6","name":"@deltic/service-dispatcher","dist-tags":{"latest":"0.2.3"},"versions":{"0.1.0":{"name":"@deltic/service-dispatcher","version":"0.1.0","keywords":[],"author":{"url":"https://frankdejonge.nl","name":"Frank de Jonge"},"license":"ISC","_id":"@deltic/service-dispatcher@0.1.0","maintainers":[{"name":"frankdejonge","email":"info@frankdejonge.nl"}],"homepage":"https://github.com/duna-oss/deltic#readme","bugs":{"url":"https://github.com/duna-oss/deltic/issues"},"dist":{"shasum":"37e07ae65c70f66f365ba30f91066fe6fe972d13","tarball":"https://registry.npmjs.org/@deltic/service-dispatcher/-/service-dispatcher-0.1.0.tgz","fileCount":12,"integrity":"sha512-IuTmkcgcBZbUwLnzQum3kxTv4T/9f7bbY3zFRmEQWYf0l8XPoB5/KN5cdoDIfxICcmxwEYOph6WLUon/fnkBEQ==","signatures":[{"sig":"MEUCIGOrHGZQqRcq5AtiUCfOCjbDU6y0lXW+u6YdIf0I+SzlAiEAyyLz7IZ3Sps9uPqF4yo2EIiX/Lv/AUrzNl0smEm24HE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13942},"type":"module","_from":"file:deltic-service-dispatcher-0.1.0.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs","module-sync":"./dist/index.js"},"./test-tooling":{"types":"./dist/test-tooling.d.ts","import":"./dist/test-tooling.js","require":"./dist/test-tooling.cjs","module-sync":"./dist/test-tooling.js"}},"scripts":{},"_npmUser":{"name":"frankdejonge","email":"info@frankdejonge.nl"},"_resolved":"/private/var/folders/cf/f1s7n7kd3938zynwcqk8_2z00000gn/T/51fe44caccd7785155ed2672d17f5fcc/deltic-service-dispatcher-0.1.0.tgz","_integrity":"sha512-IuTmkcgcBZbUwLnzQum3kxTv4T/9f7bbY3zFRmEQWYf0l8XPoB5/KN5cdoDIfxICcmxwEYOph6WLUon/fnkBEQ==","repository":{"url":"git+https://github.com/duna-oss/deltic.git","type":"git","directory":"packages/service-layer"},"_npmVersion":"11.6.0","description":"A contract-based service abstraction","directories":{},"_nodeVersion":"24.8.0","dependencies":{"fast-equals":"^5.3.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/service-dispatcher_0.1.0_1761559771482_0.1739909822040926","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@deltic/service-dispatcher","version":"0.2.0","keywords":["service","dispatcher","command","middleware"],"author":{"url":"https://frankdejonge.nl","name":"Frank de Jonge"},"license":"ISC","_id":"@deltic/service-dispatcher@0.2.0","maintainers":[{"name":"frankdejonge","email":"info@frankdejonge.nl"}],"homepage":"https://github.com/deltic-oss/deltic#readme","bugs":{"url":"https://github.com/deltic-oss/deltic/issues"},"dist":{"shasum":"2e0f8965e33d3ea6e55ac55a7dc1efacc1d3f329","tarball":"https://registry.npmjs.org/@deltic/service-dispatcher/-/service-dispatcher-0.2.0.tgz","fileCount":28,"integrity":"sha512-2txvP3su7iyZUGoSqQsmJE50oaX23kKnDW+J3gLpea+gsgmUcRpqyhrpO37f319e5z54TBW2ixRlvAUOnJEHng==","signatures":[{"sig":"MEUCIG1l7/NDW7FGF1TCKMrG41WAJJp/QD0gfWRLlP/xxzb4AiEAy2SO358fVdx98j+gROUlI7EenyqAbuqAaBeyK3VsZlU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32506},"type":"module","_from":"file:deltic-service-dispatcher-0.2.0.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs","module-sync":"./dist/index.js"},"./test-tooling":{"types":"./dist/test-tooling.d.ts","import":"./dist/test-tooling.js","require":"./dist/test-tooling.cjs","module-sync":"./dist/test-tooling.js"},"./locking-decorator":{"types":"./dist/locking-decorator.d.ts","import":"./dist/locking-decorator.js","require":"./dist/locking-decorator.cjs","module-sync":"./dist/locking-decorator.js"},"./locking-middleware":{"types":"./dist/locking-middleware.d.ts","import":"./dist/locking-middleware.js","require":"./dist/locking-middleware.cjs","module-sync":"./dist/locking-middleware.js"},"./aggregate-service-dispatcher":{"types":"./dist/aggregate-service-dispatcher.d.ts","import":"./dist/aggregate-service-dispatcher.js","require":"./dist/aggregate-service-dispatcher.cjs","module-sync":"./dist/aggregate-service-dispatcher.js"}},"scripts":{},"_npmUser":{"name":"frankdejonge","email":"info@frankdejonge.nl"},"_resolved":"/private/var/folders/cf/f1s7n7kd3938zynwcqk8_2z00000gn/T/f6c06d3ed9ca4b8d5e92a43163b9b10e/deltic-service-dispatcher-0.2.0.tgz","_integrity":"sha512-2txvP3su7iyZUGoSqQsmJE50oaX23kKnDW+J3gLpea+gsgmUcRpqyhrpO37f319e5z54TBW2ixRlvAUOnJEHng==","repository":{"url":"git+https://github.com/deltic-oss/deltic.git","type":"git","directory":"packages/service-layer"},"_npmVersion":"11.6.0","description":"A contract-based service abstraction","directories":{},"_nodeVersion":"24.8.0","_hasShrinkwrap":false,"devDependencies":{"fast-equals":"^5.3.3","@deltic/mutex":"^0.1.1","reflect-metadata":"^0.2.2","@deltic/event-sourcing":"^0.1.0"},"peerDependencies":{"fast-equals":"^5.3.2","@deltic/mutex":"^0.1.1","@deltic/event-sourcing":"^0.1.0"},"peerDependenciesMeta":{"fast-equals":{"optional":true},"@deltic/mutex":{"optional":true},"@deltic/event-sourcing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/service-dispatcher_0.2.0_1774450028836_0.4732341633986257","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@deltic/service-dispatcher","version":"0.2.1","keywords":["service","dispatcher","command","middleware"],"author":{"url":"https://frankdejonge.nl","name":"Frank de Jonge"},"license":"ISC","_id":"@deltic/service-dispatcher@0.2.1","maintainers":[{"name":"frankdejonge","email":"info@frankdejonge.nl"}],"homepage":"https://github.com/deltic-oss/deltic#readme","bugs":{"url":"https://github.com/deltic-oss/deltic/issues"},"dist":{"shasum":"c94ee6199af294c8f25f708f79bedd6da666e774","tarball":"https://registry.npmjs.org/@deltic/service-dispatcher/-/service-dispatcher-0.2.1.tgz","fileCount":28,"integrity":"sha512-2TBBh6H3QUi8OqIZF9UztAW5IzjFaRTh6C3o7TfjpZaEoh2smcjs/jX87hVvYchpRTQEa8G/whm1kxFT3NvVIQ==","signatures":[{"sig":"MEUCIDOfMp2zRJ7Wy4O0qMhFf+U4JKS27mQHmYgnn/simZVtAiEAuIS0qvWqWGaqi9sETbIhR9MYmDl8och9qPbTdLIPygA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32687},"type":"module","_from":"file:deltic-service-dispatcher-0.2.1.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs","module-sync":"./dist/index.mjs"},"./test-tooling":{"types":"./dist/test-tooling.d.ts","import":"./dist/test-tooling.mjs","require":"./dist/test-tooling.cjs","module-sync":"./dist/test-tooling.mjs"},"./locking-decorator":{"types":"./dist/locking-decorator.d.ts","import":"./dist/locking-decorator.mjs","require":"./dist/locking-decorator.cjs","module-sync":"./dist/locking-decorator.mjs"},"./locking-middleware":{"types":"./dist/locking-middleware.d.ts","import":"./dist/locking-middleware.mjs","require":"./dist/locking-middleware.cjs","module-sync":"./dist/locking-middleware.mjs"},"./aggregate-service-dispatcher":{"types":"./dist/aggregate-service-dispatcher.d.ts","import":"./dist/aggregate-service-dispatcher.mjs","require":"./dist/aggregate-service-dispatcher.cjs","module-sync":"./dist/aggregate-service-dispatcher.mjs"}},"scripts":{},"_npmUser":{"name":"frankdejonge","email":"info@frankdejonge.nl"},"_resolved":"/private/var/folders/cf/f1s7n7kd3938zynwcqk8_2z00000gn/T/279fec434bd73759b487c923378e1984/deltic-service-dispatcher-0.2.1.tgz","_integrity":"sha512-2TBBh6H3QUi8OqIZF9UztAW5IzjFaRTh6C3o7TfjpZaEoh2smcjs/jX87hVvYchpRTQEa8G/whm1kxFT3NvVIQ==","repository":{"url":"git+https://github.com/deltic-oss/deltic.git","type":"git","directory":"packages/service-layer"},"_npmVersion":"11.6.0","description":"A contract-based service abstraction","directories":{},"_nodeVersion":"24.8.0","_hasShrinkwrap":false,"devDependencies":{"fast-equals":"^5.3.3","@deltic/mutex":"^0.1.2","reflect-metadata":"^0.2.2","@deltic/event-sourcing":"^0.1.1"},"peerDependencies":{"fast-equals":"^5.3.2","@deltic/mutex":"^0.1.2","@deltic/event-sourcing":"^0.1.1"},"peerDependenciesMeta":{"fast-equals":{"optional":true},"@deltic/mutex":{"optional":true},"@deltic/event-sourcing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/service-dispatcher_0.2.1_1774454227467_0.308384121306998","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@deltic/service-dispatcher","version":"0.2.2","keywords":["service","dispatcher","command","middleware"],"author":{"url":"https://frankdejonge.nl","name":"Frank de Jonge"},"license":"ISC","_id":"@deltic/service-dispatcher@0.2.2","maintainers":[{"name":"frankdejonge","email":"info@frankdejonge.nl"}],"homepage":"https://github.com/deltic-oss/deltic#readme","bugs":{"url":"https://github.com/deltic-oss/deltic/issues"},"dist":{"shasum":"5ea9d35cd9cab4d7cc4bab9d2c14cbb093aea971","tarball":"https://registry.npmjs.org/@deltic/service-dispatcher/-/service-dispatcher-0.2.2.tgz","fileCount":28,"integrity":"sha512-iCJFrSJ2VNCBQfMjpGL0c9Fzuy7FTzeET8C9P/0vXVreczhvylQsxbzCPObe7G/Ciy0Nup1RCVYSJa92pAPGHQ==","signatures":[{"sig":"MEUCIF7JrLZIN4yYn2qUjTqV/+sDXFdqMGB2vakHrLUnkfrAAiEAsodiJv2CtDmuKphb+T98TT/xXTIXBnN4jhdFPSO67Yg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32863},"type":"module","_from":"file:deltic-service-dispatcher-0.2.2.tgz","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs","require":"./dist/index.cjs","module-sync":"./dist/index.mjs"},"./test-tooling":{"types":"./dist/test-tooling.d.mts","import":"./dist/test-tooling.mjs","require":"./dist/test-tooling.cjs","module-sync":"./dist/test-tooling.mjs"},"./locking-decorator":{"types":"./dist/locking-decorator.d.mts","import":"./dist/locking-decorator.mjs","require":"./dist/locking-decorator.cjs","module-sync":"./dist/locking-decorator.mjs"},"./locking-middleware":{"types":"./dist/locking-middleware.d.mts","import":"./dist/locking-middleware.mjs","require":"./dist/locking-middleware.cjs","module-sync":"./dist/locking-middleware.mjs"},"./aggregate-service-dispatcher":{"types":"./dist/aggregate-service-dispatcher.d.mts","import":"./dist/aggregate-service-dispatcher.mjs","require":"./dist/aggregate-service-dispatcher.cjs","module-sync":"./dist/aggregate-service-dispatcher.mjs"}},"scripts":{},"_npmUser":{"name":"frankdejonge","email":"info@frankdejonge.nl"},"_resolved":"/private/var/folders/cf/f1s7n7kd3938zynwcqk8_2z00000gn/T/e36731277568089288fc4f0ab7355bd8/deltic-service-dispatcher-0.2.2.tgz","_integrity":"sha512-iCJFrSJ2VNCBQfMjpGL0c9Fzuy7FTzeET8C9P/0vXVreczhvylQsxbzCPObe7G/Ciy0Nup1RCVYSJa92pAPGHQ==","repository":{"url":"git+https://github.com/deltic-oss/deltic.git","type":"git","directory":"packages/service-layer"},"_npmVersion":"11.6.0","description":"A contract-based service abstraction","directories":{},"_nodeVersion":"24.8.0","_hasShrinkwrap":false,"devDependencies":{"fast-equals":"^5.3.3","@deltic/mutex":"^0.1.3","reflect-metadata":"^0.2.2","@deltic/event-sourcing":"^0.1.2"},"peerDependencies":{"fast-equals":"^5.3.2","@deltic/mutex":"^0.1.3","@deltic/event-sourcing":"^0.1.2"},"peerDependenciesMeta":{"fast-equals":{"optional":true},"@deltic/mutex":{"optional":true},"@deltic/event-sourcing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/service-dispatcher_0.2.2_1774454593326_0.02922085447426004","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@deltic/service-dispatcher","type":"module","version":"0.2.3","description":"A contract-based service abstraction","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.cjs","module-sync":"./dist/index.mjs","types":"./dist/index.d.mts"},"./test-tooling":{"import":"./dist/test-tooling.mjs","require":"./dist/test-tooling.cjs","module-sync":"./dist/test-tooling.mjs","types":"./dist/test-tooling.d.mts"},"./aggregate-service-dispatcher":{"import":"./dist/aggregate-service-dispatcher.mjs","require":"./dist/aggregate-service-dispatcher.cjs","module-sync":"./dist/aggregate-service-dispatcher.mjs","types":"./dist/aggregate-service-dispatcher.d.mts"},"./locking-middleware":{"import":"./dist/locking-middleware.mjs","require":"./dist/locking-middleware.cjs","module-sync":"./dist/locking-middleware.mjs","types":"./dist/locking-middleware.d.mts"},"./locking-decorator":{"import":"./dist/locking-decorator.mjs","require":"./dist/locking-decorator.cjs","module-sync":"./dist/locking-decorator.mjs","types":"./dist/locking-decorator.d.mts"}},"keywords":["service","dispatcher","command","middleware"],"author":{"name":"Frank de Jonge","url":"https://frankdejonge.nl"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/deltic-oss/deltic.git","directory":"packages/service-layer"},"peerDependencies":{"fast-equals":"^5.3.2 || ^6.0.0","@deltic/event-sourcing":"^0.1.3","@deltic/mutex":"^0.1.3"},"devDependencies":{"fast-equals":"^5.3.2 || ^6.0.0","reflect-metadata":"^0.2.2","@deltic/event-sourcing":"^0.1.3","@deltic/mutex":"^0.1.3"},"peerDependenciesMeta":{"@deltic/event-sourcing":{"optional":true},"@deltic/mutex":{"optional":true},"fast-equals":{"optional":true}},"scripts":{},"_id":"@deltic/service-dispatcher@0.2.3","bugs":{"url":"https://github.com/deltic-oss/deltic/issues"},"homepage":"https://github.com/deltic-oss/deltic#readme","_integrity":"sha512-RUmR0vz1y84xXTspqzZc48q4zPnbvJmjXxf9OmFd6fPnWiF2ZILl0l0lrAxTiJ0CpZCLQlq7M9lqsauzkZlb0g==","_resolved":"/private/var/folders/cf/f1s7n7kd3938zynwcqk8_2z00000gn/T/e00836dab523f3aa709b27cb2ce2faa9/deltic-service-dispatcher-0.2.3.tgz","_from":"file:deltic-service-dispatcher-0.2.3.tgz","_nodeVersion":"24.8.0","_npmVersion":"11.6.0","dist":{"integrity":"sha512-RUmR0vz1y84xXTspqzZc48q4zPnbvJmjXxf9OmFd6fPnWiF2ZILl0l0lrAxTiJ0CpZCLQlq7M9lqsauzkZlb0g==","shasum":"976ba01c641e479b7e5bd1a4355b1d755c9e16de","tarball":"https://registry.npmjs.org/@deltic/service-dispatcher/-/service-dispatcher-0.2.3.tgz","fileCount":28,"unpackedSize":32982,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCZ7hW4gfS2DAV94g4po3hUoI+697D13AizW+Jk+ljcOAIgFUSK/DrLfKyglQGn5cJ71gZpa4GcNy4lwTy1TQLB7Vw="}]},"_npmUser":{"name":"frankdejonge","email":"info@frankdejonge.nl"},"directories":{},"maintainers":[{"name":"frankdejonge","email":"info@frankdejonge.nl"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/service-dispatcher_0.2.3_1775721108370_0.13498042151530365"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-27T10:09:31.385Z","modified":"2026-04-09T07:51:48.655Z","0.1.0":"2025-10-27T10:09:31.695Z","0.2.0":"2026-03-25T14:47:08.968Z","0.2.1":"2026-03-25T15:57:07.628Z","0.2.2":"2026-03-25T16:03:13.481Z","0.2.3":"2026-04-09T07:51:48.512Z"},"bugs":{"url":"https://github.com/deltic-oss/deltic/issues"},"author":{"name":"Frank de Jonge","url":"https://frankdejonge.nl"},"license":"ISC","homepage":"https://github.com/deltic-oss/deltic#readme","keywords":["service","dispatcher","command","middleware"],"repository":{"type":"git","url":"git+https://github.com/deltic-oss/deltic.git","directory":"packages/service-layer"},"description":"A contract-based service abstraction","maintainers":[{"name":"frankdejonge","email":"info@frankdejonge.nl"}],"readme":"# @deltic/service-dispatcher\n\nA contract-based service dispatch abstraction with type-safe request/response mapping and middleware support.\n\n## Installation\n\n```bash\nnpm install @deltic/service-dispatcher\n```\n\n## Usage\n\n### Defining a Service\n\nDefine a service structure that maps command types to their payload and response:\n\n```typescript\nimport type {ServiceStructure} from '@deltic/service-dispatcher';\n\ntype UserService = ServiceStructure<{\n    createUser: {\n        payload: {name: string; email: string};\n        response: {id: string};\n    };\n    deleteUser: {\n        payload: {id: string};\n        response: void;\n    };\n}>;\n```\n\n### Dispatching Commands\n\n```typescript\nimport {ServiceDispatcher} from '@deltic/service-dispatcher';\n\nconst service = new ServiceDispatcher<UserService>({\n    createUser: async (payload) => {\n        const user = await userRepo.create(payload);\n        return {id: user.id};\n    },\n    deleteUser: async (payload) => {\n        await userRepo.delete(payload.id);\n    },\n});\n\nconst result = await service.handle({\n    type: 'createUser',\n    payload: {name: 'Alice', email: 'alice@example.com'},\n});\n// result: {id: '...'}\n```\n\n### Middleware\n\nAdd cross-cutting concerns via middleware:\n\n```typescript\nimport type {ServiceMiddleware} from '@deltic/service-dispatcher';\n\nconst loggingMiddleware: ServiceMiddleware<UserService> = async (input, next) => {\n    console.log(`Handling ${String(input.type)}`);\n    const result = await next(input);\n    console.log(`Completed ${String(input.type)}`);\n    return result;\n};\n\nconst service = new ServiceDispatcher<UserService>(handlers, [loggingMiddleware]);\n```\n\n### Locking Middleware\n\nPrevent concurrent execution of commands for the same resource:\n\n```typescript\nimport {createServiceLockingMiddleware} from '@deltic/service-dispatcher/locking-middleware';\n\nconst lockingMiddleware = createServiceLockingMiddleware<UserService, string>({\n    mutex,\n    lockResolver: (input) => input.payload.id,\n    timeoutMs: 5000,\n});\n\nconst service = new ServiceDispatcher<UserService>(handlers, [lockingMiddleware]);\n```\n\n### Locking Decorator\n\nAlternatively, wrap an entire service with locking:\n\n```typescript\nimport {ServiceLocking} from '@deltic/service-dispatcher/locking-decorator';\n\nconst lockedService = new ServiceLocking<UserService, string>(service, {\n    mutex,\n    lockResolver: (input) => input.payload.id,\n    shouldSkip: (input) => input.type === 'listUsers', // optional\n});\n```\n\n### Aggregate Service\n\nFor event-sourced aggregates, use the aggregate service dispatcher that auto-persists aggregates with unreleased events:\n\n```typescript\nimport {AggregateServiceDispatcher} from '@deltic/service-dispatcher/aggregate-service-dispatcher';\n\nconst service = new AggregateServiceDispatcher<UserService, UserStream>(\n    {\n        createUser: async (payload, aggregate) => {\n            aggregate.create(payload.name, payload.email);\n        },\n    },\n    aggregateRepository,\n    (input) => input.payload.id,\n);\n```\n\n## API Reference\n\n### `Service<S>` (interface)\n\n```typescript\ninterface Service<S> {\n    handle<T extends keyof S>(input: {type: T; payload: S[T]['payload']}): Promise<S[T]['response']>;\n}\n```\n\n### `ServiceDispatcher<S>`\n\nDispatches inputs to type-specific handlers through an optional middleware chain.\n\n```typescript\nnew ServiceDispatcher(handlers: ServiceHandlers<S>, middlewares?: ServiceMiddleware<S>[])\n```\n\n### `ServiceMiddleware<S>` (interface)\n\n```typescript\ninterface ServiceMiddleware<S> {\n    (input, next): Promise<response>;\n}\n```\n\n### `InputNotSupported`\n\nThrown when no handler is registered for the input type.\n\n## License\n\nISC\n","readmeFilename":"README.md"}