@contrast/agent 4.5.1 → 4.7.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.
Files changed (209) hide show
  1. package/bin/VERSION +1 -1
  2. package/bin/linux/contrast-service +0 -0
  3. package/bin/mac/contrast-service +0 -0
  4. package/bin/windows/contrast-service.exe +0 -0
  5. package/lib/assess/membrane/deserialization-membrane.js +4 -5
  6. package/lib/assess/membrane/source-membrane.js +16 -33
  7. package/lib/assess/models/call-context.js +1 -1
  8. package/lib/assess/policy/propagators.json +19 -21
  9. package/lib/assess/policy/rules.json +7 -2
  10. package/lib/assess/policy/signatures.json +42 -0
  11. package/lib/assess/policy/util.js +2 -1
  12. package/lib/assess/propagators/JSON/parse.js +1 -1
  13. package/lib/assess/propagators/JSON/stringify.js +3 -3
  14. package/lib/assess/propagators/array-prototype-join.js +7 -8
  15. package/lib/assess/propagators/common.js +7 -5
  16. package/lib/assess/propagators/dustjs/escape-html.js +22 -0
  17. package/lib/assess/propagators/dustjs/escape-js.js +22 -0
  18. package/lib/assess/propagators/encode-uri/encode-uri-component.js +22 -0
  19. package/lib/assess/propagators/encode-uri/encode-uri.js +22 -0
  20. package/lib/assess/propagators/handlebars-escape-expresssion.js +1 -1
  21. package/lib/assess/propagators/index.js +0 -2
  22. package/lib/assess/propagators/joi/boolean.js +1 -1
  23. package/lib/assess/propagators/joi/expression.js +1 -1
  24. package/lib/assess/propagators/joi/number.js +1 -1
  25. package/lib/assess/propagators/joi/string-base.js +1 -1
  26. package/lib/assess/propagators/joi/string-schema.js +12 -13
  27. package/lib/assess/propagators/joi/values.js +37 -22
  28. package/lib/assess/propagators/manager.js +12 -10
  29. package/lib/assess/propagators/mongoose/helpers.js +20 -0
  30. package/lib/assess/propagators/mongoose/index.js +18 -0
  31. package/lib/assess/propagators/mongoose/map.js +74 -0
  32. package/lib/assess/propagators/mongoose/string.js +104 -0
  33. package/lib/assess/propagators/mustache/escape.js +22 -0
  34. package/lib/assess/propagators/number.js +54 -0
  35. package/lib/assess/propagators/object.js +6 -7
  36. package/lib/assess/propagators/path/basename.js +14 -13
  37. package/lib/assess/propagators/path/common.js +156 -47
  38. package/lib/assess/propagators/path/dirname.js +14 -13
  39. package/lib/assess/propagators/path/extname.js +14 -13
  40. package/lib/assess/propagators/path/join.js +5 -1
  41. package/lib/assess/propagators/path/normalize.js +1 -2
  42. package/lib/assess/propagators/path/parse.js +1 -1
  43. package/lib/assess/propagators/path/relative.js +7 -5
  44. package/lib/assess/propagators/path/resolve.js +11 -2
  45. package/lib/assess/propagators/querystring/escape.js +20 -18
  46. package/lib/assess/propagators/querystring/parse.js +7 -5
  47. package/lib/assess/propagators/querystring/stringify.js +25 -24
  48. package/lib/assess/propagators/querystring/unescape.js +20 -18
  49. package/lib/assess/propagators/sequelize/sql-string-escape.js +1 -1
  50. package/lib/assess/propagators/sequelize/sql-string-format-named-parameters.js +1 -1
  51. package/lib/assess/propagators/sequelize/sql-string-format.js +3 -3
  52. package/lib/assess/propagators/sequelize/utils.js +2 -2
  53. package/lib/assess/propagators/string-prototype-replace.js +30 -28
  54. package/lib/assess/propagators/string-prototype-split.js +36 -36
  55. package/lib/assess/propagators/string-prototype-trim.js +15 -17
  56. package/lib/assess/propagators/string.js +12 -16
  57. package/lib/assess/propagators/template-escape.js +87 -0
  58. package/lib/assess/propagators/templates.js +10 -11
  59. package/lib/assess/propagators/url/url-prototype-parse.js +5 -6
  60. package/lib/assess/propagators/url/url-url.js +51 -43
  61. package/lib/assess/propagators/util/format.js +1 -1
  62. package/lib/assess/propagators/v8/init-hooks.js +3 -3
  63. package/lib/assess/propagators/validator/init-hooks.js +22 -22
  64. package/lib/assess/sinks/common.js +10 -5
  65. package/lib/assess/sinks/dustjs-linkedin-xss.js +131 -0
  66. package/lib/assess/sinks/libxmljs-xxe.js +1 -1
  67. package/lib/assess/sinks/mongodb.js +2 -1
  68. package/lib/assess/sinks/ssrf-url.js +1 -1
  69. package/lib/constants.js +4 -1
  70. package/lib/core/arch-components/dynamodb.js +1 -2
  71. package/lib/core/arch-components/dynamodbv3.js +44 -0
  72. package/lib/core/arch-components/index.js +1 -0
  73. package/lib/core/arch-components/rethinkdb.js +53 -0
  74. package/lib/core/config/options.js +3 -2
  75. package/lib/core/rewrite/injections.js +8 -0
  76. package/lib/core/stacktrace.js +2 -1
  77. package/lib/feature-set.js +1 -1
  78. package/lib/hooks/frameworks/base.js +8 -2
  79. package/lib/hooks/frameworks/http.js +23 -16
  80. package/lib/hooks/frameworks/http2.js +73 -0
  81. package/lib/hooks/frameworks/index.js +8 -3
  82. package/lib/hooks/http.js +112 -128
  83. package/lib/hooks/object-to-primitive.js +6 -7
  84. package/lib/hooks/patcher.js +75 -44
  85. package/lib/hooks/require.js +16 -22
  86. package/lib/instrumentation.js +0 -3
  87. package/lib/protect/rules/nosqli/nosql-injection-rule.js +228 -0
  88. package/lib/protect/rules/rule-factory.js +2 -2
  89. package/lib/protect/service.js +23 -11
  90. package/lib/protect/sinks/mongodb.js +56 -55
  91. package/lib/reporter/translations/to-protobuf/dtm/index.js +1 -1
  92. package/lib/reporter/translations/to-protobuf/dtm/ip-denylist-details.js +1 -1
  93. package/lib/reporter/translations/to-protobuf/dtm/rasp-rule-sample.js +1 -1
  94. package/lib/reporter/translations/to-protobuf/settings/defend-features.js +8 -6
  95. package/lib/reporter/translations/to-protobuf/settings/exclusions.js +5 -4
  96. package/lib/tracker.js +13 -65
  97. package/lib/util/some.js +27 -0
  98. package/lib/util/source-map.js +1 -1
  99. package/package.json +15 -16
  100. package/lib/hooks/frameworks/https.js +0 -42
  101. package/lib/protect/rules/nosqli/no-sql-injection-rule.js +0 -109
  102. package/node_modules/bindings/LICENSE.md +0 -22
  103. package/node_modules/bindings/README.md +0 -98
  104. package/node_modules/bindings/bindings.js +0 -221
  105. package/node_modules/bindings/package.json +0 -32
  106. package/node_modules/file-uri-to-path/.npmignore +0 -1
  107. package/node_modules/file-uri-to-path/.travis.yml +0 -30
  108. package/node_modules/file-uri-to-path/History.md +0 -21
  109. package/node_modules/file-uri-to-path/LICENSE +0 -20
  110. package/node_modules/file-uri-to-path/README.md +0 -74
  111. package/node_modules/file-uri-to-path/index.d.ts +0 -2
  112. package/node_modules/file-uri-to-path/index.js +0 -66
  113. package/node_modules/file-uri-to-path/package.json +0 -36
  114. package/node_modules/file-uri-to-path/test/test.js +0 -24
  115. package/node_modules/file-uri-to-path/test/tests.json +0 -13
  116. package/node_modules/glossy/LICENSE +0 -19
  117. package/node_modules/glossy/README.md +0 -129
  118. package/node_modules/glossy/index.js +0 -12
  119. package/node_modules/glossy/lib/glossy/parse.js +0 -520
  120. package/node_modules/glossy/lib/glossy/produce.js +0 -459
  121. package/node_modules/glossy/package.json +0 -47
  122. package/node_modules/glossy/test/decide.js +0 -7
  123. package/node_modules/glossy/test/decode_pri.js +0 -24
  124. package/node_modules/glossy/test/parse_3164.js +0 -104
  125. package/node_modules/glossy/test/parse_5424.js +0 -106
  126. package/node_modules/glossy/test/parse_5848.js +0 -40
  127. package/node_modules/glossy/test/parse_8601.js +0 -14
  128. package/node_modules/glossy/test/parse_rfc3339.js +0 -9
  129. package/node_modules/glossy/test/produce.js +0 -162
  130. package/node_modules/glossy/test/runner.js +0 -40
  131. package/node_modules/glossy/test/structure_data.js +0 -24
  132. package/node_modules/nan/CHANGELOG.md +0 -537
  133. package/node_modules/nan/LICENSE.md +0 -13
  134. package/node_modules/nan/README.md +0 -455
  135. package/node_modules/nan/doc/asyncworker.md +0 -146
  136. package/node_modules/nan/doc/buffers.md +0 -54
  137. package/node_modules/nan/doc/callback.md +0 -76
  138. package/node_modules/nan/doc/converters.md +0 -41
  139. package/node_modules/nan/doc/errors.md +0 -226
  140. package/node_modules/nan/doc/json.md +0 -62
  141. package/node_modules/nan/doc/maybe_types.md +0 -583
  142. package/node_modules/nan/doc/methods.md +0 -664
  143. package/node_modules/nan/doc/new.md +0 -147
  144. package/node_modules/nan/doc/node_misc.md +0 -123
  145. package/node_modules/nan/doc/object_wrappers.md +0 -263
  146. package/node_modules/nan/doc/persistent.md +0 -296
  147. package/node_modules/nan/doc/scopes.md +0 -73
  148. package/node_modules/nan/doc/script.md +0 -38
  149. package/node_modules/nan/doc/string_bytes.md +0 -62
  150. package/node_modules/nan/doc/v8_internals.md +0 -199
  151. package/node_modules/nan/doc/v8_misc.md +0 -85
  152. package/node_modules/nan/include_dirs.js +0 -1
  153. package/node_modules/nan/nan.h +0 -2898
  154. package/node_modules/nan/nan_callbacks.h +0 -88
  155. package/node_modules/nan/nan_callbacks_12_inl.h +0 -514
  156. package/node_modules/nan/nan_callbacks_pre_12_inl.h +0 -520
  157. package/node_modules/nan/nan_converters.h +0 -72
  158. package/node_modules/nan/nan_converters_43_inl.h +0 -68
  159. package/node_modules/nan/nan_converters_pre_43_inl.h +0 -42
  160. package/node_modules/nan/nan_define_own_property_helper.h +0 -29
  161. package/node_modules/nan/nan_implementation_12_inl.h +0 -430
  162. package/node_modules/nan/nan_implementation_pre_12_inl.h +0 -263
  163. package/node_modules/nan/nan_json.h +0 -166
  164. package/node_modules/nan/nan_maybe_43_inl.h +0 -356
  165. package/node_modules/nan/nan_maybe_pre_43_inl.h +0 -268
  166. package/node_modules/nan/nan_new.h +0 -340
  167. package/node_modules/nan/nan_object_wrap.h +0 -156
  168. package/node_modules/nan/nan_persistent_12_inl.h +0 -132
  169. package/node_modules/nan/nan_persistent_pre_12_inl.h +0 -242
  170. package/node_modules/nan/nan_private.h +0 -73
  171. package/node_modules/nan/nan_string_bytes.h +0 -305
  172. package/node_modules/nan/nan_typedarray_contents.h +0 -96
  173. package/node_modules/nan/nan_weak.h +0 -437
  174. package/node_modules/nan/package.json +0 -41
  175. package/node_modules/nan/tools/1to2.js +0 -412
  176. package/node_modules/nan/tools/README.md +0 -14
  177. package/node_modules/nan/tools/package.json +0 -19
  178. package/node_modules/unix-dgram/LICENSE +0 -13
  179. package/node_modules/unix-dgram/README.md +0 -107
  180. package/node_modules/unix-dgram/binding.gyp +0 -20
  181. package/node_modules/unix-dgram/build/Makefile +0 -324
  182. package/node_modules/unix-dgram/build/Release/.deps/Release/obj.target/unix_dgram/src/unix_dgram.o.d +0 -58
  183. package/node_modules/unix-dgram/build/Release/.deps/Release/obj.target/unix_dgram.node.d +0 -1
  184. package/node_modules/unix-dgram/build/Release/.deps/Release/unix_dgram.node.d +0 -1
  185. package/node_modules/unix-dgram/build/Release/obj.target/unix_dgram/src/unix_dgram.o +0 -0
  186. package/node_modules/unix-dgram/build/Release/obj.target/unix_dgram.node +0 -0
  187. package/node_modules/unix-dgram/build/Release/unix_dgram.node +0 -0
  188. package/node_modules/unix-dgram/build/binding.Makefile +0 -6
  189. package/node_modules/unix-dgram/build/config.gypi +0 -213
  190. package/node_modules/unix-dgram/build/unix_dgram.target.mk +0 -159
  191. package/node_modules/unix-dgram/lib/unix_dgram.js +0 -168
  192. package/node_modules/unix-dgram/package.json +0 -36
  193. package/node_modules/unix-dgram/src/unix_dgram.cc +0 -404
  194. package/node_modules/unix-dgram/src/win_dummy.cc +0 -7
  195. package/node_modules/unix-dgram/test/test-connect-callback.js +0 -68
  196. package/node_modules/unix-dgram/test/test-connect.js +0 -53
  197. package/node_modules/unix-dgram/test/test-dgram-unix.js +0 -58
  198. package/node_modules/unix-dgram/test/test-send-error.js +0 -26
  199. package/node_modules/winston-syslog/.eslintrc +0 -7
  200. package/node_modules/winston-syslog/.travis.yml +0 -14
  201. package/node_modules/winston-syslog/CHANGELOG.md +0 -9
  202. package/node_modules/winston-syslog/LICENSE +0 -20
  203. package/node_modules/winston-syslog/README.md +0 -135
  204. package/node_modules/winston-syslog/lib/utils.js +0 -26
  205. package/node_modules/winston-syslog/lib/winston-syslog.js +0 -385
  206. package/node_modules/winston-syslog/package.json +0 -56
  207. package/node_modules/winston-syslog/test/format-test.js +0 -122
  208. package/node_modules/winston-syslog/test/syslog-test.js +0 -95
  209. package/node_modules/winston-syslog/test/unix-connect-test.js +0 -133
