typespeed 2.0.13 → 2.0.16

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 (222) hide show
  1. package/dist/core.decorator.js +0 -1
  2. package/dist/database.decorator.js +0 -1
  3. package/dist/default/express-server.class.js +0 -1
  4. package/dist/default/log-default.class.js +0 -1
  5. package/dist/default/node-cache.class.js +0 -1
  6. package/dist/default/rabbitmq.class.js +0 -1
  7. package/dist/default/read-write-db.class.js +0 -1
  8. package/dist/default/redis.class.js +0 -1
  9. package/dist/factory/cache-factory.class.js +0 -1
  10. package/dist/factory/data-source-factory.class.js +0 -1
  11. package/dist/factory/log-factory.class.js +0 -1
  12. package/dist/factory/server-factory.class.js +0 -1
  13. package/dist/route.decorator.js +0 -1
  14. package/dist/scaffold/command.js +0 -1
  15. package/dist/typespeed.d.ts +133 -12
  16. package/dist/typespeed.js +1 -1
  17. package/package.json +2 -2
  18. package/src/typespeed.d.ts +133 -0
  19. package/src/typespeed.ts +2 -1
  20. package/test/node_modules/.package-lock.json +112 -4
  21. package/test/node_modules/@acuminous/bitsyntax/.github/workflows/node-js-ci.yml +17 -0
  22. package/test/node_modules/@acuminous/bitsyntax/.github/workflows/node-js-publish.yml +30 -0
  23. package/test/node_modules/@acuminous/bitsyntax/LICENSE +6 -0
  24. package/test/node_modules/@acuminous/bitsyntax/LICENSE-MIT +21 -0
  25. package/test/node_modules/@acuminous/bitsyntax/Makefile +15 -0
  26. package/test/node_modules/@acuminous/bitsyntax/README.md +308 -0
  27. package/test/node_modules/@acuminous/bitsyntax/index.js +10 -0
  28. package/test/node_modules/@acuminous/bitsyntax/lib/compile.js +303 -0
  29. package/test/node_modules/@acuminous/bitsyntax/lib/constructor.js +142 -0
  30. package/test/node_modules/@acuminous/bitsyntax/lib/grammar.pegjs +67 -0
  31. package/test/node_modules/@acuminous/bitsyntax/lib/interp.js +232 -0
  32. package/test/node_modules/@acuminous/bitsyntax/lib/parse.js +32 -0
  33. package/test/node_modules/@acuminous/bitsyntax/lib/parser.js +1173 -0
  34. package/test/node_modules/@acuminous/bitsyntax/lib/pattern.js +119 -0
  35. package/test/node_modules/@acuminous/bitsyntax/package.json +36 -0
  36. package/test/node_modules/@acuminous/bitsyntax/test/consing.test.js +50 -0
  37. package/test/node_modules/@acuminous/bitsyntax/test/matching.test.js +193 -0
  38. package/test/node_modules/@types/node/README.md +1 -1
  39. package/test/node_modules/@types/node/buffer.d.ts +5 -2
  40. package/test/node_modules/@types/node/child_process.d.ts +27 -0
  41. package/test/node_modules/@types/node/globals.d.ts +1 -0
  42. package/test/node_modules/@types/node/package.json +2 -2
  43. package/test/node_modules/@types/node/test.d.ts +43 -20
  44. package/test/node_modules/@types/node/ts4.8/buffer.d.ts +5 -2
  45. package/test/node_modules/@types/node/ts4.8/child_process.d.ts +27 -0
  46. package/test/node_modules/@types/node/ts4.8/globals.d.ts +1 -0
  47. package/test/node_modules/@types/node/ts4.8/test.d.ts +43 -19
  48. package/test/node_modules/@types/node/ts4.8/url.d.ts +3 -3
  49. package/test/node_modules/@types/node/ts4.8/util.d.ts +1 -1
  50. package/test/node_modules/@types/node/url.d.ts +3 -3
  51. package/test/node_modules/@types/node/util.d.ts +1 -1
  52. package/test/node_modules/amqplib/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  53. package/test/node_modules/amqplib/.github/workflows/test.yml +38 -0
  54. package/test/node_modules/amqplib/CHANGELOG.md +430 -0
  55. package/test/node_modules/amqplib/LICENSE +6 -0
  56. package/test/node_modules/amqplib/LICENSE-MIT +21 -0
  57. package/test/node_modules/amqplib/Makefile +47 -0
  58. package/test/node_modules/amqplib/README.md +157 -0
  59. package/test/node_modules/amqplib/bin/generate-defs.js +722 -0
  60. package/test/node_modules/amqplib/callback_api.js +22 -0
  61. package/test/node_modules/amqplib/channel_api.js +16 -0
  62. package/test/node_modules/amqplib/examples/headers.js +42 -0
  63. package/test/node_modules/amqplib/examples/receive_generator.js +39 -0
  64. package/test/node_modules/amqplib/examples/send_generators.js +42 -0
  65. package/test/node_modules/amqplib/examples/ssl.js +64 -0
  66. package/test/node_modules/amqplib/examples/tutorials/README.md +93 -0
  67. package/test/node_modules/amqplib/examples/tutorials/callback_api/emit_log.js +28 -0
  68. package/test/node_modules/amqplib/examples/tutorials/callback_api/emit_log_direct.js +30 -0
  69. package/test/node_modules/amqplib/examples/tutorials/callback_api/emit_log_topic.js +27 -0
  70. package/test/node_modules/amqplib/examples/tutorials/callback_api/new_task.js +27 -0
  71. package/test/node_modules/amqplib/examples/tutorials/callback_api/receive.js +30 -0
  72. package/test/node_modules/amqplib/examples/tutorials/callback_api/receive_logs.js +36 -0
  73. package/test/node_modules/amqplib/examples/tutorials/callback_api/receive_logs_direct.js +56 -0
  74. package/test/node_modules/amqplib/examples/tutorials/callback_api/receive_logs_topic.js +55 -0
  75. package/test/node_modules/amqplib/examples/tutorials/callback_api/rpc_client.js +49 -0
  76. package/test/node_modules/amqplib/examples/tutorials/callback_api/rpc_server.js +45 -0
  77. package/test/node_modules/amqplib/examples/tutorials/callback_api/send.js +29 -0
  78. package/test/node_modules/amqplib/examples/tutorials/callback_api/worker.js +35 -0
  79. package/test/node_modules/amqplib/examples/tutorials/emit_log.js +19 -0
  80. package/test/node_modules/amqplib/examples/tutorials/emit_log_direct.js +20 -0
  81. package/test/node_modules/amqplib/examples/tutorials/emit_log_topic.js +19 -0
  82. package/test/node_modules/amqplib/examples/tutorials/new_task.js +18 -0
  83. package/test/node_modules/amqplib/examples/tutorials/package.json +16 -0
  84. package/test/node_modules/amqplib/examples/tutorials/receive.js +21 -0
  85. package/test/node_modules/amqplib/examples/tutorials/receive_logs.js +28 -0
  86. package/test/node_modules/amqplib/examples/tutorials/receive_logs_direct.js +44 -0
  87. package/test/node_modules/amqplib/examples/tutorials/receive_logs_topic.js +43 -0
  88. package/test/node_modules/amqplib/examples/tutorials/rpc_client.js +52 -0
  89. package/test/node_modules/amqplib/examples/tutorials/rpc_server.js +39 -0
  90. package/test/node_modules/amqplib/examples/tutorials/send.js +23 -0
  91. package/test/node_modules/amqplib/examples/tutorials/worker.js +28 -0
  92. package/test/node_modules/amqplib/examples/waitForConfirms.js +22 -0
  93. package/test/node_modules/amqplib/lib/api_args.js +314 -0
  94. package/test/node_modules/amqplib/lib/bitset.js +130 -0
  95. package/test/node_modules/amqplib/lib/callback_model.js +327 -0
  96. package/test/node_modules/amqplib/lib/channel.js +499 -0
  97. package/test/node_modules/amqplib/lib/channel_model.js +302 -0
  98. package/test/node_modules/amqplib/lib/codec.js +321 -0
  99. package/test/node_modules/amqplib/lib/connect.js +189 -0
  100. package/test/node_modules/amqplib/lib/connection.js +663 -0
  101. package/test/node_modules/amqplib/lib/credentials.js +42 -0
  102. package/test/node_modules/amqplib/lib/defs.js +4966 -0
  103. package/test/node_modules/amqplib/lib/error.js +24 -0
  104. package/test/node_modules/amqplib/lib/format.js +40 -0
  105. package/test/node_modules/amqplib/lib/frame.js +113 -0
  106. package/test/node_modules/amqplib/lib/heartbeat.js +89 -0
  107. package/test/node_modules/amqplib/lib/mux.js +129 -0
  108. package/test/node_modules/amqplib/package.json +37 -0
  109. package/test/node_modules/amqplib/test/bitset.js +69 -0
  110. package/test/node_modules/amqplib/test/callback_api.js +312 -0
  111. package/test/node_modules/amqplib/test/channel.js +621 -0
  112. package/test/node_modules/amqplib/test/channel_api.js +596 -0
  113. package/test/node_modules/amqplib/test/codec.js +237 -0
  114. package/test/node_modules/amqplib/test/connect.js +197 -0
  115. package/test/node_modules/amqplib/test/connection.js +390 -0
  116. package/test/node_modules/amqplib/test/data.js +254 -0
  117. package/test/node_modules/amqplib/test/frame.js +198 -0
  118. package/test/node_modules/amqplib/test/mux.js +204 -0
  119. package/test/node_modules/amqplib/test/util.js +219 -0
  120. package/test/node_modules/buffer-more-ints/.travis.yml +6 -0
  121. package/test/node_modules/buffer-more-ints/LICENSE +19 -0
  122. package/test/node_modules/buffer-more-ints/README.md +69 -0
  123. package/test/node_modules/buffer-more-ints/buffer-more-ints-tests.js +183 -0
  124. package/test/node_modules/buffer-more-ints/buffer-more-ints.js +432 -0
  125. package/test/node_modules/buffer-more-ints/package.json +19 -0
  126. package/test/node_modules/buffer-more-ints/polyfill.js +71 -0
  127. package/test/node_modules/core-util-is/LICENSE +19 -0
  128. package/test/node_modules/core-util-is/README.md +3 -0
  129. package/test/node_modules/core-util-is/lib/util.js +107 -0
  130. package/test/node_modules/core-util-is/package.json +38 -0
  131. package/test/node_modules/debug/LICENSE +20 -0
  132. package/test/node_modules/debug/README.md +481 -0
  133. package/test/node_modules/debug/package.json +59 -0
  134. package/test/node_modules/debug/src/browser.js +269 -0
  135. package/test/node_modules/debug/src/common.js +274 -0
  136. package/test/node_modules/debug/src/index.js +10 -0
  137. package/test/node_modules/debug/src/node.js +263 -0
  138. package/test/node_modules/inherits/LICENSE +16 -0
  139. package/test/node_modules/inherits/README.md +42 -0
  140. package/test/node_modules/inherits/inherits.js +9 -0
  141. package/test/node_modules/inherits/inherits_browser.js +27 -0
  142. package/test/node_modules/inherits/package.json +29 -0
  143. package/test/node_modules/isarray/README.md +54 -0
  144. package/test/node_modules/isarray/build/build.js +209 -0
  145. package/test/node_modules/isarray/component.json +19 -0
  146. package/test/node_modules/isarray/index.js +3 -0
  147. package/test/node_modules/isarray/package.json +25 -0
  148. package/test/node_modules/ms/index.js +162 -0
  149. package/test/node_modules/ms/license.md +21 -0
  150. package/test/node_modules/ms/package.json +37 -0
  151. package/test/node_modules/ms/readme.md +60 -0
  152. package/test/node_modules/querystringify/LICENSE +22 -0
  153. package/test/node_modules/querystringify/README.md +61 -0
  154. package/test/node_modules/querystringify/index.js +118 -0
  155. package/test/node_modules/querystringify/package.json +38 -0
  156. package/test/node_modules/readable-stream/LICENSE +18 -0
  157. package/test/node_modules/readable-stream/README.md +15 -0
  158. package/test/node_modules/readable-stream/duplex.js +1 -0
  159. package/test/node_modules/readable-stream/float.patch +923 -0
  160. package/test/node_modules/readable-stream/lib/_stream_duplex.js +89 -0
  161. package/test/node_modules/readable-stream/lib/_stream_passthrough.js +46 -0
  162. package/test/node_modules/readable-stream/lib/_stream_readable.js +951 -0
  163. package/test/node_modules/readable-stream/lib/_stream_transform.js +209 -0
  164. package/test/node_modules/readable-stream/lib/_stream_writable.js +477 -0
  165. package/test/node_modules/readable-stream/package.json +32 -0
  166. package/test/node_modules/readable-stream/passthrough.js +1 -0
  167. package/test/node_modules/readable-stream/readable.js +10 -0
  168. package/test/node_modules/readable-stream/transform.js +1 -0
  169. package/test/node_modules/readable-stream/writable.js +1 -0
  170. package/test/node_modules/requires-port/.travis.yml +19 -0
  171. package/test/node_modules/requires-port/LICENSE +22 -0
  172. package/test/node_modules/requires-port/README.md +47 -0
  173. package/test/node_modules/requires-port/index.js +38 -0
  174. package/test/node_modules/requires-port/package.json +47 -0
  175. package/test/node_modules/requires-port/test.js +98 -0
  176. package/test/node_modules/safe-buffer/LICENSE +21 -0
  177. package/test/node_modules/safe-buffer/README.md +584 -0
  178. package/test/node_modules/safe-buffer/index.d.ts +187 -0
  179. package/test/node_modules/safe-buffer/index.js +62 -0
  180. package/test/node_modules/safe-buffer/package.json +37 -0
  181. package/test/node_modules/string_decoder/LICENSE +20 -0
  182. package/test/node_modules/string_decoder/README.md +7 -0
  183. package/test/node_modules/string_decoder/index.js +221 -0
  184. package/test/node_modules/string_decoder/package.json +25 -0
  185. package/test/node_modules/url-parse/LICENSE +22 -0
  186. package/test/node_modules/url-parse/README.md +153 -0
  187. package/test/node_modules/url-parse/dist/url-parse.js +755 -0
  188. package/test/node_modules/url-parse/dist/url-parse.min.js +1 -0
  189. package/test/node_modules/url-parse/dist/url-parse.min.js.map +1 -0
  190. package/test/node_modules/url-parse/index.js +589 -0
  191. package/test/node_modules/url-parse/package.json +49 -0
  192. package/test/src/test-mq.class.ts +1 -2
  193. package/tsconfig.json +4 -3
  194. package/dist/core.decorator.d.ts +0 -18
  195. package/dist/core.decorator.js.map +0 -1
  196. package/dist/database.decorator.d.ts +0 -24
  197. package/dist/database.decorator.js.map +0 -1
  198. package/dist/default/express-server.class.d.ts +0 -15
  199. package/dist/default/express-server.class.js.map +0 -1
  200. package/dist/default/log-default.class.d.ts +0 -6
  201. package/dist/default/log-default.class.js.map +0 -1
  202. package/dist/default/node-cache.class.d.ts +0 -13
  203. package/dist/default/node-cache.class.js.map +0 -1
  204. package/dist/default/rabbitmq.class.d.ts +0 -9
  205. package/dist/default/rabbitmq.class.js.map +0 -1
  206. package/dist/default/read-write-db.class.d.ts +0 -10
  207. package/dist/default/read-write-db.class.js.map +0 -1
  208. package/dist/default/redis.class.d.ts +0 -5
  209. package/dist/default/redis.class.js.map +0 -1
  210. package/dist/factory/cache-factory.class.d.ts +0 -7
  211. package/dist/factory/cache-factory.class.js.map +0 -1
  212. package/dist/factory/data-source-factory.class.d.ts +0 -4
  213. package/dist/factory/data-source-factory.class.js.map +0 -1
  214. package/dist/factory/log-factory.class.d.ts +0 -4
  215. package/dist/factory/log-factory.class.js.map +0 -1
  216. package/dist/factory/server-factory.class.d.ts +0 -6
  217. package/dist/factory/server-factory.class.js.map +0 -1
  218. package/dist/route.decorator.d.ts +0 -8
  219. package/dist/route.decorator.js.map +0 -1
  220. package/dist/scaffold/command.d.ts +0 -2
  221. package/dist/scaffold/command.js.map +0 -1
  222. package/dist/typespeed.js.map +0 -1
