Skip to content

Commit 619ae9d

Browse files
alecpsgastonpontisoloseng
authored
Odis Signer 3.0.1 (#10543)
* Change signer timeout * signer only published dependencies * fix lint error * combiner depends on published versions for CI checks to pass * Catch socket closed event * add logging and metric for closed connection * point back to published dependencies * point dockerfile back to unpublished dependencies * Revert "point dockerfile back to unpublished dependencies" This reverts commit 1eb25eb. * Revert "point back to published dependencies" This reverts commit 3b25f51. * bump version to beta.2 * ∆ to socket.destroyed * ++ debug logging * ++ more logging * ++ abort listeners * reverted to simple connection close * removed extra log * adjust signer version * point back to unpublished dependencies --------- Co-authored-by: Gaston Ponti <ponti@clabs.co> Co-authored-by: soloseng <102702451+soloseng@users.noreply.github.com>
1 parent 0dfd573 commit 619ae9d

File tree

5 files changed

+59
-29
lines changed

5 files changed

+59
-29
lines changed

packages/phone-number-privacy/signer/.env

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ ALFAJORES_ODIS_BLOCKCHAIN_PROVIDER=https://alfajores-forno.celo-testnet.org
3232
MAINNET_ODIS_BLOCKCHAIN_PROVIDER=https://forno.celo.org
3333
ODIS_DOMAINS_TEST_KEY_VERSION=1
3434
ODIS_PNP_TEST_KEY_VERSION=1
35-
DEPLOYED_SIGNER_SERVICE_VERSION=3.0.0
35+
DEPLOYED_SIGNER_SERVICE_VERSION=3.0.1
3636
# PUBKEYS
3737
STAGING_DOMAINS_PUBKEY=7FsWGsFnmVvRfMDpzz95Np76wf/1sPaK0Og9yiB+P8QbjiC8FV67NBans9hzZEkBaQMhiapzgMR6CkZIZPvgwQboAxl65JWRZecGe5V3XO4sdKeNemdAZ2TzQuWkuZoA
3838
ALFAJORES_DOMAINS_PUBKEY=+ZrxyPvLChWUX/DyPw6TuGwQH0glDJEbSrSxUARyP5PuqYyP/U4WZTV1e0bAUioBZ6QCJMiLpDwTaFvy8VnmM5RBbLQUMrMg5p4+CBCqj6HhsMfcyUj8V0LyuNdStlCB

packages/phone-number-privacy/signer/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@celo/phone-number-privacy-signer",
3-
"version": "3.0.1-dev",
3+
"version": "3.0.2-dev",
44
"description": "Signing participator of ODIS",
55
"author": "Celo",
66
"license": "Apache-2.0",

packages/phone-number-privacy/signer/src/common/handler.ts

+48-26
Original file line numberDiff line numberDiff line change
@@ -95,25 +95,41 @@ export function meteringHandler<R extends OdisRequest>(
9595
histogram: client.Histogram<string>,
9696
handler: PromiseHandler<R>
9797
): PromiseHandler<R> {
98-
return (req, res) => newMeter(histogram, req.url)(() => handler(req, res))
98+
return (req, res) => newMeter(histogram, req.url)(async () => handler(req, res))
9999
}
100100

101101
export function timeoutHandler<R extends OdisRequest>(
102102
timeoutMs: number,
103103
handler: PromiseHandler<R>
104104
): PromiseHandler<R> {
105105
return async (req, res) => {
106-
const timeoutSignal = (AbortSignal as any).timeout(timeoutMs)
107-
timeoutSignal.addEventListener(
108-
'abort',
109-
() => {
110-
if (!res.headersSent) {
111-
Counters.timeouts.inc()
112-
sendFailure(ErrorMessage.TIMEOUT_FROM_SIGNER, 500, res, req.url)
113-
}
114-
},
115-
{ once: true }
116-
)
106+
const timeoutId = setTimeout(() => {
107+
if (!res.headersSent) {
108+
Counters.timeouts.inc()
109+
sendFailure(ErrorMessage.TIMEOUT_FROM_SIGNER, 500, res, req.url)
110+
}
111+
}, timeoutMs)
112+
113+
try {
114+
await handler(req, res)
115+
} finally {
116+
// Clears the timeout if it answers first
117+
clearTimeout(timeoutId)
118+
}
119+
}
120+
}
121+
122+
export function connectionClosedHandler<R extends OdisRequest>(
123+
handler: PromiseHandler<R>
124+
): PromiseHandler<R> {
125+
return async (req, res) => {
126+
req.on('close', () => {
127+
if (res.socket?.destroyed) {
128+
res.locals.logger.info('connection closed')
129+
Counters.connectionClosed.inc()
130+
res.end()
131+
}
132+
})
117133

118134
await handler(req, res)
119135
}
@@ -141,8 +157,11 @@ export function resultHandler<R extends OdisRequest>(
141157
): PromiseHandler<R> {
142158
return async (req, res) => {
143159
const result = await resHandler(req, res)
144-
send(res, result.body, result.status, res.locals.logger)
145-
Counters.responses.labels(req.url, result.status.toString()).inc()
160+
// Check if the response was ended
161+
if (!res.writableEnded) {
162+
send(res, result.body, result.status, res.locals.logger)
163+
Counters.responses.labels(req.url, result.status.toString()).inc()
164+
}
146165
}
147166
}
148167

@@ -170,16 +189,19 @@ function sendFailure(
170189
endpoint: string,
171190
body?: Record<any, any> // TODO remove any
172191
) {
173-
send(
174-
response,
175-
{
176-
success: false,
177-
version: getSignerVersion(),
178-
error,
179-
...body,
180-
},
181-
status,
182-
response.locals.logger
183-
)
184-
Counters.responses.labels(endpoint, status.toString()).inc()
192+
// Check if the response was ended
193+
if (!response.writableEnded) {
194+
send(
195+
response,
196+
{
197+
success: false,
198+
version: getSignerVersion(),
199+
error,
200+
...body,
201+
},
202+
status,
203+
response.locals.logger
204+
)
205+
Counters.responses.labels(endpoint, status.toString()).inc()
206+
}
185207
}

packages/phone-number-privacy/signer/src/common/metrics.ts

+4
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ export const Counters = {
6060
name: 'errors_thrown_after_response_sent',
6161
help: 'Counter for the number of errors thrown after a response was already sent',
6262
}),
63+
connectionClosed: new Counter({
64+
name: 'connection_closed',
65+
help: 'Counter for the number of closed connections caught in Signer',
66+
}),
6367
}
6468
const buckets = [
6569
0.001, 0.01, 0.1, 0.2, 0.3, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.3, 2.6, 2.9, 3.5,

packages/phone-number-privacy/signer/src/server.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { IncomingMessage, ServerResponse } from 'node:http'
1414
import * as PromClient from 'prom-client'
1515
import {
1616
catchErrorHandler,
17+
connectionClosedHandler,
1718
disabledHandler,
1819
Locals,
1920
meteringHandler,
@@ -144,7 +145,10 @@ function createHandler<R extends OdisRequest>(
144145
tracingHandler(
145146
meteringHandler(
146147
Histograms.responseLatency,
147-
timeoutHandler(timeoutMs, enabled ? resultHandler(action) : disabledHandler)
148+
timeoutHandler(
149+
timeoutMs,
150+
enabled ? connectionClosedHandler(resultHandler(action)) : disabledHandler
151+
)
148152
)
149153
)
150154
)

0 commit comments

Comments
 (0)