@owlmeans/client-entrypoint 0.1.18-rc.37 → 0.1.18-rc.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/client-entrypoint/SKILL.md +16 -1
- package/build/failure.d.ts +19 -0
- package/build/failure.d.ts.map +1 -0
- package/build/failure.js +25 -0
- package/build/failure.js.map +1 -0
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/utils/handler.d.ts.map +1 -1
- package/build/utils/handler.js +12 -3
- package/build/utils/handler.js.map +1 -1
- package/package.json +8 -8
- package/src/failure.ts +41 -0
- package/src/index.ts +1 -0
- package/src/utils/handler.ts +11 -3
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ re-exports of `@owlmeans/web-client` or `@owlmeans/web-panel`. Protocols are dec
|
|
|
10
10
|
## Installation
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
bun add @owlmeans/client-entrypoint@^0.1.18-rc.
|
|
13
|
+
bun add @owlmeans/client-entrypoint@^0.1.18-rc.39
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
## Concepts
|
|
@@ -204,7 +204,7 @@ This package ships embedded agent skills under `agent-meta/`. After installing y
|
|
|
204
204
|
your project's skill store (`.agents/skills/`):
|
|
205
205
|
|
|
206
206
|
```sh
|
|
207
|
-
npx @owlmeans/agent-skills@^0.1.18-rc.
|
|
207
|
+
npx @owlmeans/agent-skills@^0.1.18-rc.40
|
|
208
208
|
```
|
|
209
209
|
|
|
210
210
|
The embedded files are version-matched to this package release. Do not edit them
|
package/agent-meta/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"package": "@owlmeans/client-entrypoint",
|
|
4
|
-
"version": "0.1.18-rc.
|
|
5
|
-
"generatedAt": "2026-09-
|
|
4
|
+
"version": "0.1.18-rc.39",
|
|
5
|
+
"generatedAt": "2026-09-25T21:19:37.957Z",
|
|
6
6
|
"canonicalRepo": "https://github.com/owlmeans/common",
|
|
7
7
|
"entries": [
|
|
8
8
|
{
|
|
@@ -7,7 +7,7 @@ user-invocable: false
|
|
|
7
7
|
|
|
8
8
|
# @owlmeans/client-entrypoint
|
|
9
9
|
|
|
10
|
-
**Install:** `bun add @owlmeans/client-entrypoint@^0.1.18-rc.
|
|
10
|
+
**Install:** `bun add @owlmeans/client-entrypoint@^0.1.18-rc.39`
|
|
11
11
|
|
|
12
12
|
Bind a declaration from `@owlmeans/entrypoint`; never construct or replace a contextual
|
|
13
13
|
entrypoint by alias.
|
|
@@ -29,6 +29,15 @@ types. `bind(protocol)` is appropriate where one protocol must use a distinct cl
|
|
|
29
29
|
`bindScreen` is for a frontend route and renderer; screens are addressed by `url` and reject
|
|
30
30
|
`call`/`invoke`.
|
|
31
31
|
|
|
32
|
+
`bindScreen` takes a `lazyHandler(...)` result (`@owlmeans/client`) directly, the same as
|
|
33
|
+
`handler(Component)`: both return a `RefedEntrypointHandler`, the lazy one also carrying
|
|
34
|
+
`.preload()`, so no different wiring is needed. Create it at module scope, never in a render.
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
const reports = lazyHandler(() => import('./reports.js'), 'Reports', { fallback: <Spinner /> })
|
|
38
|
+
context.registerEntrypoint(bindScreen(projectProtocols.reports, reports))
|
|
39
|
+
```
|
|
40
|
+
|
|
32
41
|
`context.entrypoint(protocol)` derives `ClientProtocolEntrypoint<Protocol>` from the protocol. Do
|
|
33
42
|
not add an explicit result generic. `entrypointRef<Request, Response>(alias)` is reserved for a
|
|
34
43
|
dynamic remote declaration that cannot be imported.
|
|
@@ -36,3 +45,9 @@ dynamic remote declaration that cannot be imported.
|
|
|
36
45
|
Client calls include only contract request sections plus `CallOptions` (`auth`, host/port/base,
|
|
37
46
|
timeout, signal). `url` accepts params/query plus the same address options. The route transport is
|
|
38
47
|
chosen by the declaration; callers do not branch for HTTP, socket, or queue.
|
|
48
|
+
|
|
49
|
+
`ensureEntrypointFailureService(context)` returns the context-local failure plugin host. Register
|
|
50
|
+
an `onFailure` plugin there to observe a rejected remote `invoke`/`call`, show a toast, or collect
|
|
51
|
+
diagnostics. Plugins run after the transport fails and the original error is still rethrown to
|
|
52
|
+
the caller. This is the opt-in seam for application-wide failure UI; keep the transport independent
|
|
53
|
+
of the chosen toast library.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BasicContext, LazyService } from '@owlmeans/context';
|
|
2
|
+
import type { AbstractRequest } from '@owlmeans/entrypoint';
|
|
3
|
+
export declare const ENTRYPOINT_FAILURE_SERVICE = "client-entrypoint:failure";
|
|
4
|
+
export interface EntrypointFailure {
|
|
5
|
+
alias: string;
|
|
6
|
+
request: AbstractRequest;
|
|
7
|
+
error: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface EntrypointFailurePlugin {
|
|
10
|
+
alias: string;
|
|
11
|
+
onFailure: (failure: EntrypointFailure) => void | Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export interface EntrypointFailureService extends LazyService {
|
|
14
|
+
registerPlugin: (plugin: EntrypointFailurePlugin) => void;
|
|
15
|
+
notify: (failure: EntrypointFailure) => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/** Context-local observers for rejected client calls; observers never replace the thrown error. */
|
|
18
|
+
export declare const ensureEntrypointFailureService: (ctx: BasicContext<any>) => EntrypointFailureService;
|
|
19
|
+
//# sourceMappingURL=failure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure.d.ts","sourceRoot":"","sources":["../src/failure.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,eAAO,MAAM,0BAA0B,8BAA8B,CAAA;AAErE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,eAAe,CAAA;IACxB,KAAK,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAChE;AAED,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,cAAc,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,IAAI,CAAA;IACzD,MAAM,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACtD;AAED,mGAAmG;AACnG,eAAO,MAAM,8BAA8B,QAAS,YAAY,CAAC,GAAG,CAAC,KAAG,wBAiBvE,CAAA"}
|
package/build/failure.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createLazyService } from '@owlmeans/context';
|
|
2
|
+
export const ENTRYPOINT_FAILURE_SERVICE = 'client-entrypoint:failure';
|
|
3
|
+
/** Context-local observers for rejected client calls; observers never replace the thrown error. */
|
|
4
|
+
export const ensureEntrypointFailureService = (ctx) => {
|
|
5
|
+
if (ctx.hasService(ENTRYPOINT_FAILURE_SERVICE)) {
|
|
6
|
+
return ctx.service(ENTRYPOINT_FAILURE_SERVICE);
|
|
7
|
+
}
|
|
8
|
+
const plugins = new Map();
|
|
9
|
+
const service = createLazyService(ENTRYPOINT_FAILURE_SERVICE, {
|
|
10
|
+
registerPlugin: plugin => { plugins.set(plugin.alias, plugin); },
|
|
11
|
+
notify: async (failure) => {
|
|
12
|
+
for (const plugin of plugins.values()) {
|
|
13
|
+
try {
|
|
14
|
+
await plugin.onFailure(failure);
|
|
15
|
+
}
|
|
16
|
+
catch (cause) {
|
|
17
|
+
console.warn('Entrypoint failure observer failed', cause);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
ctx.registerService(service);
|
|
23
|
+
return service;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=failure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure.js","sourceRoot":"","sources":["../src/failure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAIrD,MAAM,CAAC,MAAM,0BAA0B,GAAG,2BAA2B,CAAA;AAkBrE,mGAAmG;AACnG,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,GAAsB,EAA4B,EAAE;IACjG,IAAI,GAAG,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE,CAAC;QAC/C,OAAO,GAAG,CAAC,OAAO,CAA2B,0BAA0B,CAAC,CAAA;IAC1E,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmC,CAAA;IAC1D,MAAM,OAAO,GAAG,iBAAiB,CAA2B,0BAA0B,EAAE;QACtF,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA,CAAC,CAAC;QAC/D,MAAM,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;YACtB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtC,IAAI,CAAC;oBAAC,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;gBAAC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACrD,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAA;gBAC3D,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC,CAAA;IACF,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IAC5B,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
|
package/build/index.d.ts
CHANGED
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA"}
|
package/build/index.js
CHANGED
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/utils/handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAuB,MAAM,sBAAsB,CAAA;AAEnG,OAAO,KAAK,EAAoB,gBAAgB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/utils/handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAuB,MAAM,sBAAsB,CAAA;AAEnG,OAAO,KAAK,EAAoB,gBAAgB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAalJ,eAAO,MAAM,UAAU,EAAE,CACvB,CAAC,EAAE,CAAC,SAAS,eAAe,GAAG,eAAe,EAC9C,GAAG,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,iBAoC9B,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,CACtB,CAAC,EAAE,CAAC,SAAS,eAAe,GAAG,eAAe,EAC9C,GAAG,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,uBAAuB,KAAK,gBAAgB,CAAC,CAAC,EAAE,CAAC,CA8DvD,CAAA;AAE7B,eAAO,MAAM,aAAa,EAAE,CAC1B,CAAC,EAAE,CAAC,SAAS,aAAa,GAAG,aAAa,EAC1C,GAAG,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,oBAAoB,KAAK,OAAO,CAAC,MAAM,CAmC3F,CAAA"}
|
package/build/utils/handler.js
CHANGED
|
@@ -6,6 +6,7 @@ import { PARAM, RouteMethod, RouteProtocols } from '@owlmeans/route';
|
|
|
6
6
|
import { stringify } from 'qs';
|
|
7
7
|
import { assertContext } from '@owlmeans/context';
|
|
8
8
|
import { makeSecurityHelper } from '@owlmeans/config';
|
|
9
|
+
import { ENTRYPOINT_FAILURE_SERVICE } from '../failure.js';
|
|
9
10
|
export const apiHandler = (ref) => async (req, res) => {
|
|
10
11
|
const location = `client-entrypoint:api-handler:${ref.ref?.alias}`;
|
|
11
12
|
const context = assertContext(ref.ref?.ctx, location);
|
|
@@ -81,9 +82,17 @@ export const apiInvoke = (ref, opts) => (async (req) => {
|
|
|
81
82
|
if (ctx == null && ep.ctx == null) {
|
|
82
83
|
throw new SyntaxError(`Use entrypoint ${ep.alias} without context`);
|
|
83
84
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
try {
|
|
86
|
+
await apiHandler(ref)(request, reply);
|
|
87
|
+
if (reply.error != null)
|
|
88
|
+
throw reply.error;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (ctx.hasService(ENTRYPOINT_FAILURE_SERVICE)) {
|
|
92
|
+
await ctx.service(ENTRYPOINT_FAILURE_SERVICE)
|
|
93
|
+
.notify({ alias: ep.alias, request, error });
|
|
94
|
+
}
|
|
95
|
+
throw error;
|
|
87
96
|
}
|
|
88
97
|
return { value: reply.value ?? null, outcome: reply.outcome ?? EntrypointOutcome.Ok };
|
|
89
98
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/utils/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAGrD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEzF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/utils/handler.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@owlmeans/client-entrypoint",
|
|
3
|
-
"version": "0.1.18-rc.
|
|
3
|
+
"version": "0.1.18-rc.39",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -28,14 +28,14 @@
|
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@owlmeans/api": "^0.1.18-rc.
|
|
32
|
-
"@owlmeans/client-config": "^0.1.18-rc.
|
|
33
|
-
"@owlmeans/client-context": "^0.1.18-rc.
|
|
34
|
-
"@owlmeans/client-route": "^0.1.18-rc.
|
|
35
|
-
"@owlmeans/config": "^0.1.18-rc.
|
|
31
|
+
"@owlmeans/api": "^0.1.18-rc.39",
|
|
32
|
+
"@owlmeans/client-config": "^0.1.18-rc.38",
|
|
33
|
+
"@owlmeans/client-context": "^0.1.18-rc.40",
|
|
34
|
+
"@owlmeans/client-route": "^0.1.18-rc.40",
|
|
35
|
+
"@owlmeans/config": "^0.1.18-rc.38",
|
|
36
36
|
"@owlmeans/context": "^0.1.18-rc.32",
|
|
37
|
-
"@owlmeans/entrypoint": "^0.1.18-rc.
|
|
38
|
-
"@owlmeans/error": "^0.1.18-rc.
|
|
37
|
+
"@owlmeans/entrypoint": "^0.1.18-rc.37",
|
|
38
|
+
"@owlmeans/error": "^0.1.18-rc.36",
|
|
39
39
|
"@owlmeans/route": "^0.1.18-rc.33",
|
|
40
40
|
"ajv-formats": "^3.0.1",
|
|
41
41
|
"qs": "^6.13.0"
|
package/src/failure.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createLazyService } from '@owlmeans/context'
|
|
2
|
+
import type { BasicContext, LazyService } from '@owlmeans/context'
|
|
3
|
+
import type { AbstractRequest } from '@owlmeans/entrypoint'
|
|
4
|
+
|
|
5
|
+
export const ENTRYPOINT_FAILURE_SERVICE = 'client-entrypoint:failure'
|
|
6
|
+
|
|
7
|
+
export interface EntrypointFailure {
|
|
8
|
+
alias: string
|
|
9
|
+
request: AbstractRequest
|
|
10
|
+
error: unknown
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface EntrypointFailurePlugin {
|
|
14
|
+
alias: string
|
|
15
|
+
onFailure: (failure: EntrypointFailure) => void | Promise<void>
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface EntrypointFailureService extends LazyService {
|
|
19
|
+
registerPlugin: (plugin: EntrypointFailurePlugin) => void
|
|
20
|
+
notify: (failure: EntrypointFailure) => Promise<void>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Context-local observers for rejected client calls; observers never replace the thrown error. */
|
|
24
|
+
export const ensureEntrypointFailureService = (ctx: BasicContext<any>): EntrypointFailureService => {
|
|
25
|
+
if (ctx.hasService(ENTRYPOINT_FAILURE_SERVICE)) {
|
|
26
|
+
return ctx.service<EntrypointFailureService>(ENTRYPOINT_FAILURE_SERVICE)
|
|
27
|
+
}
|
|
28
|
+
const plugins = new Map<string, EntrypointFailurePlugin>()
|
|
29
|
+
const service = createLazyService<EntrypointFailureService>(ENTRYPOINT_FAILURE_SERVICE, {
|
|
30
|
+
registerPlugin: plugin => { plugins.set(plugin.alias, plugin) },
|
|
31
|
+
notify: async failure => {
|
|
32
|
+
for (const plugin of plugins.values()) {
|
|
33
|
+
try { await plugin.onFailure(failure) } catch (cause) {
|
|
34
|
+
console.warn('Entrypoint failure observer failed', cause)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
ctx.registerService(service)
|
|
40
|
+
return service
|
|
41
|
+
}
|
package/src/index.ts
CHANGED
package/src/utils/handler.ts
CHANGED
|
@@ -10,6 +10,8 @@ import { PARAM, RouteMethod, RouteProtocols } from '@owlmeans/route'
|
|
|
10
10
|
import { stringify } from 'qs'
|
|
11
11
|
import { assertContext } from '@owlmeans/context'
|
|
12
12
|
import { makeSecurityHelper } from '@owlmeans/config'
|
|
13
|
+
import { ENTRYPOINT_FAILURE_SERVICE } from '../failure.js'
|
|
14
|
+
import type { EntrypointFailureService } from '../failure.js'
|
|
13
15
|
|
|
14
16
|
type Config = ClientConfig
|
|
15
17
|
interface Context<C extends Config = Config> extends ClientContext<C> { }
|
|
@@ -106,9 +108,15 @@ export const apiInvoke: <
|
|
|
106
108
|
if (ctx == null && ep.ctx == null) {
|
|
107
109
|
throw new SyntaxError(`Use entrypoint ${ep.alias} without context`)
|
|
108
110
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
throw reply.error
|
|
111
|
+
try {
|
|
112
|
+
await apiHandler(ref)(request, reply)
|
|
113
|
+
if (reply.error != null) throw reply.error
|
|
114
|
+
} catch (error) {
|
|
115
|
+
if (ctx.hasService(ENTRYPOINT_FAILURE_SERVICE)) {
|
|
116
|
+
await ctx.service<EntrypointFailureService>(ENTRYPOINT_FAILURE_SERVICE)
|
|
117
|
+
.notify({ alias: ep.alias, request, error })
|
|
118
|
+
}
|
|
119
|
+
throw error
|
|
112
120
|
}
|
|
113
121
|
|
|
114
122
|
return { value: reply.value ?? null, outcome: reply.outcome ?? EntrypointOutcome.Ok }
|