@rest-vir/define-service 0.1.0 → 0.2.0

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.
@@ -95,6 +95,11 @@ export type OverwriteWebSocketMethods<WebSocketClass extends CommonWebSocket, Lo
95
95
  MessageFromHostType: true;
96
96
  SearchParamsType: true;
97
97
  }>> | NoParam = NoParam> = Overwrite<WebSocketClass, {
98
+ /**
99
+ * Closes the WebSocket and waits it to actually close (so that you _know_ it's been closed
100
+ * once this resolves).
101
+ */
102
+ close(): Promise<void>;
98
103
  /**
99
104
  * Adds an event listener that's wrapped in assertions to verify that message events have
100
105
  * the expected contents.
@@ -1,5 +1,5 @@
1
1
  import { waitUntil } from '@augment-vir/assert';
2
- import { DeferredPromise, ensureErrorAndPrependMessage, getOrSet, stringify, } from '@augment-vir/common';
2
+ import { callAsynchronously, DeferredPromise, ensureErrorAndPrependMessage, getOrSet, stringify, } from '@augment-vir/common';
3
3
  import { convertDuration } from 'date-vir';
4
4
  import { assertValidShape } from 'object-shape-tester';
5
5
  import { parseJsonWithUndefined } from '../augments/json.js';
@@ -44,12 +44,31 @@ export function getOppositeWebSocketLocation(originalWebSocketLocation) {
44
44
  */
45
45
  export function overwriteWebSocketMethods(webSocketDefinition, rawWebSocket, webSocketLocation) {
46
46
  const originalSend = rawWebSocket.send;
47
+ const originalClose = rawWebSocket.close;
47
48
  const originalAddEventListener = rawWebSocket.addEventListener;
48
49
  const originalRemoveEventListener = rawWebSocket.removeEventListener;
49
50
  const webSocket = rawWebSocket;
51
+ const deferredClosePromise = new DeferredPromise();
52
+ webSocket.addEventListener('close', () => {
53
+ /**
54
+ * Call this asynchronously so the other `close` event listeners get fired before this
55
+ * resolves.
56
+ */
57
+ void callAsynchronously(() => {
58
+ deferredClosePromise.resolve();
59
+ });
60
+ });
50
61
  const originalListenerMap = {};
51
62
  Object.assign(webSocket, {
52
63
  originalListenerMap,
64
+ async close() {
65
+ originalClose.call(webSocket);
66
+ /**
67
+ * Closing takes a _long time_ for some reason, so we want to wait until it's actually
68
+ * done before proceeding with other operations.
69
+ */
70
+ await deferredClosePromise.promise;
71
+ },
53
72
  addEventListener(eventName, listener) {
54
73
  function newListener(event) {
55
74
  const baseParams = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rest-vir/define-service",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Define an connect to a declarative and type safe REST and WebSocket service.",
5
5
  "keywords": [
6
6
  "rest",