node-oom-heapdump 3.1.0 → 3.2.1

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/CHANGELOG.md CHANGED
@@ -1,4 +1,9 @@
1
- 26-10-2023 Paul Rütter
1
+ 27-10-2023 Paul Rütter
2
+ - 3.2.0
3
+ - https://github.com/blueconic/node-oom-heapdump/issues/31: Node20 support
4
+ - Change native code to use different method signature for Node20 and above, remain compatible for Node18 and below.
5
+
6
+ 26-10-2023 Paul Rütter
2
7
  - 3.1.0
3
8
  - https://github.com/blueconic/node-oom-heapdump/issues/28: only build prebuilt binaries for > 16.x, as Github Actions no longer supports older versions.
4
9
 
package/README.md CHANGED
@@ -9,6 +9,7 @@ Tested on Node.js 10.x, 11.x, 12.x, 13.x, 14.x, 15.x, 16.x, 17.x and 18.x.
9
9
  No support for Node.js < 10.x at the moment in version 3.0.0, use version 2.2.0 for if needed.
10
10
 
11
11
  Also comes with prebuilt binaries (hosted on Github releases), thanks to Stuart Miller (https://github.com/spmiller).
12
+ From 3.1.0, prebuilt binaries are only shipped for Node.js 16.x and upwards.
12
13
 
13
14
  ## Node.js 14.18.x
14
15
  https://github.com/nodejs/node/pull/33010 landed in Node.js 14.18.0, which makes this module no longer needed for heapdumps on out of memory.
package/build/binding.sln CHANGED
@@ -4,14 +4,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "node_oom_heapdump_native",
4
4
  EndProject
5
5
  Global
6
6
  GlobalSection(SolutionConfigurationPlatforms) = preSolution
7
- Release|x64 = Release|x64
8
7
  Debug|x64 = Debug|x64
8
+ Release|x64 = Release|x64
9
9
  EndGlobalSection
10
10
  GlobalSection(ProjectConfigurationPlatforms) = postSolution
11
- {B44BD8E7-8AB3-68F6-9D96-154D16CEC9C0}.Release|x64.ActiveCfg = Release|x64
12
- {B44BD8E7-8AB3-68F6-9D96-154D16CEC9C0}.Release|x64.Build.0 = Release|x64
13
11
  {B44BD8E7-8AB3-68F6-9D96-154D16CEC9C0}.Debug|x64.ActiveCfg = Debug|x64
14
12
  {B44BD8E7-8AB3-68F6-9D96-154D16CEC9C0}.Debug|x64.Build.0 = Debug|x64
13
+ {B44BD8E7-8AB3-68F6-9D96-154D16CEC9C0}.Release|x64.ActiveCfg = Release|x64
14
+ {B44BD8E7-8AB3-68F6-9D96-154D16CEC9C0}.Release|x64.Build.0 = Release|x64
15
15
  EndGlobalSection
16
16
  GlobalSection(SolutionProperties) = preSolution
17
17
  HideSolutionNode = FALSE
@@ -48,7 +48,7 @@
48
48
  </PropertyGroup>
49
49
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
50
50
  <ClCompile>
51
- <AdditionalIncludeDirectories>C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\include\node;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\src;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\openssl\config;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\openssl\openssl\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\uv\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\zlib;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\v8\include;..\node_modules\nan;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
51
+ <AdditionalIncludeDirectories>C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\include\node;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\src;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\openssl\config;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\openssl\openssl\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\uv\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\zlib;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\v8\include;..\node_modules\nan;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
52
52
  <AdditionalOptions>/Zc:__cplusplus -std:c++17 %(AdditionalOptions)</AdditionalOptions>
53
53
  <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
54
54
  <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -72,7 +72,7 @@
72
72
  <AdditionalOptions>/LTCG:INCREMENTAL %(AdditionalOptions)</AdditionalOptions>
73
73
  </Lib>
74
74
  <Link>
75
- <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;DelayImp.lib;&quot;C:\\Users\\paul.BLUECONIC\\AppData\\Local\\node-gyp\\Cache\\18.16.1\\x64\\node.lib&quot;</AdditionalDependencies>
75
+ <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;DelayImp.lib;&quot;C:\\Users\\paul.BLUECONIC\\AppData\\Local\\node-gyp\\Cache\\20.9.0\\x64\\node.lib&quot;</AdditionalDependencies>
76
76
  <AdditionalOptions>/LTCG:INCREMENTAL %(AdditionalOptions)</AdditionalOptions>
77
77
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
78
78
  <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -83,13 +83,13 @@
83
83
  <TargetMachine>MachineX64</TargetMachine>
84
84
  </Link>
85
85
  <ResourceCompile>
86
- <AdditionalIncludeDirectories>C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\include\node;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\src;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\openssl\config;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\openssl\openssl\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\uv\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\zlib;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\v8\include;..\node_modules\nan;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
86
+ <AdditionalIncludeDirectories>C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\include\node;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\src;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\openssl\config;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\openssl\openssl\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\uv\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\zlib;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\v8\include;..\node_modules\nan;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
87
87
  <PreprocessorDefinitions>NODE_GYP_MODULE_NAME=node_oom_heapdump_native;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;V8_DEPRECATION_WARNINGS;V8_IMMINENT_DEPRECATION_WARNINGS;_GLIBCXX_USE_CXX11_ABI=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;BUILDING_NODE_EXTENSION;DEBUG;_DEBUG;V8_ENABLE_CHECKS;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
88
88
  </ResourceCompile>
89
89
  </ItemDefinitionGroup>
90
90
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
91
91
  <ClCompile>
92
- <AdditionalIncludeDirectories>C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\include\node;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\src;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\openssl\config;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\openssl\openssl\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\uv\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\zlib;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\v8\include;..\node_modules\nan;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
92
+ <AdditionalIncludeDirectories>C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\include\node;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\src;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\openssl\config;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\openssl\openssl\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\uv\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\zlib;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\v8\include;..\node_modules\nan;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
93
93
  <AdditionalOptions>/Zc:__cplusplus -std:c++17 %(AdditionalOptions)</AdditionalOptions>
94
94
  <BufferSecurityCheck>true</BufferSecurityCheck>
95
95
  <DebugInformationFormat>OldStyle</DebugInformationFormat>
@@ -116,7 +116,7 @@
116
116
  <AdditionalOptions>/LTCG:INCREMENTAL %(AdditionalOptions)</AdditionalOptions>
117
117
  </Lib>
118
118
  <Link>
119
- <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;DelayImp.lib;&quot;C:\\Users\\paul.BLUECONIC\\AppData\\Local\\node-gyp\\Cache\\18.16.1\\x64\\node.lib&quot;</AdditionalDependencies>
119
+ <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;DelayImp.lib;&quot;C:\\Users\\paul.BLUECONIC\\AppData\\Local\\node-gyp\\Cache\\20.9.0\\x64\\node.lib&quot;</AdditionalDependencies>
120
120
  <AdditionalOptions>/LTCG:INCREMENTAL %(AdditionalOptions)</AdditionalOptions>
121
121
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
122
122
  <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -127,7 +127,7 @@
127
127
  <TargetMachine>MachineX64</TargetMachine>
128
128
  </Link>
129
129
  <ResourceCompile>
130
- <AdditionalIncludeDirectories>C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\include\node;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\src;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\openssl\config;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\openssl\openssl\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\uv\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\zlib;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\18.16.1\deps\v8\include;..\node_modules\nan;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
130
+ <AdditionalIncludeDirectories>C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\include\node;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\src;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\openssl\config;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\openssl\openssl\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\uv\include;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\zlib;C:\Users\paul.BLUECONIC\AppData\Local\node-gyp\Cache\20.9.0\deps\v8\include;..\node_modules\nan;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
131
131
  <PreprocessorDefinitions>NODE_GYP_MODULE_NAME=node_oom_heapdump_native;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;V8_DEPRECATION_WARNINGS;V8_IMMINENT_DEPRECATION_WARNINGS;_GLIBCXX_USE_CXX11_ABI=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;BUILDING_NODE_EXTENSION;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
132
132
  </ResourceCompile>
133
133
  </ItemDefinitionGroup>
@@ -2,10 +2,10 @@
2
2
  #include <v8-profiler.h>
3
3
  #include <stdlib.h>
4
4
  #if defined(_WIN32)
5
- #include <time.h>
6
- #define snprintf _snprintf
5
+ #include <time.h>
6
+ #define snprintf _snprintf
7
7
  #else
8
- #include <sys/time.h>
8
+ #include <sys/time.h>
9
9
  #endif
10
10
 
11
11
  using namespace v8;
@@ -14,47 +14,54 @@ char filename[256];
14
14
  bool addTimestamp;
15
15
  bool processingOOM = false;
16
16
 
17
- class FileOutputStream: public OutputStream {
18
- public:
19
- FileOutputStream(FILE* stream): stream_(stream) { }
20
- virtual int GetChunkSize() {
21
- return 65536;
22
- }
23
- virtual void EndOfStream() { }
24
- virtual WriteResult WriteAsciiChunk(char* data, int size) {
25
- const size_t len = static_cast<size_t>(size);
26
- size_t off = 0;
27
- while (off < len && !feof(stream_) && !ferror(stream_))
28
- off += fwrite(data + off, 1, len - off, stream_);
29
- return off == len ? kContinue : kAbort;
30
- }
31
-
32
- private:
33
- FILE* stream_;
17
+ class FileOutputStream : public OutputStream
18
+ {
19
+ public:
20
+ FileOutputStream(FILE *stream) : stream_(stream) {}
21
+ virtual int GetChunkSize()
22
+ {
23
+ return 65536;
24
+ }
25
+ virtual void EndOfStream() {}
26
+ virtual WriteResult WriteAsciiChunk(char *data, int size)
27
+ {
28
+ const size_t len = static_cast<size_t>(size);
29
+ size_t off = 0;
30
+ while (off < len && !feof(stream_) && !ferror(stream_))
31
+ off += fwrite(data + off, 1, len - off, stream_);
32
+ return off == len ? kContinue : kAbort;
33
+ }
34
+
35
+ private:
36
+ FILE *stream_;
34
37
  };
35
38
 
36
- size_t RaiseLimit(void* data, size_t current_heap_limit, size_t initial_heap_limit) {
39
+ size_t RaiseLimit(void *data, size_t current_heap_limit, size_t initial_heap_limit)
40
+ {
37
41
  return current_heap_limit + 10u * 1024 * 1024; // 10MiB
38
42
  }
39
43
 
40
- void OnOOMError(const char *location, bool is_heap_oom) {
41
- if (processingOOM) {
44
+ void OnOOMErrorHandler()
45
+ {
46
+ if (processingOOM)
47
+ {
42
48
  fprintf(stderr, "FATAL: OnOOMError called more than once.\n");
43
49
  exit(2);
44
50
  }
45
51
  processingOOM = true;
46
52
 
47
- if (addTimestamp) {
53
+ if (addTimestamp)
54
+ {
48
55
  // Add timestamp to filename
49
56
  time_t rawtime;
50
- struct tm* timeinfo;
57
+ struct tm *timeinfo;
51
58
  time(&rawtime);
52
59
  timeinfo = localtime(&rawtime);
53
60
 
54
- char * pch;
55
- pch = strstr (filename,".heapsnapshot");
56
- strncpy (pch,"",1);
57
- strcat (filename, "-%Y%m%dT%H%M%S.heapsnapshot");
61
+ char *pch;
62
+ pch = strstr(filename, ".heapsnapshot");
63
+ strncpy(pch, "", 1);
64
+ strcat(filename, "-%Y%m%dT%H%M%S.heapsnapshot");
58
65
 
59
66
  char newFilename[256];
60
67
  strftime(newFilename, sizeof(filename), filename, timeinfo);
@@ -62,10 +69,11 @@ void OnOOMError(const char *location, bool is_heap_oom) {
62
69
  }
63
70
 
64
71
  fprintf(stderr, "Generating Heapdump to '%s' now...\n", filename);
65
- FILE* fp = fopen(filename, "w");
66
- if (fp == NULL) abort();
72
+ FILE *fp = fopen(filename, "w");
73
+ if (fp == NULL)
74
+ abort();
67
75
 
68
- auto* isolate = v8::Isolate::GetCurrent();
76
+ auto *isolate = v8::Isolate::GetCurrent();
69
77
 
70
78
  // Capturing a heap snapshot forces a garbage collection which can, in turn,
71
79
  // trigger the OOM flow which causes recursion. To prevent this, this callback
@@ -76,7 +84,7 @@ void OnOOMError(const char *location, bool is_heap_oom) {
76
84
 
77
85
  // Create heapdump, depending on which Node.js version this can differ
78
86
  // for now, just support Node.js 7 and higher
79
- const HeapSnapshot* snap = isolate->GetHeapProfiler()->TakeHeapSnapshot();
87
+ const HeapSnapshot *snap = isolate->GetHeapProfiler()->TakeHeapSnapshot();
80
88
 
81
89
  FileOutputStream stream(fp);
82
90
  snap->Serialize(&stream, HeapSnapshot::kJSON);
@@ -86,33 +94,55 @@ void OnOOMError(const char *location, bool is_heap_oom) {
86
94
  exit(1);
87
95
  }
88
96
 
89
- void ParseArgumentsAndSetErrorHandler(const FunctionCallbackInfo<Value>& args) {
90
- Isolate* isolate = args.GetIsolate();
91
- isolate->SetOOMErrorHandler(OnOOMError);
97
+ #if NODE_VERSION_AT_LEAST(20, 0, 0)
98
+ void OnOOMErrorNode20(const char *location, const OOMDetails &details)
99
+ {
100
+ // Node20+
101
+ OnOOMErrorHandler();
102
+ }
103
+ #else
104
+ void OnOOMErrorNode18(const char *location, bool is_heap_oom)
105
+ {
106
+ // Up until Node18
107
+ OnOOMErrorHandler();
108
+ }
109
+ #endif
110
+
111
+ void ParseArgumentsAndSetErrorHandler(const FunctionCallbackInfo<Value> &args)
112
+ {
113
+ Isolate *isolate = args.GetIsolate();
114
+ #if NODE_VERSION_AT_LEAST(20, 0, 0)
115
+ // Node20+
116
+ isolate->SetOOMErrorHandler(OnOOMErrorNode20);
117
+ #else
118
+ // Up until Node18
119
+ isolate->SetOOMErrorHandler(OnOOMErrorNode18);
120
+ #endif
92
121
 
93
- // parse JS arguments
94
- // 1: filename
95
- // 2: addTimestamp boolean
96
- #if NODE_VERSION_AT_LEAST(13, 0, 0)
122
+ // parse JS arguments
123
+ // 1: filename
124
+ // 2: addTimestamp boolean
125
+ #if NODE_VERSION_AT_LEAST(13, 0, 0)
97
126
  Local<Context> context = isolate->GetCurrentContext();
98
127
  String::Utf8Value fArg(isolate, args[0]->ToString(context).ToLocalChecked());
99
- #elif NODE_VERSION_AT_LEAST(12, 0, 0)
128
+ #elif NODE_VERSION_AT_LEAST(12, 0, 0)
100
129
  String::Utf8Value fArg(isolate, args[0]->ToString(isolate));
101
- #elif NODE_VERSION_AT_LEAST(9, 0, 0)
130
+ #elif NODE_VERSION_AT_LEAST(9, 0, 0)
102
131
  String::Utf8Value fArg(isolate, args[0]->ToString());
103
- #else
132
+ #else
104
133
  String::Utf8Value fArg(args[0]->ToString());
105
- #endif
106
- strncpy(filename, (const char*)(*fArg), sizeof(filename) - 1);
134
+ #endif
135
+ strncpy(filename, (const char *)(*fArg), sizeof(filename) - 1);
107
136
 
108
- #if NODE_VERSION_AT_LEAST(12, 0, 0)
137
+ #if NODE_VERSION_AT_LEAST(12, 0, 0)
109
138
  addTimestamp = args[1]->BooleanValue(isolate);
110
- #else
139
+ #else
111
140
  addTimestamp = args[1]->BooleanValue();
112
- #endif
141
+ #endif
113
142
  }
114
143
 
115
- void init(Local<Object> exports) {
144
+ void init(Local<Object> exports)
145
+ {
116
146
  NODE_SET_METHOD(exports, "call", ParseArgumentsAndSetErrorHandler);
117
147
  }
118
148
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-oom-heapdump",
3
- "version": "3.1.0",
3
+ "version": "3.2.1",
4
4
  "description": "Create a V8 heap snapshot when an \"Out of Memory\" error occurs, or create a heap snapshot or CPU profile on request.",
5
5
  "main": "index.js",
6
6
  "scripts": {