to-json.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.batcher = batcher;
  6. exports.default = void 0;
  7. var _crypto = require("crypto");
  8. var _shared = require("../shared");
  9. var _fs = _interopRequireDefault(require("fs"));
  10. var _path = _interopRequireDefault(require("path"));
  11. var _constants = require("../../shared/lib/constants");
  12. function _interopRequireDefault(obj) {
  13. return obj && obj.__esModule ? obj : {
  14. default: obj
  15. };
  16. }
  17. const localEndpoint = {
  18. serviceName: "nextjs",
  19. ipv4: "127.0.0.1",
  20. port: 9411
  21. };
  22. function batcher(reportEvents) {
  23. const events = [];
  24. // Promise queue to ensure events are always sent on flushAll
  25. const queue = new Set();
  26. return {
  27. flushAll: async ()=>{
  28. await Promise.all(queue);
  29. if (events.length > 0) {
  30. await reportEvents(events);
  31. events.length = 0;
  32. }
  33. },
  34. report: (event)=>{
  35. events.push(event);
  36. if (events.length > 100) {
  37. const evts = events.slice();
  38. events.length = 0;
  39. const report = reportEvents(evts);
  40. queue.add(report);
  41. report.then(()=>queue.delete(report));
  42. }
  43. }
  44. };
  45. }
  46. let writeStream;
  47. let traceId;
  48. let batch;
  49. const writeStreamOptions = {
  50. flags: "a",
  51. encoding: "utf8"
  52. };
  53. class RotatingWriteStream {
  54. constructor(file, sizeLimit){
  55. this.file = file;
  56. this.size = 0;
  57. this.sizeLimit = sizeLimit;
  58. this.createWriteStream();
  59. }
  60. createWriteStream() {
  61. this.writeStream = _fs.default.createWriteStream(this.file, writeStreamOptions);
  62. }
  63. // Recreate the file
  64. async rotate() {
  65. await this.end();
  66. try {
  67. _fs.default.unlinkSync(this.file);
  68. } catch (err) {
  69. // It's fine if the file does not exist yet
  70. if (err.code !== "ENOENT") {
  71. throw err;
  72. }
  73. }
  74. this.size = 0;
  75. this.createWriteStream();
  76. this.rotatePromise = undefined;
  77. }
  78. async write(data) {
  79. if (this.rotatePromise) await this.rotatePromise;
  80. this.size += data.length;
  81. if (this.size > this.sizeLimit) {
  82. await (this.rotatePromise = this.rotate());
  83. }
  84. if (!this.writeStream.write(data, "utf8")) {
  85. if (this.drainPromise === undefined) {
  86. this.drainPromise = new Promise((resolve, _reject)=>{
  87. this.writeStream.once("drain", ()=>{
  88. this.drainPromise = undefined;
  89. resolve();
  90. });
  91. });
  92. }
  93. await this.drainPromise;
  94. }
  95. }
  96. end() {
  97. return new Promise((resolve)=>{
  98. this.writeStream.end(resolve);
  99. });
  100. }
  101. }
  102. const reportToLocalHost = (name, duration, timestamp, id, parentId, attrs, startTime)=>{
  103. const distDir = _shared.traceGlobals.get("distDir");
  104. const phase = _shared.traceGlobals.get("phase");
  105. if (!distDir || !phase) {
  106. return;
  107. }
  108. if (!traceId) {
  109. traceId = process.env.TRACE_ID || (0, _crypto).randomBytes(8).toString("hex");
  110. }
  111. if (!batch) {
  112. batch = batcher(async (events)=>{
  113. if (!writeStream) {
  114. await _fs.default.promises.mkdir(distDir, {
  115. recursive: true
  116. });
  117. const file = _path.default.join(distDir, "trace");
  118. writeStream = new RotatingWriteStream(file, // Development is limited to 50MB, production is unlimited
  119. phase === _constants.PHASE_DEVELOPMENT_SERVER ? 52428800 : Infinity);
  120. }
  121. const eventsJson = JSON.stringify(events);
  122. try {
  123. await writeStream.write(eventsJson + "\n");
  124. } catch (err) {
  125. console.log(err);
  126. }
  127. });
  128. }
  129. batch.report({
  130. traceId,
  131. parentId,
  132. name,
  133. id,
  134. timestamp,
  135. duration,
  136. tags: attrs,
  137. startTime
  138. });
  139. };
  140. var _default = {
  141. flushAll: ()=>batch ? batch.flushAll().then(()=>{
  142. const phase = _shared.traceGlobals.get("phase");
  143. // Only end writeStream when manually flushing in production
  144. if (phase !== _constants.PHASE_DEVELOPMENT_SERVER) {
  145. writeStream.end();
  146. }
  147. }) : undefined,
  148. report: reportToLocalHost
  149. };
  150. exports.default = _default;
  151. //# sourceMappingURL=to-json.js.map