@@ -0,0 +1,722 @@
1
+ var FS = require('fs');
2
+ var format = require('util').format;
3
+
4
+ var defs = require('./amqp-rabbitmq-0.9.1.json');
5
+
6
+ var FRAME_OVERHEAD = 8; // type + channel + size + frame-end
7
+
8
+ var METHOD_OVERHEAD = FRAME_OVERHEAD + 4;
9
+ // F_O + classId + methodId
10
+
11
+ var PROPERTIES_OVERHEAD = FRAME_OVERHEAD + 4 + 8 + 2;
12
+ // F_O + classId + weight + content size + flags
13
+
14
+
15
+ var out = process.stdout;
16
+
17
+ function printf() {
18
+ out.write(format.apply(format, arguments), 'utf8');
19
+ }
20
+
21
+ function nl() { out.write('\n'); }
22
+ function println() { printf.apply(printf, arguments); nl(); }
23
+
24
+ function isEmptyObject(val) {
25
+ return (val != null && typeof val === 'object' &&
26
+ Object.keys(val).length === 0);
27
+ }
28
+
29
+ function stringifyValue(val) {
30
+ return (isEmptyObject(val)) ? 'EMPTY_OBJECT' :
31
+ JSON.stringify(val);
32
+ }
33
+
34
+ var constants = {};
35
+ var constant_strs = {};
36
+
37
+ for (var i = 0, len = defs.constants.length; i < len; i++) {
38
+ var cdef = defs.constants[i];
39
+ constants[constantName(cdef)] = cdef.value;
40
+ constant_strs[cdef.value] = cdef.name;
41
+ }
42
+
43
+ function constantName(def) {
44
+ return def.name.replace(/-/g, '_');
45
+ }
46
+
47
+ function methodName(clazz, method) {
48
+ return initial(clazz.name) + method.name.split('-').map(initial).join('');
49
+ }
50
+
51
+ function propertyName(dashed) {
52
+ var parts = dashed.split('-');
53
+ return parts[0] + parts.slice(1).map(initial).join('');
54
+ }
55
+
56
+ function initial(part) {
57
+ return part.charAt(0).toUpperCase() + part.substr(1);
58
+ }
59
+
60
+ function argument(a) {
61
+ var type = a.type || domains[a.domain];
62
+ var friendlyName = propertyName(a.name);
63
+ return {type: type, name: friendlyName, default: a['default-value']};
64
+ }
65
+
66
+ var domains = {};
67
+ for (var i=0, len = defs.domains.length; i < len; i++) {
68
+ var dom = defs.domains[i];
69
+ domains[dom[0]] = dom[1];
70
+ }
71
+
72
+ var methods = {};
73
+ var propertieses = {};
74
+
75
+ for (var i = 0, len = defs.classes.length; i < len; i++) {
76
+ var clazz = defs.classes[i];
77
+ for (var j = 0, num = clazz.methods.length; j < num; j++) {
78
+ var method = clazz.methods[j];
79
+ var name = methodName(clazz, method);
80
+ var info = 'methodInfo' + name;
81
+
82
+ methods[name] = {
83
+ id: methodId(clazz, method),
84
+ name: name,
85
+ methodId: method.id,
86
+ clazzId: clazz.id,
87
+ clazz: clazz.name,
88
+ args: method['arguments'].map(argument),
89
+ isReply: method.answer,
90
+ encoder: 'encode' + name,
91
+ decoder: 'decode' + name,
92
+ info: info
93
+ };
94
+ }
95
+ if (clazz.properties && clazz.properties.length > 0) {
96
+ var name = propertiesName(clazz);
97
+ var props = clazz.properties;
98
+ propertieses[name] = {
99
+ id: clazz.id,
100
+ name: name,
101
+ encoder: 'encode' + name,
102
+ decoder: 'decode' + name,
103
+ info: 'propertiesInfo' + name,
104
+ args: props.map(argument),
105
+ };
106
+ }
107
+ }
108
+
109
+ // OK let's get emitting
110
+
111
+ println(
112
+ '/** @preserve This file is generated by the script\n',
113
+ '* ../bin/generate-defs.js, which is not in general included in a\n',
114
+ '* distribution, but is available in the source repository e.g. at\n',
115
+ '* https://github.com/squaremo/amqp.node/\n',
116
+ '*/');
117
+
118
+ println("'use strict';"); nl();
119
+ nl()
120
+ println('var codec = require("./codec");');
121
+ println('var ints = require("buffer-more-ints");');
122
+ println('var encodeTable = codec.encodeTable;');
123
+ println('var decodeFields = codec.decodeFields;');
124
+ nl();
125
+
126
+ println('var SCRATCH = Buffer.alloc(65536);');
127
+ println('var EMPTY_OBJECT = Object.freeze({});');
128
+
129
+ println('module.exports.constants = %s',
130
+ JSON.stringify(constants));
131
+ nl();
132
+ println('module.exports.constant_strs = %s',
133
+ JSON.stringify(constant_strs));
134
+ nl();
135
+ println('module.exports.FRAME_OVERHEAD = %d;', FRAME_OVERHEAD);
136
+ nl();
137
+
138
+ println('module.exports.decode = function(id, buf) {');
139
+ println('switch (id) {');
140
+ for (var m in methods) {
141
+ var method = methods[m];
142
+ println('case %d: return %s(buf);', method.id, method.decoder);
143
+ }
144
+ for (var p in propertieses) {
145
+ var props = propertieses[p];
146
+ println('case %d: return %s(buf);', props.id, props.decoder);
147
+ }
148
+ println('default: throw new Error("Unknown class/method ID");');
149
+ println('}}'); nl();
150
+
151
+ println('module.exports.encodeMethod =',
152
+ 'function(id, channel, fields) {');
153
+ println('switch (id) {');
154
+ for (var m in methods) {
155
+ var method = methods[m];
156
+ println('case %d: return %s(channel, fields);',
157
+ method.id, method.encoder);
158
+ }
159
+ println('default: throw new Error("Unknown class/method ID");');
160
+ println('}}'); nl();
161
+
162
+ println('module.exports.encodeProperties ='
163
+ , 'function(id, channel, size, fields) {');
164
+ println('switch (id) {');
165
+ for (var p in propertieses) {
166
+ var props = propertieses[p];
167
+ println('case %d: return %s(channel, size, fields);',
168
+ props.id, props.encoder);
169
+ }
170
+ println('default: throw new Error("Unknown class/properties ID");');
171
+ println('}}'); nl();
172
+
173
+ println('module.exports.info = function(id) {');
174
+ println('switch(id) {');
175
+ for (var m in methods) {
176
+ var method = methods[m];
177
+ println('case %d: return %s; ', method.id, method.info);
178
+ }
179
+ for (var p in propertieses) {
180
+ var properties = propertieses[p];
181
+ println('case %d: return %s', properties.id, properties.info);
182
+ }
183
+ println('default: throw new Error("Unknown class/method ID");');
184
+ println('}}'); nl();
185
+
186
+ for (var m in methods) {
187
+ var method = methods[m];
188
+ println('module.exports.%s = %d;', m, method.id);
189
+ decoderFn(method); nl();
190
+ encoderFn(method); nl();
191
+ infoObj(method); nl();
192
+ }
193
+
194
+ for (var p in propertieses) {
195
+ var properties = propertieses[p];
196
+ println('module.exports.%s = %d;', p, properties.id);
197
+ encodePropsFn(properties); nl();
198
+ decodePropsFn(properties); nl();
199
+ infoObj(properties); nl();
200
+ }
201
+
202
+ function methodId(clazz, method) {
203
+ return (clazz.id << 16) + method.id;
204
+ }
205
+
206
+ function propertiesName(clazz) {
207
+ return initial(clazz.name) + 'Properties';
208
+ }
209
+
210
+ function valTypeTest(arg) {
211
+ switch (arg.type) {
212
+ // everything is booleany
213
+ case 'bit': return 'true'
214
+ case 'octet':
215
+ case 'short':
216
+ case 'long':
217
+ case 'longlong':
218
+ case 'timestamp': return "typeof val === 'number' && !isNaN(val)";
219
+ case 'shortstr': return "typeof val === 'string' &&" +
220
+ " Buffer.byteLength(val) < 256";
221
+ case 'longstr': return "Buffer.isBuffer(val)";
222
+ case 'table': return "typeof val === 'object'";
223
+ }
224
+ }
225
+
226
+ function typeDesc(t) {
227
+ switch (t) {
228
+ case 'bit': return 'booleany';
229
+ case 'octet':
230
+ case 'short':
231
+ case 'long':
232
+ case 'longlong':
233
+ case 'timestamp': return "a number (but not NaN)";
234
+ case 'shortstr': return "a string (up to 255 chars)";
235
+ case 'longstr': return "a Buffer";
236
+ case 'table': return "an object";
237
+ }
238
+ }
239
+
240
+ function defaultValueRepr(arg) {
241
+ switch (arg.type) {
242
+ case 'longstr':
243
+ return format("Buffer.from(%s)", JSON.stringify(arg.default));
244
+ default:
245
+ // assumes no tables as defaults
246
+ return JSON.stringify(arg.default);
247
+ }
248
+ }
249
+
250
+ // Emit code to assign the arg value to `val`.
251
+ function assignArg(a) {
252
+ println("val = fields['%s'];", a.name);
253
+ }
254
+
255
+ function assignOrDefault(a) {
256
+ println("val = fields['%s'];", a.name);
257
+ println("if (val === undefined) val = %s;", defaultValueRepr(a));
258
+ }
259
+
260
+ // Emit code for assigning an argument value to `val`, checking that
261
+ // it exists (if it does not have a default) and is the correct
262
+ // type.
263
+ function checkAssignArg(a) {
264
+ assignArg(a);
265
+ println('if (val === undefined) {');
266
+ if (a.default !== undefined) {
267
+ println('val = %s;', defaultValueRepr(a));
268
+ }
269
+ else {
270
+ println('throw new Error("Missing value for mandatory field \'%s\'");', a.name);
271
+ }
272
+ println('}'); // undefined test
273
+ println('else if (!(%s)) {', valTypeTest(a));
274
+ println('throw new TypeError(');
275
+ println('"Field \'%s\' is the wrong type; must be %s");',
276
+ a.name, typeDesc(a.type));
277
+ println('}'); // type test
278
+ }
279
+
280
+ // Emit code for encoding `val` as a table and assign to a fresh
281
+ // variable (based on the arg name). I use a scratch buffer to compose
282
+ // the encoded table, otherwise I'd have to do a size calculation pass
283
+ // first. I can get away with this only because 1. the encoding
284
+ // procedures are not re-entrant; and, 2. I copy the result into
285
+ // another buffer before returning. `scratchOffset`, `val`, `len` are
286
+ // expected to have been declared.
287
+ function assignTable(a) {
288
+ var varname = tableVar(a);
289
+ println(
290
+ "len = encodeTable(SCRATCH, val, scratchOffset);");
291
+ println('var %s = SCRATCH.slice(scratchOffset, scratchOffset + len);', varname);
292
+ println('scratchOffset += len;');
293
+ }
294
+
295
+ function tableVar(a) {
296
+ return a.name + '_encoded';
297
+ }
298
+
299
+ function stringLenVar(a) {
300
+ return a.name + '_len';
301
+ }
302
+
303
+ function assignStringLen(a) {
304
+ var v = stringLenVar(a);
305
+ // Assumes the value or default is in val
306
+ println("var %s = Buffer.byteLength(val, 'utf8');", v);
307
+ }
308
+
309
+
310
+ function encoderFn(method) {
311
+ var args = method['args'];
312
+ println('function %s(channel, fields) {', method.encoder);
313
+ println('var offset = 0, val = null, bits = 0, varyingSize = 0;');
314
+ println('var len, scratchOffset = 0;');
315
+
316
+ // Encoding is split into two parts. Some fields have a fixed size
317
+ // (e.g., integers of a specific width), while some have a size that
318
+ // depends on the datum (e.g., strings). Each field will therefore
319
+ // either 1. contribute to the fixed size; or 2. emit code to
320
+ // calculate the size (and possibly the encoded value, in the case
321
+ // of tables).
322
+ var fixedSize = METHOD_OVERHEAD;
323
+
324
+ var bitsInARow = 0;
325
+
326
+ for (var i=0, len = args.length; i < len; i++) {
327
+ var arg = args[i];
328
+
329
+ if (arg.type != 'bit') bitsInARow = 0;
330
+
331
+ switch (arg.type) {
332
+ // varying size
333
+ case 'shortstr':
334
+ checkAssignArg(arg);
335
+ assignStringLen(arg);
336
+ println("varyingSize += %s;", stringLenVar(arg));
337
+ fixedSize += 1;
338
+ break;
339
+ case 'longstr':
340
+ checkAssignArg(arg);
341
+ println("varyingSize += val.length;");
342
+ fixedSize += 4;
343
+ break;
344
+ case 'table':
345
+ // For a table we have to encode the table before we can see its
346
+ // length.
347
+ checkAssignArg(arg);
348
+ assignTable(arg);
349
+ println('varyingSize += %s.length;', tableVar(arg));
350
+ break;
351
+
352
+ // fixed size
353
+ case 'octet': fixedSize += 1; break;
354
+ case 'short': fixedSize += 2; break;
355
+ case 'long': fixedSize += 4; break;
356
+ case 'longlong': //fall through
357
+ case 'timestamp':
358
+ fixedSize += 8; break;
359
+ case 'bit':
360
+ bitsInARow ++;
361
+ // open a fresh pack o' bits
362
+ if (bitsInARow === 1) fixedSize += 1;
363
+ // just used a pack; reset
364
+ else if (bitsInARow === 8) bitsInARow = 0;
365
+ break;
366
+ }
367
+ }
368
+
369
+ println('var buffer = Buffer.alloc(%d + varyingSize);', fixedSize);
370
+
371
+ println('buffer[0] = %d;', constants.FRAME_METHOD);
372
+ println('buffer.writeUInt16BE(channel, 1);');
373
+ // skip size for now, we'll write it in when we know
374
+ println('buffer.writeUInt32BE(%d, 7);', method.id);
375
+ println('offset = 11;');
376
+
377
+ bitsInARow = 0;
378
+
379
+ for (var i = 0, len = args.length; i < len; i++) {
380
+ var a = args[i];
381
+
382
+ // Flush any collected bits before doing a new field
383
+ if (a.type != 'bit' && bitsInARow > 0) {
384
+ bitsInARow = 0;
385
+ println('buffer[offset] = bits; offset++; bits = 0;');
386
+ }
387
+
388
+ switch (a.type) {
389
+ case 'octet':
390
+ checkAssignArg(a);
391
+ println('buffer.writeUInt8(val, offset); offset++;');
392
+ break;
393
+ case 'short':
394
+ checkAssignArg(a);
395
+ println('buffer.writeUInt16BE(val, offset); offset += 2;');
396
+ break;
397
+ case 'long':
398
+ checkAssignArg(a);
399
+ println('buffer.writeUInt32BE(val, offset); offset += 4;');
400
+ break;
401
+ case 'longlong':
402
+ case 'timestamp':
403
+ checkAssignArg(a);
404
+ println('ints.writeUInt64BE(buffer, val, offset); offset += 8;');
405
+ break;
406
+ case 'bit':
407
+ checkAssignArg(a);
408
+ println('if (val) bits += %d;', 1 << bitsInARow);
409
+ if (bitsInARow === 7) { // I don't think this ever happens, but whatever
410
+ println('buffer[offset] = bits; offset++; bits = 0;');
411
+ bitsInARow = 0;
412
+ }
413
+ else bitsInARow++;
414
+ break;
415
+ case 'shortstr':
416
+ assignOrDefault(a);
417
+ println('buffer[offset] = %s; offset++;', stringLenVar(a));
418
+ println('buffer.write(val, offset, "utf8"); offset += %s;',
419
+ stringLenVar(a));
420
+ break;
421
+ case 'longstr':
422
+ assignOrDefault(a);
423
+ println('len = val.length;');
424
+ println('buffer.writeUInt32BE(len, offset); offset += 4;');
425
+ println('val.copy(buffer, offset); offset += len;');
426
+ break;
427
+ case 'table':
428
+ println('offset += %s.copy(buffer, offset);', tableVar(a));
429
+ break;
430
+ default: throw new Error("Unexpected argument type: " + a.type);
431
+ }
432
+ }
433
+
434
+ // Flush any collected bits at the end
435
+ if (bitsInARow > 0) {
436
+ println('buffer[offset] = bits; offset++;');
437
+ }
438
+
439
+ println('buffer[offset] = %d;', constants.FRAME_END);
440
+ // size does not include the frame header or frame end byte
441
+ println('buffer.writeUInt32BE(offset - 7, 3);');
442
+
443
+ println('return buffer;');
444
+ println('}');
445
+ }
446
+
447
+ function fieldsDecl(args) {
448
+ println('var fields = {');
449
+ for (var i=0, num=args.length; i < num; i++) {
450
+ println('%s: undefined,', args[i].name);
451
+ }
452
+ println('};');
453
+ }
454
+
455
+ function decoderFn(method) {
456
+ var args = method.args;
457
+ println('function %s(buffer) {', method.decoder);
458
+ println('var offset = 0, val, len;');
459
+ fieldsDecl(args);
460
+
461
+ var bitsInARow = 0;
462
+
463
+ for (var i=0, num=args.length; i < num; i++) {
464
+ var a = args[i];
465
+ var field = "fields['" + a.name + "']";
466
+
467
+ // Flush any collected bits before doing a new field
468
+ if (a.type != 'bit' && bitsInARow > 0) {
469
+ bitsInARow = 0;
470
+ println('offset++;');
471
+ }
472
+
473
+ switch (a.type) {
474
+ case 'octet':
475
+ println('val = buffer[offset]; offset++;');
476
+ break;
477
+ case 'short':
478
+ println('val = buffer.readUInt16BE(offset); offset += 2;');
479
+ break;
480
+ case 'long':
481
+ println('val = buffer.readUInt32BE(offset); offset += 4;');
482
+ break;
483
+ case 'longlong':
484
+ case 'timestamp':
485
+ println('val = ints.readUInt64BE(buffer, offset); offset += 8;');
486
+ break;
487
+ case 'bit':
488
+ var bit = 1 << bitsInARow;
489
+ println('val = !!(buffer[offset] & %d);', bit);
490
+ if (bitsInARow === 7) {
491
+ println('offset++;');
492
+ bitsInARow = 0;
493
+ }
494
+ else bitsInARow++;
495
+ break;
496
+ case 'longstr':
497
+ println('len = buffer.readUInt32BE(offset); offset += 4;');
498
+ println('val = buffer.slice(offset, offset + len);');
499
+ println('offset += len;');
500
+ break;
501
+ case 'shortstr':
502
+ println('len = buffer.readUInt8(offset); offset++;');
503
+ println('val = buffer.toString("utf8", offset, offset + len);');
504
+ println('offset += len;');
505
+ break;
506
+ case 'table':
507
+ println('len = buffer.readUInt32BE(offset); offset += 4;');
508
+ println('val = decodeFields(buffer.slice(offset, offset + len));');
509
+ println('offset += len;');
510
+ break;
511
+ default:
512
+ throw new TypeError("Unexpected type in argument list: " + a.type);
513
+ }
514
+ println('%s = val;', field);
515
+ }
516
+ println('return fields;');
517
+ println('}');
518
+ }
519
+
520
+ function infoObj(thing) {
521
+ var info = JSON.stringify({id: thing.id,
522
+ classId: thing.clazzId,
523
+ methodId: thing.methodId,
524
+ name: thing.name,
525
+ args: thing.args});
526
+ println('var %s = module.exports.%s = %s;',
527
+ thing.info, thing.info, info);
528
+ }
529
+
530
+ // The flags are laid out in groups of fifteen in a short (high to
531
+ // low bits), with a continuation bit (at 0) and another group
532
+ // following if there's more than fifteen. Presence and absence
533
+ // are conflated with true and false, for bit fields (i.e., if the
534
+ // flag for the field is set, it's true, otherwise false).
535
+ //
536
+ // However, none of that is actually used in AMQP 0-9-1. The only
537
+ // instance of properties -- basic properties -- has 14 fields, none
538
+ // of them bits.
539
+
540
+ function flagAt(index) {
541
+ return 1 << (15 - index);
542
+ }
543
+
544
+ function encodePropsFn(props) {
545
+ println('function %s(channel, size, fields) {', props.encoder);
546
+ println('var offset = 0, flags = 0, val, len;');
547
+ println('var scratchOffset = 0, varyingSize = 0;');
548
+
549
+ var fixedSize = PROPERTIES_OVERHEAD;
550
+
551
+ var args = props.args;
552
+
553
+ function incVarying(by) {
554
+ println("varyingSize += %d;", by);
555
+ }
556
+
557
+ for (var i=0, num=args.length; i < num; i++) {
558
+ var p = args[i];
559
+
560
+ assignArg(p);
561
+ println("if (val != undefined) {");
562
+
563
+ println("if (%s) {", valTypeTest(p));
564
+ switch (p.type) {
565
+ case 'shortstr':
566
+ assignStringLen(p);
567
+ incVarying(1);
568
+ println('varyingSize += %s;', stringLenVar(p));
569
+ break;
570
+ case 'longstr':
571
+ incVarying(4);
572
+ println('varyingSize += val.length;');
573
+ break;
574
+ case 'table':
575
+ assignTable(p);
576
+ println('varyingSize += %s.length;', tableVar(p));
577
+ break;
578
+ case 'octet': incVarying(1); break;
579
+ case 'short': incVarying(2); break;
580
+ case 'long': incVarying(4); break;
581
+ case 'longlong': // fall through
582
+ case 'timestamp':
583
+ incVarying(8); break;
584
+ // no case for bit, as they are accounted for in the flags
585
+ }
586
+ println('} else {');
587
+ println('throw new TypeError(');
588
+ println('"Field \'%s\' is the wrong type; must be %s");',
589
+ p.name, typeDesc(p.type));
590
+ println('}');
591
+ println('}');
592
+ }
593
+
594
+ println('var buffer = Buffer.alloc(%d + varyingSize);', fixedSize);
595
+
596
+ println('buffer[0] = %d', constants.FRAME_HEADER);
597
+ println('buffer.writeUInt16BE(channel, 1);');
598
+ // content class ID and 'weight' (== 0)
599
+ println('buffer.writeUInt32BE(%d, 7);', props.id << 16);
600
+ // skip frame size for now, we'll write it in when we know.
601
+
602
+ // body size
603
+ println('ints.writeUInt64BE(buffer, size, 11);');
604
+
605
+ println('flags = 0;');
606
+ // we'll write the flags later too
607
+ println('offset = 21;');
608
+
609
+ for (var i=0, num=args.length; i < num; i++) {
610
+ var p = args[i];
611
+ var flag = flagAt(i);
612
+
613
+ assignArg(p);
614
+ println("if (val != undefined) {");
615
+ if (p.type === 'bit') { // which none of them are ..
616
+ println('if (val) flags += %d;', flag);
617
+ }
618
+ else {
619
+ println('flags += %d;', flag);
620
+ // %%% FIXME only slightly different to the method args encoding
621
+ switch (p.type) {
622
+ case 'octet':
623
+ println('buffer.writeUInt8(val, offset); offset++;');
624
+ break;
625
+ case 'short':
626
+ println('buffer.writeUInt16BE(val, offset); offset += 2;');
627
+ break;
628
+ case 'long':
629
+ println('buffer.writeUInt32BE(val, offset); offset += 4;');
630
+ break;
631
+ case 'longlong':
632
+ case 'timestamp':
633
+ println('ints.writeUInt64BE(buffer, val, offset);');
634
+ println('offset += 8;');
635
+ break;
636
+ case 'shortstr':
637
+ var v = stringLenVar(p);
638
+ println('buffer[offset] = %s; offset++;', v);
639
+ println("buffer.write(val, offset, 'utf8');");
640
+ println("offset += %s;", v);
641
+ break;
642
+ case 'longstr':
643
+ println('buffer.writeUInt32BE(val.length, offset);');
644
+ println('offset += 4;');
645
+ println('offset += val.copy(buffer, offset);');
646
+ break;
647
+ case 'table':
648
+ println('offset += %s.copy(buffer, offset);', tableVar(p));
649
+ break;
650
+ default: throw new Error("Unexpected argument type: " + p.type);
651
+ }
652
+ }
653
+ println('}'); // != undefined
654
+ }
655
+
656
+ println('buffer[offset] = %d;', constants.FRAME_END);
657
+ // size does not include the frame header or frame end byte
658
+ println('buffer.writeUInt32BE(offset - 7, 3);');
659
+ println('buffer.writeUInt16BE(flags, 19);');
660
+ println('return buffer.slice(0, offset + 1);');
661
+ println('}');
662
+ }
663
+
664
+ function decodePropsFn(props) {
665
+ var args = props.args;
666
+
667
+ println('function %s(buffer) {', props.decoder);
668
+ println('var flags, offset = 2, val, len;');
669
+
670
+ println('flags = buffer.readUInt16BE(0);');
671
+ println('if (flags === 0) return {};');
672
+
673
+ fieldsDecl(args);
674
+
675
+ for (var i=0, num=args.length; i < num; i++) {
676
+ var p = argument(args[i]);
677
+ var field = "fields['" + p.name + "']";
678
+
679
+ println('if (flags & %d) {', flagAt(i));
680
+ if (p.type === 'bit') {
681
+ println('%d = true;', field);
682
+ }
683
+ else {
684
+ switch (p.type) {
685
+ case 'octet':
686
+ println('val = buffer[offset]; offset++;');
687
+ break;
688
+ case 'short':
689
+ println('val = buffer.readUInt16BE(offset); offset += 2;');
690
+ break;
691
+ case 'long':
692
+ println('val = buffer.readUInt32BE(offset); offset += 4;');
693
+ break;
694
+ case 'longlong':
695
+ case 'timestamp':
696
+ println('val = ints.readUInt64BE(buffer, offset); offset += 8;');
697
+ break;
698
+ case 'longstr':
699
+ println('len = buffer.readUInt32BE(offset); offset += 4;');
700
+ println('val = buffer.slice(offset, offset + len);');
701
+ println('offset += len;');
702
+ break;
703
+ case 'shortstr':
704
+ println('len = buffer.readUInt8(offset); offset++;');
705
+ println('val = buffer.toString("utf8", offset, offset + len);');
706
+ println('offset += len;');
707
+ break;
708
+ case 'table':
709
+ println('len = buffer.readUInt32BE(offset); offset += 4;');
710
+ println('val = decodeFields(buffer.slice(offset, offset + len));');
711
+ println('offset += len;');
712
+ break;
713
+ default:
714
+ throw new TypeError("Unexpected type in argument list: " + p.type);
715
+ }
716
+ println('%s = val;', field);
717
+ }
718
+ println('}');
719
+ }
720
+ println('return fields;');
721
+ println('}');
722
+ }