@push-rpc/next 2.0.13 → 2.0.15
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/dist/client/HttpClient.js +1 -1
- package/dist/client/HttpClient.js.map +1 -1
- package/dist/server/http.d.ts +1 -1
- package/dist/server/http.js +7 -3
- package/dist/server/http.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
- package/src/client/HttpClient.ts +5 -4
- package/src/server/http.ts +11 -6
- package/src/server/index.ts +9 -9
|
@@ -43,7 +43,7 @@ class HttpClient {
|
|
|
43
43
|
const text = await response.text();
|
|
44
44
|
const res = contentType && contentType.includes("application/json") ? (0, json_js_1.safeParseJson)(text) : text;
|
|
45
45
|
if (response.status < 200 || response.status >= 300) {
|
|
46
|
-
const error = new Error(response.
|
|
46
|
+
const error = new Error(response.headers.get("x-error") ?? undefined);
|
|
47
47
|
Object.assign(error, { code: response.status });
|
|
48
48
|
if (typeof res == "object") {
|
|
49
49
|
Object.assign(error, res);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../src/client/HttpClient.ts"],"names":[],"mappings":";;;AAAA,sCAAqD;AACrD,8CAA6D;AAE7D,MAAa,UAAU;IACrB,YACU,GAAW,EACX,QAAgB,EAChB,UAAiD;QAFjD,QAAG,GAAH,GAAG,CAAQ;QACX,aAAQ,GAAR,QAAQ,CAAQ;QAChB,eAAU,GAAV,UAAU,CAAuC;
|
|
1
|
+
{"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../src/client/HttpClient.ts"],"names":[],"mappings":";;;AAAA,sCAAqD;AACrD,8CAA6D;AAE7D,MAAa,UAAU;IACrB,YACU,GAAW,EACX,QAAgB,EAChB,UAAiD;QAFjD,QAAG,GAAH,GAAG,CAAQ;QACX,aAAQ,GAAR,QAAQ,CAAQ;QAChB,eAAU,GAAV,UAAU,CAAuC;IAE3D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,MAAiB,EAAE,WAAmB;QACjE,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;IACzF,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,MAAiB,EAAE,WAAmB;QACtE,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;IACxF,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,MAAiB,EAAE,WAAmB;QACxE,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;IACzF,CAAC;IAEO,UAAU,CAAC,QAAgB;QACjC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAA;IAClC,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,MAAgC,EAChC,QAAgB,EAChB,MAAiB,EACjB,WAAmB,EACnB,OAA+B;QAE/B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QAEzC,IAAI,CAAC;YACH,MAAM,EAAC,MAAM,EAAE,QAAQ,EAAC,GAAG,aAAa,CAAC,WAAW,CAAC,CAAA;YAErD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;gBACpC,MAAM;gBACN,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,CAAC,yBAAgB,CAAC,EAAE,IAAI,CAAC,QAAQ;oBACjC,GAAG,OAAO;iBACX;gBACD,IAAI,EAAE,IAAA,uBAAa,EAAC,MAAM,CAAC;gBAC3B,MAAM;aACP,CAAC,CAAA;YAEF,QAAQ,EAAE,CAAA;YAEV,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBAC3B,OAAM;YACR,CAAC;YAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;YAExD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAElC,MAAM,GAAG,GACP,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAA,uBAAa,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAEtF,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBACpD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,CAAA;gBAErE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAC,CAAC,CAAA;gBAE7C,IAAI,OAAO,GAAG,IAAI,QAAQ,EAAE,CAAC;oBAC3B,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;gBAC3B,CAAC;gBAED,MAAM,KAAK,CAAA;YACb,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,CAAA;YACZ,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBACvC,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,IAAI,UAAU,OAAO,EAAE,CAAA;YAChD,CAAC;YAED,IAAI,CAAC,CAAC,OAAO,IAAI,cAAc,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBAC3C,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;YACb,CAAC;YACD,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClD,oCAAoC;gBACpC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA;gBAClC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAC,IAAI,EAAE,kBAAS,CAAC,OAAO,EAAC,CAAC,CAAA;gBAC/C,MAAM,KAAK,CAAA;YACb,CAAC;YACD,MAAM,CAAC,CAAA;QACT,CAAC;IACH,CAAC;CACF;AA1FD,gCA0FC;AAED,sCAAsC;AACtC,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAEnF,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC;KACtC,CAAA;AACH,CAAC"}
|
package/dist/server/http.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { IncomingMessage, ServerResponse } from "http";
|
|
3
3
|
import { RpcConnectionContext } from "../rpc.js";
|
|
4
|
-
export declare function serveHttpRequest(req: IncomingMessage, res: ServerResponse, path: string, hooks: HttpServerHooks, createConnectionContext: (req: IncomingMessage) => Promise<RpcConnectionContext>): Promise<void>;
|
|
4
|
+
export declare function serveHttpRequest(req: IncomingMessage, res: ServerResponse, path: string, hooks: HttpServerHooks, createConnectionContext: (req: IncomingMessage, res: ServerResponse) => Promise<RpcConnectionContext>): Promise<void>;
|
|
5
5
|
export type HttpServerHooks = {
|
|
6
6
|
call(ctx: RpcConnectionContext, itemName: string, parameters: unknown[]): Promise<unknown>;
|
|
7
7
|
subscribe(clientId: RpcConnectionContext, itemName: string, parameters: unknown[]): Promise<unknown>;
|
package/dist/server/http.js
CHANGED
|
@@ -9,7 +9,7 @@ async function serveHttpRequest(req, res, path, hooks, createConnectionContext)
|
|
|
9
9
|
// oherwise just handle request
|
|
10
10
|
if (req.url?.startsWith(path)) {
|
|
11
11
|
try {
|
|
12
|
-
const ctx = await createConnectionContext(req);
|
|
12
|
+
const ctx = await createConnectionContext(req, res);
|
|
13
13
|
const itemName = req.url.slice(path.length + 1);
|
|
14
14
|
const isJson = req.headers["content-type"]?.includes("application/json") ?? false;
|
|
15
15
|
const textBody = await readBody(req);
|
|
@@ -51,7 +51,9 @@ async function serveHttpRequest(req, res, path, hooks, createConnectionContext)
|
|
|
51
51
|
catch (e) {
|
|
52
52
|
if (e.code) {
|
|
53
53
|
res.statusCode = e.code;
|
|
54
|
-
|
|
54
|
+
if (e.message) {
|
|
55
|
+
res.setHeader("X-Error", e["message"]);
|
|
56
|
+
}
|
|
55
57
|
const { code, message, stack, ...rest } = e;
|
|
56
58
|
if (Object.keys(rest).length > 0) {
|
|
57
59
|
res.setHeader("Content-Type", "application/json");
|
|
@@ -63,7 +65,9 @@ async function serveHttpRequest(req, res, path, hooks, createConnectionContext)
|
|
|
63
65
|
else {
|
|
64
66
|
logger_js_1.log.warn(`Error in ${req.url}.`, e);
|
|
65
67
|
res.statusCode = 500;
|
|
66
|
-
|
|
68
|
+
if (e["message"]) {
|
|
69
|
+
res.setHeader("X-Error", e["message"]);
|
|
70
|
+
}
|
|
67
71
|
res.end();
|
|
68
72
|
return;
|
|
69
73
|
}
|
package/dist/server/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":";;;AAGA,8CAA6D;AAC7D,4CAAgC;AAChC,kDAAoD;AAE7C,KAAK,UAAU,gBAAgB,CACpC,GAAoB,EACpB,GAAmB,EACnB,IAAY,EACZ,KAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":";;;AAGA,8CAA6D;AAC7D,4CAAgC;AAChC,kDAAoD;AAE7C,KAAK,UAAU,gBAAgB,CACpC,GAAoB,EACpB,GAAmB,EACnB,IAAY,EACZ,KAAsB,EACtB,uBAAqG;IAErG,qDAAqD;IACrD,+BAA+B;IAE/B,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,uBAAuB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YAEnD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YAE/C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAA;YACjF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAA;YACpC,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAA,uBAAa,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YAE9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;YACf,CAAC;YAED,IAAI,MAAe,CAAA;YACnB,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;gBACnB,KAAK,MAAM;oBACT,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;oBAC9C,MAAK;gBACP,KAAK,KAAK;oBACR,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;oBACnD,MAAK;gBACP,KAAK,OAAO;oBACV,MAAM,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;oBACrD,MAAK;gBACP;oBACE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;oBACpB,GAAG,CAAC,GAAG,EAAE,CAAA;oBACT,OAAM;YACV,CAAC;YAED,IAAI,OAAO,MAAM,IAAI,WAAW,EAAE,CAAC;gBACjC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;gBACpB,GAAG,CAAC,GAAG,EAAE,CAAA;gBACT,OAAM;YACR,CAAC;YAED,IAAI,OAAO,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAA;gBAC3C,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBACjB,GAAG,CAAC,GAAG,EAAE,CAAA;gBACT,OAAM;YACR,CAAC;YAED,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;YACjD,GAAG,CAAC,KAAK,CAAC,IAAA,uBAAa,EAAC,MAAM,CAAC,CAAC,CAAA;YAChC,GAAG,CAAC,GAAG,EAAE,CAAA;QACX,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACX,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAA;gBAEvB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;oBACd,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;gBACxC,CAAC;gBACD,MAAM,EAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,EAAC,GAAG,CAAC,CAAA;gBACzC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;oBACjD,GAAG,CAAC,KAAK,CAAC,IAAA,uBAAa,EAAC,IAAI,CAAC,CAAC,CAAA;gBAChC,CAAC;gBACD,GAAG,CAAC,GAAG,EAAE,CAAA;gBACT,OAAM;YACR,CAAC;iBAAM,CAAC;gBACN,eAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAA;gBAEnC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;gBACpB,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;oBACjB,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;gBACxC,CAAC;gBACD,GAAG,CAAC,GAAG,EAAE,CAAA;gBACT,OAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAnFD,4CAmFC;AAED,SAAS,QAAQ,CAAC,GAAyB;IACzC,MAAM,YAAY,GAAG,IAAA,6BAAiB,EAAC,GAAG,CAAC,CAAA;IAE3C,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;QAC1B,CAAC,CAAC,CAAA;QACF,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAC1B,OAAO,CAAC,IAAI,CAAC,CAAA;QACf,CAAC,CAAC,CAAA;QACF,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAU,EAAE,EAAE;YACtC,MAAM,CAAC,KAAK,CAAC,CAAA;QACf,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { RpcConnectionContext, RpcContext, Services } from "../rpc.js";
|
|
3
3
|
import { ServicesWithTriggers } from "./local.js";
|
|
4
4
|
import { Middleware } from "../utils/middleware.js";
|
|
5
|
-
import http, { IncomingMessage } from "http";
|
|
5
|
+
import http, { IncomingMessage, ServerResponse } from "http";
|
|
6
6
|
import { HttpServerHooks } from "./http";
|
|
7
7
|
export declare function publishServices<S extends Services<S>, C extends RpcContext>(services: S, overrideOptions: Partial<PublishServicesOptions<C>> & ({
|
|
8
8
|
port: number;
|
|
@@ -23,7 +23,7 @@ export type PublishServicesOptions<C extends RpcContext> = {
|
|
|
23
23
|
middleware: Middleware<C>[];
|
|
24
24
|
pingInterval: number;
|
|
25
25
|
subscriptions: boolean;
|
|
26
|
-
createConnectionContext(req: IncomingMessage): Promise<RpcConnectionContext>;
|
|
26
|
+
createConnectionContext(req: IncomingMessage, res: ServerResponse): Promise<RpcConnectionContext>;
|
|
27
27
|
createServerHooks?(hooks: HttpServerHooks, req: IncomingMessage): HttpServerHooks;
|
|
28
28
|
} & ({
|
|
29
29
|
server: http.Server;
|
package/dist/server/index.js
CHANGED
|
@@ -23,7 +23,7 @@ const defaultOptions = {
|
|
|
23
23
|
middleware: [],
|
|
24
24
|
pingInterval: 30 * 1000, // should be in-sync with client
|
|
25
25
|
subscriptions: true,
|
|
26
|
-
async createConnectionContext(req) {
|
|
26
|
+
async createConnectionContext(req, res) {
|
|
27
27
|
const header = req.headers[rpc_js_1.CLIENT_ID_HEADER];
|
|
28
28
|
return {
|
|
29
29
|
clientId: (Array.isArray(header) ? header[0] : header) || "anon",
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;AAAA,sCAAsF;AAGtF,yDAAgD;AAIzC,KAAK,UAAU,eAAe,CACnC,QAAW,EACX,eAA8F;IAM9F,MAAM,OAAO,GAAG;QACd,GAAG,cAAc;QACjB,GAAG,eAAe;KACnB,CAAA;IAED,MAAM,SAAS,GAAG,IAAI,gCAAa,CAAO,QAAQ,EAAE,OAAO,CAAC,CAAA;IAE5D,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;IAEvB,OAAO;QACL,QAAQ,EAAE,SAAS,CAAC,0BAA0B,EAAE;QAChD,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS,CAAC,UAAU;KACjC,CAAA;AACH,CAAC;AAtBD,0CAsBC;AA0BD,MAAM,cAAc,GAAqD;IACvE,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,SAAS;IACf,UAAU,EAAE,EAAE;IACd,YAAY,EAAE,EAAE,GAAG,IAAI,EAAE,gCAAgC;IACzD,aAAa,EAAE,IAAI;IAEnB,KAAK,CAAC,uBAAuB,CAAC,GAAoB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;AAAA,sCAAsF;AAGtF,yDAAgD;AAIzC,KAAK,UAAU,eAAe,CACnC,QAAW,EACX,eAA8F;IAM9F,MAAM,OAAO,GAAG;QACd,GAAG,cAAc;QACjB,GAAG,eAAe;KACnB,CAAA;IAED,MAAM,SAAS,GAAG,IAAI,gCAAa,CAAO,QAAQ,EAAE,OAAO,CAAC,CAAA;IAE5D,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;IAEvB,OAAO;QACL,QAAQ,EAAE,SAAS,CAAC,0BAA0B,EAAE;QAChD,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS,CAAC,UAAU;KACjC,CAAA;AACH,CAAC;AAtBD,0CAsBC;AA0BD,MAAM,cAAc,GAAqD;IACvE,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,SAAS;IACf,UAAU,EAAE,EAAE;IACd,YAAY,EAAE,EAAE,GAAG,IAAI,EAAE,gCAAgC;IACzD,aAAa,EAAE,IAAI;IAEnB,KAAK,CAAC,uBAAuB,CAAC,GAAoB,EAAE,GAAmB;QACrE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,yBAAgB,CAAC,CAAA;QAE5C,OAAO;YACL,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM;SACjE,CAAA;IACH,CAAC;CACF,CAAA"}
|
package/package.json
CHANGED
package/src/client/HttpClient.ts
CHANGED
|
@@ -5,8 +5,9 @@ export class HttpClient {
|
|
|
5
5
|
constructor(
|
|
6
6
|
private url: string,
|
|
7
7
|
private clientId: string,
|
|
8
|
-
private getHeaders: () => Promise<Record<string, string
|
|
9
|
-
) {
|
|
8
|
+
private getHeaders: () => Promise<Record<string, string>>,
|
|
9
|
+
) {
|
|
10
|
+
}
|
|
10
11
|
|
|
11
12
|
async call(itemName: string, params: unknown[], callTimeout: number): Promise<unknown> {
|
|
12
13
|
return this.httpRequest("POST", itemName, params, callTimeout, await this.getHeaders())
|
|
@@ -29,7 +30,7 @@ export class HttpClient {
|
|
|
29
30
|
itemName: string,
|
|
30
31
|
params: unknown[],
|
|
31
32
|
callTimeout: number,
|
|
32
|
-
headers: Record<string, string
|
|
33
|
+
headers: Record<string, string>,
|
|
33
34
|
): Promise<unknown> {
|
|
34
35
|
const itemUrl = this.getItemUrl(itemName)
|
|
35
36
|
|
|
@@ -61,7 +62,7 @@ export class HttpClient {
|
|
|
61
62
|
contentType && contentType.includes("application/json") ? safeParseJson(text) : text
|
|
62
63
|
|
|
63
64
|
if (response.status < 200 || response.status >= 300) {
|
|
64
|
-
const error = new Error(response.
|
|
65
|
+
const error = new Error(response.headers.get("x-error") ?? undefined)
|
|
65
66
|
|
|
66
67
|
Object.assign(error, {code: response.status})
|
|
67
68
|
|
package/src/server/http.ts
CHANGED
|
@@ -10,14 +10,14 @@ export async function serveHttpRequest(
|
|
|
10
10
|
res: ServerResponse,
|
|
11
11
|
path: string,
|
|
12
12
|
hooks: HttpServerHooks,
|
|
13
|
-
createConnectionContext: (req: IncomingMessage) => Promise<RpcConnectionContext
|
|
13
|
+
createConnectionContext: (req: IncomingMessage, res: ServerResponse) => Promise<RpcConnectionContext>,
|
|
14
14
|
) {
|
|
15
15
|
// if port is in options - response 404 on other URLs
|
|
16
16
|
// oherwise just handle request
|
|
17
17
|
|
|
18
18
|
if (req.url?.startsWith(path)) {
|
|
19
19
|
try {
|
|
20
|
-
const ctx = await createConnectionContext(req)
|
|
20
|
+
const ctx = await createConnectionContext(req, res)
|
|
21
21
|
|
|
22
22
|
const itemName = req.url.slice(path.length + 1)
|
|
23
23
|
|
|
@@ -65,7 +65,10 @@ export async function serveHttpRequest(
|
|
|
65
65
|
} catch (e: any) {
|
|
66
66
|
if (e.code) {
|
|
67
67
|
res.statusCode = e.code
|
|
68
|
-
|
|
68
|
+
|
|
69
|
+
if (e.message) {
|
|
70
|
+
res.setHeader("X-Error", e["message"])
|
|
71
|
+
}
|
|
69
72
|
const {code, message, stack, ...rest} = e
|
|
70
73
|
if (Object.keys(rest).length > 0) {
|
|
71
74
|
res.setHeader("Content-Type", "application/json")
|
|
@@ -77,7 +80,9 @@ export async function serveHttpRequest(
|
|
|
77
80
|
log.warn(`Error in ${req.url}.`, e)
|
|
78
81
|
|
|
79
82
|
res.statusCode = 500
|
|
80
|
-
|
|
83
|
+
if (e["message"]) {
|
|
84
|
+
res.setHeader("X-Error", e["message"])
|
|
85
|
+
}
|
|
81
86
|
res.end()
|
|
82
87
|
return
|
|
83
88
|
}
|
|
@@ -107,11 +112,11 @@ export type HttpServerHooks = {
|
|
|
107
112
|
subscribe(
|
|
108
113
|
clientId: RpcConnectionContext,
|
|
109
114
|
itemName: string,
|
|
110
|
-
parameters: unknown[]
|
|
115
|
+
parameters: unknown[],
|
|
111
116
|
): Promise<unknown>
|
|
112
117
|
unsubscribe(
|
|
113
118
|
clientId: RpcConnectionContext,
|
|
114
119
|
itemName: string,
|
|
115
|
-
parameters: unknown[]
|
|
120
|
+
parameters: unknown[],
|
|
116
121
|
): Promise<unknown>
|
|
117
122
|
}
|
package/src/server/index.ts
CHANGED
|
@@ -2,12 +2,12 @@ import {CLIENT_ID_HEADER, RpcConnectionContext, RpcContext, Services} from "../r
|
|
|
2
2
|
import {ServicesWithTriggers} from "./local.js"
|
|
3
3
|
import {Middleware} from "../utils/middleware.js"
|
|
4
4
|
import {RpcServerImpl} from "./RpcServerImpl.js"
|
|
5
|
-
import http, {IncomingMessage} from "http"
|
|
5
|
+
import http, {IncomingMessage, ServerResponse} from "http"
|
|
6
6
|
import {HttpServerHooks} from "./http"
|
|
7
7
|
|
|
8
8
|
export async function publishServices<S extends Services<S>, C extends RpcContext>(
|
|
9
9
|
services: S,
|
|
10
|
-
overrideOptions: Partial<PublishServicesOptions<C>> & ({port: number} | {server: http.Server})
|
|
10
|
+
overrideOptions: Partial<PublishServicesOptions<C>> & ({port: number} | {server: http.Server}),
|
|
11
11
|
): Promise<{
|
|
12
12
|
server: RpcServer
|
|
13
13
|
services: ServicesWithTriggers<S>
|
|
@@ -41,17 +41,17 @@ export type PublishServicesOptions<C extends RpcContext> = {
|
|
|
41
41
|
middleware: Middleware<C>[]
|
|
42
42
|
pingInterval: number
|
|
43
43
|
subscriptions: boolean
|
|
44
|
-
createConnectionContext(req: IncomingMessage): Promise<RpcConnectionContext>
|
|
44
|
+
createConnectionContext(req: IncomingMessage, res: ServerResponse): Promise<RpcConnectionContext>
|
|
45
45
|
createServerHooks?(hooks: HttpServerHooks, req: IncomingMessage): HttpServerHooks
|
|
46
46
|
} & (
|
|
47
47
|
| {
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
server: http.Server
|
|
49
|
+
}
|
|
50
50
|
| {
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
port: number
|
|
52
|
+
}
|
|
53
53
|
| {}
|
|
54
|
-
)
|
|
54
|
+
)
|
|
55
55
|
|
|
56
56
|
const defaultOptions: Omit<PublishServicesOptions<RpcContext>, "port"> = {
|
|
57
57
|
path: "",
|
|
@@ -60,7 +60,7 @@ const defaultOptions: Omit<PublishServicesOptions<RpcContext>, "port"> = {
|
|
|
60
60
|
pingInterval: 30 * 1000, // should be in-sync with client
|
|
61
61
|
subscriptions: true,
|
|
62
62
|
|
|
63
|
-
async createConnectionContext(req: IncomingMessage): Promise<RpcConnectionContext> {
|
|
63
|
+
async createConnectionContext(req: IncomingMessage, res: ServerResponse): Promise<RpcConnectionContext> {
|
|
64
64
|
const header = req.headers[CLIENT_ID_HEADER]
|
|
65
65
|
|
|
66
66
|
return {
|