@mstuercke/api-utils 0.0.47 → 0.0.49

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.
@@ -1,13 +1,19 @@
1
- import { WsApiResponse, WsApiRoute } from '../types';
2
- export type WsApiOptions<Response extends WsApiResponse> = {
3
- onConnected?: () => void;
4
- onResponse?: (response: Response) => void;
5
- onError?: (error: unknown) => void;
1
+ import { WsApiRequest, WsApiResponse, WsApiRoute } from '../types';
2
+ type WsApiConnection<Request extends WsApiRequest> = {
3
+ disconnect: () => void;
4
+ sendRequest: (request: Request) => void;
5
+ };
6
+ export type WsApiOptions<Request extends WsApiRequest, Response extends WsApiResponse> = {
7
+ onConnected?: (connection: WsApiConnection<Request>) => void;
8
+ onResponse?: (response: Response, connection: WsApiConnection<Request>) => void;
9
+ onError?: (error: unknown, connection: WsApiConnection<Request>) => void;
6
10
  onDisconnected?: () => void;
7
11
  };
8
- export declare const useWsApi: (wsApiUrl: string) => {
9
- sendRequest: <Action extends string, Request_1 extends object, Response_1 extends object>(route: WsApiRoute<Action, Request_1, Response_1>, request: Request_1, options: WsApiOptions<Response_1>) => void;
12
+ export declare const useWsApi: <Action extends string, Request_1 extends object, Response_1 extends object>(wsApiUrl: string, route: WsApiRoute<Action, Request_1, Response_1> | undefined) => {
13
+ connect: (options: WsApiOptions<Request_1, Response_1>) => Promise<void>;
10
14
  connected: boolean;
15
+ connection: WsApiConnection<Request_1>;
11
16
  error: boolean;
12
- disconnect: () => void;
17
+ disconnect: () => void | undefined;
13
18
  };
19
+ export {};
@@ -1,67 +1,57 @@
1
- import { useCallback, useEffect, useMemo, useState } from 'react';
2
- export const useWsApi = (wsApiUrl) => {
1
+ import { useCallback, useMemo, useRef, useState } from 'react';
2
+ export const useWsApi = (wsApiUrl, route) => {
3
3
  const [error, setError] = useState(false);
4
4
  const [connected, setConnected] = useState(false);
5
- const [request, setRequest] = useState();
6
- const [route, setRoute] = useState();
7
- const [options, setOptions] = useState();
8
- const handleConnected = useCallback(() => {
9
- setConnected(true);
10
- setError(false);
11
- options?.onConnected?.();
12
- }, [options]);
13
- const handleError = useCallback((error) => {
14
- setError(false);
15
- options?.onError?.(error);
16
- }, [options]);
17
- const handleResponse = useCallback((response) => {
18
- setError(false);
19
- options?.onResponse?.(response);
20
- }, [options]);
21
- const handleDisconnected = useCallback(() => {
22
- setConnected(false);
23
- options?.onDisconnected?.();
24
- }, [options]);
25
- const websocket = useMemo(() => {
5
+ const webSocket = useRef();
6
+ const sendRequest = useCallback((request) => {
26
7
  if (!route)
27
- return null;
28
- if (!request)
29
- return null;
30
- const websocket = new WebSocket(wsApiUrl);
31
- websocket.onopen = () => {
32
- websocket.send(JSON.stringify({
33
- action: route.action,
34
- ...request,
35
- }));
36
- handleConnected();
8
+ throw 'Not route';
9
+ if (!webSocket.current)
10
+ throw 'Not connected';
11
+ webSocket.current.send(JSON.stringify({
12
+ action: route.action,
13
+ ...request,
14
+ }));
15
+ }, [route]);
16
+ const disconnect = useCallback(() => webSocket.current?.close(), [webSocket]);
17
+ const connection = useMemo(() => {
18
+ return {
19
+ disconnect,
20
+ sendRequest,
37
21
  };
38
- websocket.onmessage = (ev) => {
39
- if (!ev.data || ev.data === '{}')
40
- return;
41
- handleResponse(JSON.parse(ev.data));
42
- };
43
- websocket.onerror = (error) => handleError(error);
44
- websocket.onclose = () => handleDisconnected();
45
- return websocket;
46
- }, [route, request]);
47
- // send request
48
- useEffect(() => {
49
- if (!route)
50
- return;
51
- }, [request, route?.action, websocket, request]);
52
- const sendRequest = useCallback((route, request, options) => {
53
- setConnected(true);
54
- setRoute(route);
55
- setRequest(request);
56
- setOptions(options);
57
- }, []);
58
- const disconnect = useCallback(() => {
59
- websocket?.close();
60
- handleDisconnected?.();
61
- }, [websocket, handleDisconnected]);
22
+ }, [disconnect, sendRequest]);
23
+ const connect = useCallback(async (options) => {
24
+ return new Promise((resolve) => {
25
+ if (webSocket.current && (webSocket.current.readyState === WebSocket.CONNECTING || webSocket.current.readyState === WebSocket.OPEN))
26
+ throw 'Already connected';
27
+ webSocket.current = new WebSocket(wsApiUrl);
28
+ webSocket.current.onopen = () => {
29
+ setConnected(true);
30
+ setError(false);
31
+ options?.onConnected?.(connection);
32
+ resolve();
33
+ };
34
+ webSocket.current.onmessage = (ev) => {
35
+ if (!ev.data || ev.data === '{}')
36
+ return;
37
+ setError(false);
38
+ options?.onResponse?.(JSON.parse(ev.data), connection);
39
+ };
40
+ webSocket.current.onerror = (error) => {
41
+ setError(false);
42
+ options?.onError?.(error, connection);
43
+ };
44
+ webSocket.current.onclose = () => {
45
+ setConnected(false);
46
+ options?.onDisconnected?.();
47
+ webSocket.current = undefined;
48
+ };
49
+ });
50
+ }, [wsApiUrl, connection]);
62
51
  return {
63
- sendRequest,
52
+ connect,
64
53
  connected,
54
+ connection,
65
55
  error,
66
56
  disconnect,
67
57
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useWsApi.js","sourceRoot":"","sources":["../../../src/ws/client/useWsApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAUhE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,EAAE;IAC3C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IACnD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAC3D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAgB,CAAC;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAA6B,CAAC;IAChE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAqB,CAAC;IAE5D,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;IAC3B,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,KAAc,EAAE,EAAE;QACjD,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,QAAkB,EAAE,EAAE;QACxD,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;IAC9B,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE;QAC7B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC1C,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE;YACtB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,GAAG,OAAO;aACX,CAAC,CAAC,CAAC;YACJ,eAAe,EAAE,CAAC;QACpB,CAAC,CAAC;QACF,SAAS,CAAC,SAAS,GAAG,CAAC,EAAE,EAAE,EAAE;YAC3B,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI;gBAC9B,OAAO;YACT,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAc,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC;QACF,SAAS,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAClD,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAErB,eAAe;IACf,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK;YAAE,OAAO;IACrB,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjD,MAAM,WAAW,GAAG,WAAW,CAAC,CAI9B,KAA4C,EAAE,OAAgB,EAAE,OAA+B,EAAE,EAAE;QACnG,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,UAAU,CAAC,OAAO,CAAC,CAAC;QACpB,UAAU,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,SAAS,EAAE,KAAK,EAAE,CAAC;QACnB,kBAAkB,EAAE,EAAE,CAAC;IACzB,CAAC,EAAE,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEpC,OAAO;QACL,WAAW;QACX,SAAS;QACT,KAAK;QACL,UAAU;KACX,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"useWsApi.js","sourceRoot":"","sources":["../../../src/ws/client/useWsApi.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { ApiGatewayManagementApiClient, DeleteConnectionCommand, PostToConnectionCommand, } from '@aws-sdk/client-apigatewaymanagementapi';
1
+ import { sendResponse } from './sendResponse';
2
+ import { closeConnection } from './closeConnection';
2
3
  export class WsApi {
3
4
  requestHandlers = {
4
5
  '$connect': () => Promise.resolve(),
@@ -23,19 +24,11 @@ export class WsApi {
23
24
  if (!requestHandler)
24
25
  throw `No requestHandler found for action ${action}`;
25
26
  const endpoint = `https://${domainName}/${stage}`;
26
- const ws = new ApiGatewayManagementApiClient({ endpoint });
27
+ const connection = { endpoint, connectionId };
27
28
  await requestHandler(body && JSON.parse(body), {
28
- sendResponse: async (response) => {
29
- await ws.send(new PostToConnectionCommand({
30
- ConnectionId: connectionId,
31
- Data: JSON.stringify(response),
32
- }));
33
- },
34
- closeConnection: async () => {
35
- await ws.send(new DeleteConnectionCommand({ ConnectionId: connectionId }));
36
- },
37
- connectionId,
38
- endpoint,
29
+ connection,
30
+ sendResponse: async (response) => await sendResponse(connection, response),
31
+ closeConnection: async () => await closeConnection(connection),
39
32
  });
40
33
  return {
41
34
  statusCode: 200,
@@ -1 +1 @@
1
- {"version":3,"file":"WsApi.js","sourceRoot":"","sources":["../../../src/ws/server/WsApi.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,yCAAyC,CAAC;AAEjD,MAAM,OAAO,KAAK;IACC,eAAe,GAA4D;QAC1F,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;QACnC,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;KACvC,CAAC;IAEF,eAAe,CAIb,KAA4C,EAAE,cAA8D;QAC5G,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAA2B;QAC7C,MAAM,EAAC,IAAI,EAAC,GAAG,KAAK,CAAC;QACrB,MAAM,EAAC,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAC,GAAG,KAAK,CAAC,cAAc,CAAC;QAEjF,IAAI,CAAC,MAAM;YAAE,MAAM,oBAAoB,CAAC;QACxC,IAAI,CAAC,YAAY;YAAE,MAAM,iBAAiB,CAAC;QAC3C,IAAI,CAAC,UAAU;YAAE,MAAM,eAAe,CAAC;QACvC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,MAAM,SAAS,CAAC;QAE5E,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,cAAc;YACjB,MAAM,sCAAsC,MAAM,EAAE,CAAC;QAEvD,MAAM,QAAQ,GAAG,WAAW,UAAU,IAAI,KAAK,EAAE,CAAC;QAClD,MAAM,EAAE,GAAG,IAAI,6BAA6B,CAAC,EAAC,QAAQ,EAAC,CAAC,CAAC;QACzD,MAAM,cAAc,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC7C,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAC/B,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC;oBACxC,YAAY,EAAE,YAAY;oBAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;iBAC/B,CAAC,CAAC,CAAC;YACN,CAAC;YACD,eAAe,EAAE,KAAK,IAAI,EAAE;gBAC1B,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,EAAC,YAAY,EAAE,YAAY,EAAC,CAAC,CAAC,CAAC;YAC3E,CAAC;YACD,YAAY;YACZ,QAAQ;SACT,CAAC,CAAC;QAEH,OAAO;YACL,UAAU,EAAE,GAAG;YACf,IAAI,EAAE,EAAE;SACT,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"WsApi.js","sourceRoot":"","sources":["../../../src/ws/server/WsApi.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAElD,MAAM,OAAO,KAAK;IACC,eAAe,GAA4D;QAC1F,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;QACnC,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;KACvC,CAAC;IAEF,eAAe,CAIb,KAA4C,EAAE,cAA8D;QAC5G,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAA2B;QAC7C,MAAM,EAAC,IAAI,EAAC,GAAG,KAAK,CAAC;QACrB,MAAM,EAAC,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAC,GAAG,KAAK,CAAC,cAAc,CAAC;QAEjF,IAAI,CAAC,MAAM;YAAE,MAAM,oBAAoB,CAAC;QACxC,IAAI,CAAC,YAAY;YAAE,MAAM,iBAAiB,CAAC;QAC3C,IAAI,CAAC,UAAU;YAAE,MAAM,eAAe,CAAC;QACvC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,MAAM,SAAS,CAAC;QAE5E,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,cAAc;YACjB,MAAM,sCAAsC,MAAM,EAAE,CAAC;QAEvD,MAAM,QAAQ,GAAG,WAAW,UAAU,IAAI,KAAK,EAAE,CAAC;QAClD,MAAM,UAAU,GAAoB,EAAC,QAAQ,EAAE,YAAY,EAAC,CAAC;QAC7D,MAAM,cAAc,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC7C,UAAU;YACV,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,MAAM,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC;YAC1E,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,eAAe,CAAC,UAAU,CAAC;SAC/D,CAAC,CAAC;QAEH,OAAO;YACL,UAAU,EAAE,GAAG;YACf,IAAI,EAAE,EAAE;SACT,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ import { WsApiConnection } from '../types';
2
+ export declare const closeConnection: ({ endpoint, connectionId }: WsApiConnection) => Promise<void>;
@@ -0,0 +1,12 @@
1
+ import { ApiGatewayManagementApiClient, DeleteConnectionCommand } from '@aws-sdk/client-apigatewaymanagementapi';
2
+ export const closeConnection = async ({ endpoint, connectionId }) => {
3
+ try {
4
+ await new ApiGatewayManagementApiClient({ endpoint }).send(new DeleteConnectionCommand({ ConnectionId: connectionId }));
5
+ }
6
+ catch (err) {
7
+ if (err?.name === 'GoneException')
8
+ return;
9
+ throw err;
10
+ }
11
+ };
12
+ //# sourceMappingURL=closeConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closeConnection.js","sourceRoot":"","sources":["../../../src/ws/server/closeConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,6BAA6B,EAAE,uBAAuB,EAAC,MAAM,yCAAyC,CAAC;AAG/G,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,EAAC,QAAQ,EAAE,YAAY,EAAkB,EAAE,EAAE;IACjF,IAAI;QACF,MAAM,IAAI,6BAA6B,CAAC,EAAC,QAAQ,EAAC,CAAC,CAAC,IAAI,CACpD,IAAI,uBAAuB,CAAC,EAAC,YAAY,EAAE,YAAY,EAAC,CAAC,CAC5D,CAAC;KACH;IAAC,OAAO,GAAQ,EAAE;QACjB,IAAI,GAAG,EAAE,IAAI,KAAK,eAAe;YAC/B,OAAO;QAET,MAAM,GAAG,CAAC;KACX;AACH,CAAC,CAAC"}
@@ -1 +1,3 @@
1
+ export * from './closeConnection';
2
+ export * from './sendResponse';
1
3
  export * from './WsApi';
@@ -1,2 +1,4 @@
1
+ export * from './closeConnection';
2
+ export * from './sendResponse';
1
3
  export * from './WsApi';
2
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ws/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ws/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { WsApiConnection, WsApiResponse } from '../types';
2
+ export type SendResponseResult = 'SUCCESS' | 'CONNECTION_CLOSED';
3
+ export declare const sendResponse: ({ endpoint, connectionId }: WsApiConnection, response: WsApiResponse, ignoreClosedConnection?: boolean) => Promise<SendResponseResult>;
@@ -0,0 +1,16 @@
1
+ import { ApiGatewayManagementApiClient, PostToConnectionCommand } from '@aws-sdk/client-apigatewaymanagementapi';
2
+ export const sendResponse = async ({ endpoint, connectionId }, response, ignoreClosedConnection = true) => {
3
+ try {
4
+ await new ApiGatewayManagementApiClient({ endpoint }).send(new PostToConnectionCommand({
5
+ ConnectionId: connectionId,
6
+ Data: JSON.stringify(response),
7
+ }));
8
+ return 'SUCCESS';
9
+ }
10
+ catch (error) {
11
+ if (ignoreClosedConnection && error?.name === 'GoneException')
12
+ return 'CONNECTION_CLOSED';
13
+ throw error;
14
+ }
15
+ };
16
+ //# sourceMappingURL=sendResponse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendResponse.js","sourceRoot":"","sources":["../../../src/ws/server/sendResponse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,6BAA6B,EAAE,uBAAuB,EAAC,MAAM,yCAAyC,CAAC;AAI/G,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,EAAC,QAAQ,EAAE,YAAY,EAAkB,EAAE,QAAuB,EAAE,yBAAkC,IAAI,EAA+B,EAAE;IAC5K,IAAI;QACF,MAAM,IAAI,6BAA6B,CAAC,EAAC,QAAQ,EAAC,CAAC,CAAC,IAAI,CACpD,IAAI,uBAAuB,CAAC;YAC1B,YAAY,EAAE,YAAY;YAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;SAC/B,CAAC,CACL,CAAC;QACF,OAAO,SAAS,CAAC;KAClB;IAAC,OAAO,KAAU,EAAE;QACnB,IAAI,sBAAsB,IAAI,KAAK,EAAE,IAAI,KAAK,eAAe;YAC3D,OAAO,mBAAmB,CAAC;QAE7B,MAAM,KAAK,CAAC;KACb;AACH,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type WsApiConnection = {
2
+ endpoint: string;
3
+ connectionId: string;
4
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=WsApiConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WsApiConnection.js","sourceRoot":"","sources":["../../../src/ws/types/WsApiConnection.ts"],"names":[],"mappings":""}
@@ -1,10 +1,11 @@
1
1
  import { WsApiAction, WsApiRequest, WsApiResponse } from './common';
2
2
  import { OmitNever } from '../../types/OmitNever';
3
+ import { WsApiConnection } from './WsApiConnection';
4
+ import { SendResponseResult } from '../server';
3
5
  export type WsApiRequestHandler<Action extends WsApiAction, Request extends WsApiRequest, Response extends WsApiResponse> = (request: Request & {
4
6
  action: Action;
5
7
  }, responseActions: OmitNever<{
6
- sendResponse: [Response] extends [never] ? never : (response: Response) => Promise<void>;
8
+ connection: WsApiConnection;
9
+ sendResponse: [Response] extends [never] ? never : (response: Response) => Promise<SendResponseResult>;
7
10
  closeConnection: () => Promise<void>;
8
- connectionId: string;
9
- endpoint: string;
10
11
  }>) => Promise<void>;
@@ -1,3 +1,4 @@
1
1
  export * from './common';
2
+ export * from './WsApiConnection';
2
3
  export * from './WsApiRequestHandler';
3
4
  export * from './WsApiRoute';
@@ -1,4 +1,5 @@
1
1
  export * from './common';
2
+ export * from './WsApiConnection';
2
3
  export * from './WsApiRequestHandler';
3
4
  export * from './WsApiRoute';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ws/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ws/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mstuercke/api-utils",
3
- "version": "0.0.47",
3
+ "version": "0.0.49",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist/**/*.js",