@@ -1,135 +0,0 @@
1
- # winston-syslog
2
-
3
- A Syslog transport for [winston][0].
4
-
5
- [![Version npm](https://img.shields.io/npm/v/winston-syslog.svg?style=flat-square)](https://www.npmjs.com/package/winston-syslog)[![npm
6
- Downloads](https://img.shields.io/npm/dm/winston-syslog.svg?style=flat-square)](https://npmcharts.com/compare/winston-syslog?minimal=true)[![Build
7
- Status](https://img.shields.io/travis/winstonjs/winston-syslog/master.svg?style=flat-square)](https://travis-ci.org/winstonjs/winston-syslog)[![Dependencies](https://img.shields.io/david/winstonjs/winston-syslog.svg?style=flat-square)](https://david-dm.org/winstonjs/winston-syslog)
8
-
9
- [![NPM](https://nodei.co/npm/winston-syslog.png?downloads=true&downloadRank=true)](https://nodei.co/npm/winston-syslog/)
10
-
11
- ## Requirements
12
-
13
- * winston >= 3.0.0
14
-
15
- ## Installation
16
-
17
- ### Installing npm (node package manager)
18
-
19
- ``` bash
20
- $ curl http://npmjs.org/install.sh | sh
21
- ```
22
-
23
- ### Installing winston-syslog
24
-
25
- ``` bash
26
- $ npm install winston
27
- $ npm install winston-syslog
28
- ```
29
-
30
- ## Motivation
31
- `tldr;?`: To break the [winston][0] codebase into small modules that work together.
32
-
33
- The [winston][0] codebase has been growing significantly with contributions and other logging transports. This is **awesome**. However, taking a ton of additional dependencies just to do something simple like logging to the Console and a File is overkill.
34
-
35
- ## Usage
36
- To use the Syslog transport in [winston][0], you simply need to require it and then either add it to an existing [winston][0] logger or pass an instance to a new [winston][0] logger:
37
-
38
- ``` js
39
- const winston = require('winston');
40
-
41
- //
42
- // Requiring `winston-syslog` will expose
43
- // `winston.transports.Syslog`
44
- //
45
- require('winston-syslog').Syslog;
46
-
47
- winston.add(new winston.transports.Syslog(options));
48
- ```
49
-
50
- In addition to the options accepted by the syslog (compliant with [RFC 3164][1] and [RFC 5424][2]), the Riak transport also accepts the following options. It is worth noting that the riak-js debug option is set to *false* by default:
51
-
52
- * __host:__ The host running syslogd, defaults to localhost.
53
- * __port:__ The port on the host that syslog is running on, defaults to syslogd's default port.
54
- * __protocol:__ The network protocol to log over (e.g. `tcp4`, `udp4`, `unix`, `unix-connect`, etc).
55
- * __path:__ The path to the syslog dgram socket (i.e. `/dev/log` or `/var/run/syslog` for OS X).
56
- * __pid:__ PID of the process that log messages are coming from (Default `process.pid`).
57
- * __facility:__ Syslog facility to use (Default: `local0`).
58
- * __localhost:__ Host to indicate that log messages are coming from (Default: `localhost`).
59
- * __type:__ The type of the syslog protocol to use (Default: `BSD`, also valid: `5424`).
60
- * __app_name:__ The name of the application (Default: `process.title`).
61
- * __eol:__ The end of line character to be added to the end of the message (Default: Message without modifications).
62
-
63
- *Metadata:* Logged as string compiled by [glossy][3].
64
-
65
- ## Log Levels
66
- Because syslog only allows a subset of the levels available in [winston][0], levels that do not match will be ignored. Therefore, in order to use `winston-syslog` effectively, you should indicate to [winston][0] that you want to use the syslog levels:
67
-
68
- ``` js
69
- const winston = require('winston');
70
- const logger = winston.createLogger({
71
- levels: winston.config.syslog.levels,
72
- transports: [
73
- new winston.transports.Syslog()
74
- ]
75
- });
76
- ```
77
-
78
- The `Syslog` transport will only log to the level that are available in the syslog protocol. These are (in increasing order of severity):
79
-
80
- * debug
81
- * info
82
- * notice
83
- * warning
84
- * error
85
- * crit
86
- * alert
87
- * emerg
88
-
89
- ## Syslog Configuration
90
-
91
- You will have to configure your syslog server to accept TCP connections.
92
- This is usually done in `/etc/syslog-ng.conf`. Let's say you have an app called `fnord`,
93
- the configuration would look something like this:
94
-
95
- ```
96
- source tcp_s {
97
- tcp(ip(0.0.0.0) port(514) max-connections(256));
98
- };
99
- destination fnord_d {
100
- file("/var/log/fnord.log");
101
- };
102
- log { source(tcp_s); destination(fnord_d); };
103
- ```
104
-
105
- If you have multiple apps which need to log via TCP, you can specify filters, as such:
106
-
107
- ```
108
- filter fnord_f { program("fnord"); };
109
- ```
110
-
111
- Then modify the log statement to read:
112
-
113
- ```
114
- log { source(tcp_s); filter(fnord_f); destination(fnord_d); };
115
- ```
116
-
117
- Now if you have another app, called `bnord`, create similar `destination` and `filter` configurations for it, and specify a new log statement, with the same `source`:
118
-
119
- ```
120
- log { source(tcp_s); filter(bnord_f); destination(bnord_d); };
121
- ```
122
-
123
- For this to work, you have to make sure you set the `process.title` variable in your node app.
124
-
125
- ``` js
126
- process.title = 'fnord';
127
- ```
128
-
129
- #### Author: [Charlie Robbins](http://blog.nodejitsu.com)
130
- #### Contributors: [Squeeks](https://github.com/squeeks)
131
-
132
- [0]: https://github.com/indexzero/winston
133
- [1]: http://www.ietf.org/rfc/rfc3164.txt
134
- [2]: http://tools.ietf.org/html/rfc5424
135
- [3]: https://github.com/squeeks/glossy
@@ -1,26 +0,0 @@
1
- 'use strict';
2
-
3
- exports.parseProtocol = function parseProtocol(protocol) {
4
- switch (protocol) {
5
- case 'unix':
6
- case 'unix-connect':
7
- return { type: 'unix', family: null, isDgram: true };
8
-
9
- case 'udp':
10
- case 'udp4':
11
- return { type: 'udp', family: 4, isDgram: true };
12
-
13
- case 'udp6':
14
- return { type: 'udp', family: 6, isDgram: true };
15
-
16
- case 'tcp':
17
- case 'tcp4':
18
- return { type: 'tcp', family: 4 };
19
-
20
- case 'tcp6':
21
- return { type: 'tcp', family: 6 };
22
-
23
- default:
24
- throw new Error('Invalid syslog protocol: ' + protocol);
25
- }
26
- };
@@ -1,385 +0,0 @@
1
- /*
2
- * syslog.js: Transport for logging to a remote syslog consumer
3
- *
4
- * (C) 2011 Squeeks and Charlie Robbins
5
- * MIT LICENCE
6
- *
7
- */
8
-
9
- const dgram = require('dgram');
10
- const net = require('net');
11
- const utils = require('./utils');
12
- const glossy = require('glossy');
13
- const winston = require('winston');
14
- const Transport = require('winston-transport');
15
- const { MESSAGE, LEVEL } = require('triple-beam');
16
-
17
- // Ensure we have the correct winston here.
18
- if (Number(winston.version.split('.')[0]) < 3) {
19
- throw new Error('Winston-syslog requires winston >= 3.0.0');
20
- }
21
-
22
- const levels = Object.keys({
23
- debug: 0,
24
- info: 1,
25
- notice: 2,
26
- warning: 3,
27
- error: 4,
28
- crit: 5,
29
- alert: 6,
30
- emerg: 7
31
- });
32
-
33
- //
34
- // ### function Syslog (options)
35
- // #### @options {Object} Options for this instance.
36
- // Constructor function for the Syslog Transport capable of sending
37
- // RFC 3164 and RFC 5424 compliant messages.
38
- //
39
- class Syslog extends Transport {
40
- //
41
- // Expose the name of this Transport on the prototype
42
- //
43
- get name() {
44
- return 'syslog';
45
- }
46
-
47
- constructor(options = {}) {
48
- //
49
- // Inherit from `winston-transport`.
50
- //
51
- super(options);
52
-
53
- //
54
- // Setup connection state
55
- //
56
- this.connected = false;
57
- this.congested = false;
58
- this.retries = 0;
59
- this.queue = [];
60
- this.inFlight = 0;
61
-
62
- //
63
- // Merge the options for the target Syslog server.
64
- //
65
- this.setOptions(options);
66
-
67
- //
68
- // Setup our Syslog and network members for later use.
69
- //
70
- this.socket = null;
71
- this.producer = new glossy.Produce({
72
- type: this.type,
73
- appName: this.appName,
74
- pid: this.pid,
75
- facility: this.facility
76
- });
77
- }
78
-
79
- setOptions(options) {
80
- this.host = options.host || 'localhost';
81
- this.port = options.port || 514;
82
- this.path = options.path || null;
83
- this.protocol = options.protocol || 'udp4';
84
- this.endOfLine = options.eol;
85
-
86
- this.parseProtocol(this.protocol);
87
-
88
- //
89
- // Merge the default message options.
90
- //
91
- this.localhost = typeof options.localhost !== 'undefined' ? options.localhost : 'localhost';
92
- this.type = options.type || 'BSD';
93
- this.facility = options.facility || 'local0';
94
- this.pid = options.pid || process.pid;
95
- this.appName = options.appName || options.app_name || process.title;
96
- }
97
-
98
- parseProtocol(protocol = this.protocol) {
99
- const parsedProtocol = utils.parseProtocol(protocol);
100
-
101
- this.protocolType = parsedProtocol.type;
102
- this.protocolFamily = parsedProtocol.family;
103
- this.isDgram = parsedProtocol.isDgram;
104
-
105
- if (this.protocolType === 'unix' && !this.path) {
106
- throw new Error('`options.path` is required on unix dgram sockets.');
107
- }
108
- }
109
-
110
- //
111
- // ### function log (info, callback)
112
- // #### @info {object} All relevant log information
113
- // #### @callback {function} Continuation to respond to when complete.
114
- // Core logging method exposed to Winston. Logs the `msg` and optional
115
- // metadata, `meta`, to the specified `level`.
116
- //
117
- log(info, callback) {
118
- if (!~levels.indexOf(info[LEVEL])) {
119
- return callback(new Error('Cannot log unknown syslog level: ' + info[LEVEL]));
120
- }
121
-
122
- const output = info[MESSAGE];
123
-
124
- const syslogMsg = this.producer.produce({
125
- severity: info[LEVEL],
126
- host: this.localhost,
127
- date: new Date(),
128
- message: this.endOfLine ? output + this.endOfLine : output
129
- });
130
-
131
- //
132
- // Attempt to connect to the socket
133
- //
134
- this.connect((err) => {
135
- if (err) {
136
- //
137
- // If there was an error enqueue the message
138
- //
139
- this.queue.push(syslogMsg);
140
-
141
- return callback(err);
142
- }
143
-
144
- //
145
- // On any error writing to the socket, enqueue the message
146
- //
147
- const onError = (logErr) => {
148
- if (logErr) {
149
- this.queue.push(syslogMsg);
150
- this.emit('error', logErr);
151
- }
152
- this.emit('logged', info);
153
- this.inFlight--;
154
- };
155
-
156
- const onCongestion = () => {
157
- onError(new Error('Congestion Error'));
158
- };
159
-
160
- const sendDgram = () => {
161
- const buffer = new Buffer(syslogMsg);
162
-
163
- if (this.protocolType === 'udp') {
164
- this.inFlight++;
165
- this.socket.send(buffer, 0, buffer.length, this.port, this.host, onError);
166
- } else if (this.protocol === 'unix') {
167
- this.inFlight++;
168
- this.socket.send(buffer, 0, buffer.length, this.path, onError);
169
- } else if (this.congested) {
170
- this.queue.push(syslogMsg);
171
- } else {
172
- this.socket.once('congestion', onCongestion);
173
- this.inFlight++;
174
- this.socket.send(buffer, (e) => {
175
- this.socket.removeListener('congestion', onCongestion);
176
- onError(e);
177
- });
178
- }
179
- };
180
-
181
- //
182
- // Write to the `tcp*`, `udp*`, or `unix` socket.
183
- //
184
- if (this.isDgram) {
185
- sendDgram();
186
- } else {
187
- this.socket.write(syslogMsg, 'utf8', onError);
188
- }
189
-
190
- callback(null, true);
191
- });
192
- }
193
-
194
- //
195
- // ### function close ()
196
- // Closes the socket used by this transport freeing the resource.
197
- //
198
- close() {
199
- const max = 6;
200
- let attempt = 0;
201
-
202
- const _close = () => {
203
- if (attempt >= max || (this.queue.length === 0 && this.inFlight <= 0)) {
204
- if (this.socket) {
205
- this.socket.close();
206
- }
207
-
208
- this.emit('closed', this.socket);
209
- } else {
210
- attempt++;
211
- setTimeout(_close, 200 * attempt);
212
- }
213
- };
214
- _close();
215
- }
216
-
217
- connectDgram(callback) {
218
- if (this.protocol === 'unix-connect') {
219
- return this._unixDgramConnect(callback);
220
- } else if (this.protocol === 'unix') {
221
- this.socket = require('unix-dgram').createSocket('unix_dgram');
222
- } else {
223
- // UDP protocol
224
- this.socket = new dgram.Socket(this.protocol);
225
- }
226
-
227
- return callback(null);
228
- }
229
- //
230
- // ### function connect (callback)
231
- // #### @callback {function} Continuation to respond to when complete.
232
- // Connects to the remote syslog server using `dgram` or `net` depending
233
- // on the `protocol` for this instance.
234
- //
235
- connect(callback) {
236
- //
237
- // If the socket already exists then respond
238
- //
239
- if (this.socket) {
240
- return ((!this.socket.readyState) || (this.socket.readyState === 'open')) || this.socket.connected
241
- ? callback(null)
242
- : callback(true);
243
- }
244
-
245
- //
246
- // Create the appropriate socket type.
247
- //
248
- if (this.isDgram) {
249
- return this.connectDgram(callback);
250
- }
251
-
252
- this.socket = new net.Socket();
253
- this.socket.setKeepAlive(true);
254
- this.socket.setNoDelay();
255
-
256
- this.setupEvents();
257
-
258
- const connectConfig = {
259
- host: this.host,
260
- port: this.port
261
- };
262
-
263
- if (this.protocolFamily) {
264
- connectConfig.family = this.protocolFamily;
265
- }
266
-
267
- this.socket.connect(connectConfig);
268
-
269
- //
270
- // Indicate to the callee that the socket is not ready. This
271
- // will enqueue the current message for later.
272
- //
273
- callback(true);
274
- }
275
-
276
- setupEvents() {
277
- const readyEvent = 'connect';
278
- //
279
- // On any error writing to the socket, emit the `logged` event
280
- // and the `error` event.
281
- //
282
- const onError = (logErr) => {
283
- if (logErr) { this.emit('error', logErr); }
284
- this.emit('logged');
285
- this.inFlight--;
286
- };
287
-
288
- //
289
- // Listen to the appropriate events on the socket that
290
- // was just created.
291
- //
292
- this.socket.on(readyEvent, () => {
293
- //
294
- // When the socket is ready, write the current queue
295
- // to it.
296
- //
297
- this.socket.write(this.queue.join(''), 'utf8', onError);
298
-
299
- this.emit('logged');
300
- this.queue = [];
301
- this.retries = 0;
302
- this.connected = true;
303
- }).on('error', function () {
304
- //
305
- // TODO: Pass this error back up
306
- //
307
- }).on('close', () => {
308
- //
309
- // Attempt to reconnect on lost connection(s), progressively
310
- // increasing the amount of time between each try.
311
- //
312
- const interval = Math.pow(2, this.retries);
313
- this.connected = false;
314
-
315
- setTimeout(() => {
316
- this.retries++;
317
- this.socket.connect(this.port, this.host);
318
- }, interval * 1000);
319
- }).on('timeout', () => {
320
- if (this.socket.readyState !== 'open') {
321
- this.socket.destroy();
322
- }
323
- });
324
- }
325
-
326
- _unixDgramConnect(callback) {
327
- const self = this;
328
-
329
- const flushQueue = () => {
330
- let sentMsgs = 0;
331
- this.queue.forEach((msg) => {
332
- const buffer = new Buffer(msg);
333
-
334
- if (!this.congested) {
335
- this.socket.send(buffer, function () {
336
- ++sentMsgs;
337
- });
338
- }
339
- });
340
-
341
- this.queue.splice(0, sentMsgs);
342
- };
343
-
344
- this.socket = require('unix-dgram').createSocket('unix_dgram');
345
- this.socket.on('error', (err) => {
346
- this.emit('error', err);
347
-
348
- if (err.syscall === 'connect') {
349
- this.socket.close();
350
- this.socket = null;
351
- return callback(err);
352
- }
353
- if (err.syscall === 'send') {
354
- this.socket.close();
355
- this.socket = null;
356
- }
357
- });
358
-
359
- this.socket.on('connect', function () {
360
- this.on('congestion', () => {
361
- self.congested = true;
362
- });
363
-
364
- this.on('writable', () => {
365
- self.congested = false;
366
- flushQueue();
367
- });
368
-
369
- flushQueue();
370
- callback();
371
- });
372
-
373
- this.socket.connect(this.path);
374
- }
375
- }
376
-
377
- //
378
- // Define a getter so that `winston.transports.Syslog`
379
- // is available and thus backwards compatible.
380
- //
381
- winston.transports.Syslog = Syslog;
382
-
383
- module.exports = {
384
- Syslog
385
- };
@@ -1,56 +0,0 @@
1
- {
2
- "name": "winston-syslog",
3
- "description": "A syslog transport for winston",
4
- "version": "2.1.0",
5
- "author": "Charlie Robbins <charlie.robbins@gmail.com>",
6
- "contributors": [
7
- {
8
- "name": "Squeeks",
9
- "email": "privacymyass@gmail.com"
10
- },
11
- {
12
- "name": "Mempf",
13
- "email": "mempf.com@gmail.com"
14
- }
15
- ],
16
- "repository": {
17
- "type": "git",
18
- "url": "http://github.com/indexzero/winston-syslog.git"
19
- },
20
- "keywords": [
21
- "logging",
22
- "sysadmin",
23
- "tools",
24
- "winston",
25
- "syslog"
26
- ],
27
- "dependencies": {
28
- "cycle": "^1.0.3",
29
- "glossy": "^0.1.7"
30
- },
31
- "optionalDependencies": {
32
- "unix-dgram": "^2.0.2"
33
- },
34
- "peerDependencies": {
35
- "winston": "^3.0.0"
36
- },
37
- "devDependencies": {
38
- "eslint-config-populist": "^4.1.0",
39
- "vows": "^0.8.2",
40
- "winston": "^3.0.0"
41
- },
42
- "main": "./lib/winston-syslog",
43
- "scripts": {
44
- "lint": "populist **/*.js",
45
- "pretest": "npm run lint",
46
- "test": "vows test/*-test.js --spec"
47
- },
48
- "engines": {
49
- "node": ">= 4.2.2"
50
- },
51
- "license": "MIT"
52
-
53
- ,"_resolved": "https://registry.npmjs.org/winston-syslog/-/winston-syslog-2.1.0.tgz"
54
- ,"_integrity": "sha512-y6wHm7vd99tcpIar6fNM5Widx7Kemf2iguGLC9wty351wqQU9LewRaMraj3FvO2xPJF6P4a4BuSN3jGx/tnIqg=="
55
- ,"_from": "winston-syslog@2.1.0"
56
- }