@thru/replay 0.2.4 → 0.2.5

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/index.mjs CHANGED
@@ -587,7 +587,10 @@ var ReplayStream = class {
587
587
  };
588
588
  async function safeClose(pump) {
589
589
  try {
590
- await pump.close();
590
+ await Promise.race([
591
+ pump.close(),
592
+ new Promise((resolve) => setTimeout(resolve, 5e3))
593
+ ]);
591
594
  } catch {
592
595
  }
593
596
  }
@@ -1074,6 +1077,7 @@ async function* createAccountsByOwnerReplay(options) {
1074
1077
  const streamBuffer = [];
1075
1078
  let streamDone = false;
1076
1079
  let streamError = null;
1080
+ let lastActivityTime = Date.now();
1077
1081
  try {
1078
1082
  cleanupTimer = setInterval(() => {
1079
1083
  assembler.cleanup();
@@ -1083,6 +1087,7 @@ async function* createAccountsByOwnerReplay(options) {
1083
1087
  const streamProcessor = (async () => {
1084
1088
  try {
1085
1089
  for await (const response of stream) {
1090
+ lastActivityTime = Date.now();
1086
1091
  const event = processResponseMulti(response, assembler);
1087
1092
  if (event) {
1088
1093
  if (event.type === "account") {
@@ -1172,6 +1177,7 @@ async function* createAccountsByOwnerReplay(options) {
1172
1177
  let retryAttempt = 0;
1173
1178
  let currentStream = stream;
1174
1179
  let currentStreamProcessor = streamProcessor;
1180
+ lastActivityTime = Date.now();
1175
1181
  const createStreamProcessor = () => {
1176
1182
  if (clientFactory) {
1177
1183
  try {
@@ -1187,6 +1193,7 @@ async function* createAccountsByOwnerReplay(options) {
1187
1193
  try {
1188
1194
  for await (const response of newStream) {
1189
1195
  retryAttempt = 0;
1196
+ lastActivityTime = Date.now();
1190
1197
  const event = processResponseMulti(response, assembler);
1191
1198
  if (event) {
1192
1199
  if (event.type === "account") {
@@ -1207,7 +1214,18 @@ async function* createAccountsByOwnerReplay(options) {
1207
1214
  return { stream: newStream, processor: newProcessor };
1208
1215
  };
1209
1216
  while (true) {
1217
+ const hadEvents = streamBuffer.length > 0;
1210
1218
  yield* yieldStreamBuffer();
1219
+ if (hadEvents) {
1220
+ lastActivityTime = Date.now();
1221
+ }
1222
+ if (!streamDone && Date.now() - lastActivityTime > retryConfig.connectionTimeoutMs) {
1223
+ logger.warn(
1224
+ `[account-stream] no activity for ${retryConfig.connectionTimeoutMs}ms; forcing reconnection`
1225
+ );
1226
+ streamDone = true;
1227
+ streamError = new Error(`Operation timed out after ${retryConfig.connectionTimeoutMs}ms`);
1228
+ }
1211
1229
  if (streamDone) {
1212
1230
  if (streamError) {
1213
1231
  const backoffMs = calculateBackoff(retryAttempt, retryConfig);
@@ -1219,6 +1237,7 @@ async function* createAccountsByOwnerReplay(options) {
1219
1237
  streamDone = false;
1220
1238
  streamError = null;
1221
1239
  streamBuffer.length = 0;
1240
+ lastActivityTime = Date.now();
1222
1241
  const { stream: newStream, processor: newProcessor } = createStreamProcessor();
1223
1242
  currentStream = newStream;
1224
1243
  currentStreamProcessor = newProcessor;
@@ -1226,6 +1245,7 @@ async function* createAccountsByOwnerReplay(options) {
1226
1245
  } else {
1227
1246
  logger.warn("[account-stream] stream ended unexpectedly; reconnecting...");
1228
1247
  streamDone = false;
1248
+ lastActivityTime = Date.now();
1229
1249
  const { stream: newStream, processor: newProcessor } = createStreamProcessor();
1230
1250
  currentStream = newStream;
1231
1251
  currentStreamProcessor = newProcessor;