@lodestar/api 1.47.0-dev.931ecbec99 → 1.47.0-dev.9572bcc698

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 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/beacon/server/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAW,kBAAkB,EAAE,aAAa,EAAsB,MAAM,6BAA6B,CAAC;AAC7G,OAAO,EAAC,SAAS,EAA6C,MAAM,qBAAqB,CAAC;AAE1F,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,CAgEnH;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GAAG,MAAM,CAE/E"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/beacon/server/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAW,kBAAkB,EAAE,aAAa,EAAsB,MAAM,6BAA6B,CAAC;AAC7G,OAAO,EAAC,SAAS,EAA6C,MAAM,qBAAqB,CAAC;AAE1F,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,CAuEnH;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GAAG,MAAM,CAE/E"}
@@ -36,11 +36,15 @@ export function getRoutes(config, methods) {
36
36
  topics: req.query.topics,
37
37
  signal: controller.signal,
38
38
  onEvent: (event) => {
39
+ // Serialization is per event and must not tear down the stream. Throwing here is
40
+ // handled by the caller which logs it and keeps the subscription alive, the client
41
+ // only misses this single event instead of silently losing the whole stream.
42
+ const data = eventSerdes.toJson(event);
39
43
  try {
40
- const data = eventSerdes.toJson(event);
41
44
  res.raw.write(serializeSSEEvent({ event: event.type, data }));
42
45
  }
43
46
  catch (e) {
47
+ // The connection itself is broken, there is no way to recover it
44
48
  reject(e);
45
49
  }
46
50
  },
@@ -51,10 +55,14 @@ export function getRoutes(config, methods) {
51
55
  req.socket.once("close", () => resolve());
52
56
  req.socket.once("end", () => resolve());
53
57
  });
54
- // api.eventstream will never stop, so no need to ever call `res.raw.end();`
55
58
  }
56
59
  finally {
57
60
  controller.abort();
61
+ // Always end the response. If an error is thrown after the headers were sent, fastify can
62
+ // no longer write a status code and would leave the socket open, the client then waits
63
+ // forever on a stream that will never emit another event.
64
+ if (!res.raw.writableEnded && !res.raw.destroyed)
65
+ res.raw.end();
58
66
  }
59
67
  },
60
68
  },
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/beacon/server/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/beacon/server/events.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "bugs": {
12
12
  "url": "https://github.com/ChainSafe/lodestar/issues"
13
13
  },
14
- "version": "1.47.0-dev.931ecbec99",
14
+ "version": "1.47.0-dev.9572bcc698",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -74,12 +74,12 @@
74
74
  "check-readme": "pnpm exec tsx ../../scripts/check_readme.ts"
75
75
  },
76
76
  "dependencies": {
77
- "@chainsafe/persistent-merkle-tree": "^1.3.0",
78
- "@chainsafe/ssz": "^1.6.2",
79
- "@lodestar/config": "^1.47.0-dev.931ecbec99",
80
- "@lodestar/params": "^1.47.0-dev.931ecbec99",
81
- "@lodestar/types": "^1.47.0-dev.931ecbec99",
82
- "@lodestar/utils": "^1.47.0-dev.931ecbec99",
77
+ "@chainsafe/persistent-merkle-tree": "^1.3.1",
78
+ "@chainsafe/ssz": "^1.6.3",
79
+ "@lodestar/config": "^1.47.0-dev.9572bcc698",
80
+ "@lodestar/params": "^1.47.0-dev.9572bcc698",
81
+ "@lodestar/types": "^1.47.0-dev.9572bcc698",
82
+ "@lodestar/utils": "^1.47.0-dev.9572bcc698",
83
83
  "eventsource": "^2.0.2",
84
84
  "qs": "^6.14.2"
85
85
  },
@@ -96,5 +96,5 @@
96
96
  "api",
97
97
  "blockchain"
98
98
  ],
99
- "gitHead": "b9a86b6966fa8fbfdcecff9c593f6c995df8b671"
99
+ "gitHead": "8f76988606049ffbae2597f3730d7069b88cc44e"
100
100
  }
@@ -42,10 +42,15 @@ export function getRoutes(config: ChainForkConfig, methods: ApplicationMethods<E
42
42
  topics: req.query.topics,
43
43
  signal: controller.signal,
44
44
  onEvent: (event) => {
45
+ // Serialization is per event and must not tear down the stream. Throwing here is
46
+ // handled by the caller which logs it and keeps the subscription alive, the client
47
+ // only misses this single event instead of silently losing the whole stream.
48
+ const data = eventSerdes.toJson(event);
49
+
45
50
  try {
46
- const data = eventSerdes.toJson(event);
47
51
  res.raw.write(serializeSSEEvent({event: event.type, data}));
48
52
  } catch (e) {
53
+ // The connection itself is broken, there is no way to recover it
49
54
  reject(e);
50
55
  }
51
56
  },
@@ -58,10 +63,12 @@ export function getRoutes(config: ChainForkConfig, methods: ApplicationMethods<E
58
63
  req.socket.once("close", () => resolve());
59
64
  req.socket.once("end", () => resolve());
60
65
  });
61
-
62
- // api.eventstream will never stop, so no need to ever call `res.raw.end();`
63
66
  } finally {
64
67
  controller.abort();
68
+ // Always end the response. If an error is thrown after the headers were sent, fastify can
69
+ // no longer write a status code and would leave the socket open, the client then waits
70
+ // forever on a stream that will never emit another event.
71
+ if (!res.raw.writableEnded && !res.raw.destroyed) res.raw.end();
65
72
  }
66
73
  },
67
74
  },