UNPKG

1.39 kBJavaScriptView Raw
1'use strict'
2
3/**
4 * @callback GenerateRequestId
5 * @param {Object} req
6 * @returns {string}
7 */
8
9/**
10 * @param {string} [requestIdHeader]
11 * @param {GenerateRequestId} [optGenReqId]
12 * @returns {GenerateRequestId}
13 */
14function reqIdGenFactory (requestIdHeader, optGenReqId) {
15 const genReqId = optGenReqId || buildDefaultGenReqId()
16
17 if (requestIdHeader) {
18 return buildOptionalHeaderReqId(requestIdHeader, genReqId)
19 }
20
21 return genReqId
22}
23
24function getGenReqId (contextServer, req) {
25 return contextServer.genReqId(req)
26}
27
28function buildDefaultGenReqId () {
29 // 2,147,483,647 (2^31 − 1) stands for max SMI value (an internal optimization of V8).
30 // With this upper bound, if you'll be generating 1k ids/sec, you're going to hit it in ~25 days.
31 // This is very likely to happen in real-world applications, hence the limit is enforced.
32 // Growing beyond this value will make the id generation slower and cause a deopt.
33 // In the worst cases, it will become a float, losing accuracy.
34 const maxInt = 2147483647
35
36 let nextReqId = 0
37 return function defaultGenReqId () {
38 nextReqId = (nextReqId + 1) & maxInt
39 return `req-${nextReqId.toString(36)}`
40 }
41}
42
43function buildOptionalHeaderReqId (requestIdHeader, genReqId) {
44 return function (req) {
45 return req.headers[requestIdHeader] || genReqId(req)
46 }
47}
48
49module.exports = {
50 getGenReqId,
51 reqIdGenFactory
52}