Skip to content

Commit 61b0975

Browse files
committed
fix: reject all sends when the connection is closed
1 parent 9f65899 commit 61b0975

File tree

1 file changed

+29
-3
lines changed

1 file changed

+29
-3
lines changed

packages/SwingSet/src/vats/network/network.js

+29-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import makeStore from '@agoric/store';
33
import rawHarden from '@agoric/harden';
44
import { E as defaultE } from '@agoric/eventual-send';
5+
import { producePromise } from '@agoric/produce-promise';
56
import { toBytes } from './bytes';
67

78
const harden = /** @type {<T>(x: T) => T} */ (rawHarden);
@@ -13,6 +14,11 @@ export const ENDPOINT_SEPARATOR = '/';
1314
* @typedef {import('@agoric/store').Store<T,U>} Store
1415
*/
1516

17+
/**
18+
* @template T,U
19+
* @typedef {import('@agoric/produce-promise').PromiseRecord<T, U>} PromiseRecord
20+
*/
21+
1622
/**
1723
* @typedef {import('./bytes').Bytes} Bytes
1824
* @typedef {import('./bytes').Data} Data
@@ -108,6 +114,10 @@ export const makeConnection = (
108114
E = defaultE,
109115
) => {
110116
let closed;
117+
/**
118+
* @type {Set<PromiseRecord<Bytes,any>>}
119+
*/
120+
const pendingAcks = new Set();
111121
/**
112122
* @type {Connection}
113123
*/
@@ -124,6 +134,10 @@ export const makeConnection = (
124134
}
125135
current.delete(connection);
126136
closed = Error('Connection closed');
137+
for (const ackDeferred of [...pendingAcks.values()]) {
138+
pendingAcks.delete(ackDeferred);
139+
ackDeferred.reject(closed);
140+
}
127141
await E(handler)
128142
.onClose(connection, undefined, handler)
129143
.catch(rethrowUnlessMissing);
@@ -134,10 +148,22 @@ export const makeConnection = (
134148
throw closed;
135149
}
136150
const bytes = toBytes(data);
137-
const ack = await E(handler)
151+
const ackDeferred = producePromise();
152+
pendingAcks.add(ackDeferred);
153+
E(handler)
138154
.onReceive(connection, bytes, handler)
139-
.catch(err => rethrowUnlessMissing(err) || '');
140-
return toBytes(ack);
155+
.catch(err => rethrowUnlessMissing(err) || '')
156+
.then(
157+
ack => {
158+
pendingAcks.delete(ackDeferred);
159+
ackDeferred.resolve(toBytes(ack));
160+
},
161+
err => {
162+
pendingAcks.delete(ackDeferred);
163+
ackDeferred.reject(err);
164+
},
165+
);
166+
return ackDeferred.promise;
141167
},
142168
});
143169

0 commit comments

Comments
 (0)