sproutit-narwhal 0.1.106

Sign up to get free protection for your applications and to get access to all the features.
Files changed (291) hide show
  1. data/DISTRIBUTION.yml +15 -0
  2. data/README.md +86 -0
  3. data/Rakefile +349 -0
  4. data/VERSION.yml +7 -0
  5. data/bin/activate +50 -0
  6. data/bin/activate.bash +50 -0
  7. data/bin/activate.cmd +3 -0
  8. data/bin/js +67 -0
  9. data/bin/json +2 -0
  10. data/bin/narwhal +67 -0
  11. data/bin/narwhal.cmd +29 -0
  12. data/bin/sea +45 -0
  13. data/bin/sea.cmd +25 -0
  14. data/bin/tusk +2 -0
  15. data/bin/tusk.cmd +5 -0
  16. data/catalog.json +902 -0
  17. data/docs/available-packages.md +32 -0
  18. data/docs/browser-api-plan.md +290 -0
  19. data/docs/browser-api.md +153 -0
  20. data/docs/download.md +25 -0
  21. data/docs/engines.md +32 -0
  22. data/docs/json-tool.md +121 -0
  23. data/docs/lib/binary.wiki +242 -0
  24. data/docs/lib/file.wiki +325 -0
  25. data/docs/lib/os/popen.md +70 -0
  26. data/docs/modules.md +38 -0
  27. data/docs/narwhal.md +487 -0
  28. data/docs/packages-howto.md +32 -0
  29. data/docs/packages.md +30 -0
  30. data/docs/posts/2009-07-29-hello-0.1.md +19 -0
  31. data/docs/quick-start.md +69 -0
  32. data/docs/sea.md +49 -0
  33. data/engines/browser/lib/binary.js +2 -0
  34. data/engines/browser/lib/reactor.js +21 -0
  35. data/engines/browser/lib/system.js +3 -0
  36. data/engines/default/lib/array.js +164 -0
  37. data/engines/default/lib/binary-engine.js +53 -0
  38. data/engines/default/lib/binary.js +755 -0
  39. data/engines/default/lib/date.js +8 -0
  40. data/engines/default/lib/file-engine.js +119 -0
  41. data/engines/default/lib/function.js +119 -0
  42. data/engines/default/lib/global.js +11 -0
  43. data/engines/default/lib/io-engine.js +26 -0
  44. data/engines/default/lib/json.js +488 -0
  45. data/engines/default/lib/object.js +69 -0
  46. data/engines/default/lib/os-engine.js +3 -0
  47. data/engines/default/lib/reactor.js +12 -0
  48. data/engines/default/lib/string.js +84 -0
  49. data/engines/default/lib/system.js +20 -0
  50. data/engines/default/lib/worker.js +133 -0
  51. data/engines/jsc/README.md +18 -0
  52. data/engines/jsc/bootstrap.js +53 -0
  53. data/engines/jsc/deps/http-parser/LICENSE +77 -0
  54. data/engines/jsc/deps/http-parser/README.md +145 -0
  55. data/engines/jsc/deps/http-parser/http_parser.c +6087 -0
  56. data/engines/jsc/deps/http-parser/http_parser.h +141 -0
  57. data/engines/jsc/deps/http-parser/http_parser.rl +500 -0
  58. data/engines/jsc/deps/http-parser/test.c +858 -0
  59. data/engines/jsc/include/binary-engine.h +11 -0
  60. data/engines/jsc/include/io-engine.h +23 -0
  61. data/engines/jsc/include/narwhal.h +427 -0
  62. data/engines/jsc/lib/file-engine.js +31 -0
  63. data/engines/jsc/lib/http.js +1 -0
  64. data/engines/jsc/lib/io-engine.js +202 -0
  65. data/engines/jsc/lib/os-engine.js +25 -0
  66. data/engines/jsc/lib/system.js +18 -0
  67. data/engines/jsc/lib/zip.js +1 -0
  68. data/engines/jsc/narwhal-jsc.c +273 -0
  69. data/engines/jsc/narwhal.c +29 -0
  70. data/engines/jsc/package.json +8 -0
  71. data/engines/jsc/src/binary-engine.cc +290 -0
  72. data/engines/jsc/src/file-engine.cc +405 -0
  73. data/engines/jsc/src/io-engine.cc +423 -0
  74. data/engines/jsc/src/jack/handler/jill.cc +710 -0
  75. data/engines/jsc/src/os-engine.cc +210 -0
  76. data/engines/rhino/bin/narwhal-rhino +68 -0
  77. data/engines/rhino/bin/narwhal-rhino.cmd +34 -0
  78. data/engines/rhino/bootstrap.js +119 -0
  79. data/engines/rhino/jars/jline.jar +0 -0
  80. data/engines/rhino/jars/jna.jar +0 -0
  81. data/engines/rhino/jars/js.jar +0 -0
  82. data/engines/rhino/lib/binary-engine.js +83 -0
  83. data/engines/rhino/lib/concurrency.js +6 -0
  84. data/engines/rhino/lib/event-queue.js +18 -0
  85. data/engines/rhino/lib/file-engine.js +216 -0
  86. data/engines/rhino/lib/http-client-engine.js +90 -0
  87. data/engines/rhino/lib/http-engine.js +10 -0
  88. data/engines/rhino/lib/io-engine.js +347 -0
  89. data/engines/rhino/lib/md5-engine.js +40 -0
  90. data/engines/rhino/lib/os-engine.js +150 -0
  91. data/engines/rhino/lib/packages-engine.js +71 -0
  92. data/engines/rhino/lib/sandbox-engine.js +70 -0
  93. data/engines/rhino/lib/system.js +38 -0
  94. data/engines/rhino/lib/worker-engine.js +23 -0
  95. data/engines/rhino/lib/zip.js +78 -0
  96. data/engines/rhino/package.json +4 -0
  97. data/engines/secure/lib/file.js +6 -0
  98. data/engines/secure/lib/system.js +6 -0
  99. data/engines/template/bin/narwhal-engine-name +32 -0
  100. data/engines/template/bootstrap.js +40 -0
  101. data/engines/template/lib/file-engine.js +118 -0
  102. data/engines/template/lib/system.js +17 -0
  103. data/examples/browser-deployment-jackconfig.js +35 -0
  104. data/examples/fibonacci-worker.js +35 -0
  105. data/examples/fibonacci.js +19 -0
  106. data/examples/hello +2 -0
  107. data/examples/narwhal +3 -0
  108. data/examples/not-quite-a-quine.js +1 -0
  109. data/extconf.rb +44 -0
  110. data/gem_bin/narwhal +5 -0
  111. data/gem_bin/sea +4 -0
  112. data/gem_bin/tusk +4 -0
  113. data/lib/args.js +849 -0
  114. data/lib/base16.js +16 -0
  115. data/lib/base64.js +120 -0
  116. data/lib/codec/base64.js +8 -0
  117. data/lib/crc32.js +60 -0
  118. data/lib/file-bootstrap.js +187 -0
  119. data/lib/file.js +659 -0
  120. data/lib/hash.js +28 -0
  121. data/lib/hashp.js +65 -0
  122. data/lib/html.js +16 -0
  123. data/lib/http-client.js +134 -0
  124. data/lib/http.js +17 -0
  125. data/lib/io.js +98 -0
  126. data/lib/jsmin.js +315 -0
  127. data/lib/jsonpath.js +89 -0
  128. data/lib/logger.js +55 -0
  129. data/lib/md4.js +146 -0
  130. data/lib/md5.js +164 -0
  131. data/lib/mime.js +166 -0
  132. data/lib/narwhal.js +102 -0
  133. data/lib/narwhal/client.js +261 -0
  134. data/lib/narwhal/compile.js +99 -0
  135. data/lib/narwhal/env.js +140 -0
  136. data/lib/narwhal/inline.js +106 -0
  137. data/lib/narwhal/json.js +324 -0
  138. data/lib/narwhal/json.md +178 -0
  139. data/lib/narwhal/repl.js +96 -0
  140. data/lib/narwhal/server-test.js +6 -0
  141. data/lib/narwhal/server.js +270 -0
  142. data/lib/narwhal/tusk.js +170 -0
  143. data/lib/narwhal/tusk/bin.js +13 -0
  144. data/lib/narwhal/tusk/bundle.js +0 -0
  145. data/lib/narwhal/tusk/catalog.js +22 -0
  146. data/lib/narwhal/tusk/clone.js +66 -0
  147. data/lib/narwhal/tusk/consolidate.js +25 -0
  148. data/lib/narwhal/tusk/create-catalog.js +80 -0
  149. data/lib/narwhal/tusk/engine.js +42 -0
  150. data/lib/narwhal/tusk/freeze.js +0 -0
  151. data/lib/narwhal/tusk/init.js +56 -0
  152. data/lib/narwhal/tusk/install.js +288 -0
  153. data/lib/narwhal/tusk/list.js +20 -0
  154. data/lib/narwhal/tusk/orphans.js +0 -0
  155. data/lib/narwhal/tusk/reheat.js +15 -0
  156. data/lib/narwhal/tusk/remove.js +15 -0
  157. data/lib/narwhal/tusk/search.js +145 -0
  158. data/lib/narwhal/tusk/update.js +21 -0
  159. data/lib/narwhal/tusk/upgrade.js +0 -0
  160. data/lib/os.js +33 -0
  161. data/lib/packages.js +423 -0
  162. data/lib/printf.js +169 -0
  163. data/lib/promise.js +352 -0
  164. data/lib/querystring.js +176 -0
  165. data/lib/ref-send.js +257 -0
  166. data/lib/regexp.js +12 -0
  167. data/lib/sandbox.js +422 -0
  168. data/lib/sha.js +112 -0
  169. data/lib/sha256.js +102 -0
  170. data/lib/struct.js +228 -0
  171. data/lib/term.js +179 -0
  172. data/lib/test/assert.js +95 -0
  173. data/lib/test/equiv.js +188 -0
  174. data/lib/test/jsdump.js +165 -0
  175. data/lib/test/runner.js +129 -0
  176. data/lib/unload.js +13 -0
  177. data/lib/uri.js +378 -0
  178. data/lib/url.js +5 -0
  179. data/lib/utf8.js +64 -0
  180. data/lib/util.js +985 -0
  181. data/lib/uuid.js +89 -0
  182. data/lib/xregexp.js +521 -0
  183. data/local.json.template +1 -0
  184. data/narwhal.gemspec +105 -0
  185. data/narwhal.js +213 -0
  186. data/package.json +26 -0
  187. data/packages/readline/engines/default/lib/readline.js +4 -0
  188. data/packages/readline/engines/rhino/lib/readline.js +6 -0
  189. data/packages/readline/package.json +5 -0
  190. data/sources.json +207 -0
  191. data/tests/all-tests.js +17 -0
  192. data/tests/args.js +31 -0
  193. data/tests/args/domain.js +215 -0
  194. data/tests/args/options.js +36 -0
  195. data/tests/args/shifting.js +92 -0
  196. data/tests/args/validation.js +31 -0
  197. data/tests/base64.js +23 -0
  198. data/tests/commonjs.js +3 -0
  199. data/tests/commonjs/all-tests.js +12 -0
  200. data/tests/commonjs/bytearray-encodings-tests.js +69 -0
  201. data/tests/commonjs/bytearray-tests.js +465 -0
  202. data/tests/commonjs/bytestring-encodings-tests.js +89 -0
  203. data/tests/commonjs/bytestring-tests.js +263 -0
  204. data/tests/commonjs/es5/all-tests.js +3 -0
  205. data/tests/commonjs/es5/bind.js +29 -0
  206. data/tests/commonjs/file-tests.js +315 -0
  207. data/tests/commonjs/file/dirname.js +31 -0
  208. data/tests/commonjs/file/extension.js +45 -0
  209. data/tests/commonjs/file/is-absolute.js +11 -0
  210. data/tests/commonjs/file/iterator.js +101 -0
  211. data/tests/commonjs/file/normal.js +27 -0
  212. data/tests/commonjs/file/path.js +17 -0
  213. data/tests/commonjs/file/relative.js +42 -0
  214. data/tests/commonjs/file/resolve.js +44 -0
  215. data/tests/commonjs/module-tests.js +9 -0
  216. data/tests/commonjs/modules/absolute/b.js +1 -0
  217. data/tests/commonjs/modules/absolute/program.js +5 -0
  218. data/tests/commonjs/modules/absolute/submodule/a.js +3 -0
  219. data/tests/commonjs/modules/absolute/test.js +9 -0
  220. data/tests/commonjs/modules/all-tests.js +47 -0
  221. data/tests/commonjs/modules/config.js +11 -0
  222. data/tests/commonjs/modules/cyclic/a.js +4 -0
  223. data/tests/commonjs/modules/cyclic/b.js +4 -0
  224. data/tests/commonjs/modules/cyclic/program.js +10 -0
  225. data/tests/commonjs/modules/cyclic/test.js +9 -0
  226. data/tests/commonjs/modules/determinism/program.js +3 -0
  227. data/tests/commonjs/modules/determinism/submodule/a.js +8 -0
  228. data/tests/commonjs/modules/determinism/submodule/b.js +2 -0
  229. data/tests/commonjs/modules/determinism/test.js +9 -0
  230. data/tests/commonjs/modules/exactExports/a.js +3 -0
  231. data/tests/commonjs/modules/exactExports/program.js +4 -0
  232. data/tests/commonjs/modules/exactExports/test.js +9 -0
  233. data/tests/commonjs/modules/hasOwnProperty/hasOwnProperty.js +0 -0
  234. data/tests/commonjs/modules/hasOwnProperty/program.js +3 -0
  235. data/tests/commonjs/modules/hasOwnProperty/test.js +9 -0
  236. data/tests/commonjs/modules/hasOwnProperty/toString.js +0 -0
  237. data/tests/commonjs/modules/method/a.js +12 -0
  238. data/tests/commonjs/modules/method/program.js +8 -0
  239. data/tests/commonjs/modules/method/test.js +9 -0
  240. data/tests/commonjs/modules/missing/program.js +8 -0
  241. data/tests/commonjs/modules/missing/test.js +9 -0
  242. data/tests/commonjs/modules/monkeys/a.js +1 -0
  243. data/tests/commonjs/modules/monkeys/program.js +4 -0
  244. data/tests/commonjs/modules/monkeys/test.js +9 -0
  245. data/tests/commonjs/modules/nested/a/b/c/d.js +3 -0
  246. data/tests/commonjs/modules/nested/program.js +3 -0
  247. data/tests/commonjs/modules/nested/test.js +9 -0
  248. data/tests/commonjs/modules/relative/program.js +5 -0
  249. data/tests/commonjs/modules/relative/submodule/a.js +1 -0
  250. data/tests/commonjs/modules/relative/submodule/b.js +2 -0
  251. data/tests/commonjs/modules/relative/test.js +9 -0
  252. data/tests/commonjs/modules/transitive/a.js +1 -0
  253. data/tests/commonjs/modules/transitive/b.js +1 -0
  254. data/tests/commonjs/modules/transitive/c.js +3 -0
  255. data/tests/commonjs/modules/transitive/program.js +3 -0
  256. data/tests/commonjs/modules/transitive/test.js +9 -0
  257. data/tests/file/all-tests.js +61 -0
  258. data/tests/file/fnmatch.js +102 -0
  259. data/tests/file/glob.js +466 -0
  260. data/tests/file/match.js +102 -0
  261. data/tests/global.js +6 -0
  262. data/tests/global/array.js +19 -0
  263. data/tests/hashes.js +94 -0
  264. data/tests/html.js +13 -0
  265. data/tests/io/stringio.js +21 -0
  266. data/tests/os/all-tests.js +4 -0
  267. data/tests/os/popen.js +41 -0
  268. data/tests/os/system.js +22 -0
  269. data/tests/printf.js +123 -0
  270. data/tests/query-string.js +87 -0
  271. data/tests/sandbox/byte-io.js +20 -0
  272. data/tests/sandbox/fileName.js +3 -0
  273. data/tests/sandbox/foo.js +0 -0
  274. data/tests/sandbox/reload.js +79 -0
  275. data/tests/string.js +35 -0
  276. data/tests/uri.js +41 -0
  277. data/tests/util/all-tests.js +79 -0
  278. data/tests/util/array.js +207 -0
  279. data/tests/util/array/is-arguments.js +29 -0
  280. data/tests/util/array/is-array-like.js +29 -0
  281. data/tests/util/case.js +9 -0
  282. data/tests/util/collection.js +104 -0
  283. data/tests/util/eq.js +57 -0
  284. data/tests/util/expand.js +45 -0
  285. data/tests/util/object.js +125 -0
  286. data/tests/util/operator.js +25 -0
  287. data/tests/util/range.js +19 -0
  288. data/tests/util/repr.js +26 -0
  289. data/tests/util/string.js +34 -0
  290. data/tests/util/unique.js +12 -0
  291. metadata +434 -0
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Provides some currency help
3
+ */
4
+ exports.Lock = java.util.concurrent.locks.ReentrantReadWriteLock;
5
+ exports.sync = sync; // already there in Rhino
6
+ exports.ThreadLocal = java.lang.ThreadLocal;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Represents the event queue for a vat
3
+ */
4
+
5
+ // we could eventually upgrade to PriorityBlockingQueye with FIFOEntry tie breaking
6
+ var queue = new java.util.concurrent.LinkedBlockingQueue();
7
+
8
+ exports.nextEvent = function(){
9
+ return queue.take();
10
+ };
11
+
12
+ exports.enqueue = function(task, priority){
13
+ queue.put(task); // priority is ignored for now until PriorityBlockingQueue is used
14
+ };
15
+
16
+ exports.isEmpty = function(){
17
+ return queue.isEmpty();
18
+ }
@@ -0,0 +1,216 @@
1
+
2
+ // use the "file" module as the exports object.
3
+ var exports = require('./file');
4
+
5
+ // File: Rhino
6
+
7
+ var IO = require("./io").IO;
8
+ var os = require('./os');
9
+
10
+ var javaRuntime = function () {
11
+ return Packages.java.lang.Runtime.getRuntime();
12
+ };
13
+
14
+ var javaPopen = function (command) {
15
+ return javaRuntime().exec(command);
16
+ };
17
+
18
+ /* streams */
19
+
20
+ exports.FileIO = function (path, mode, permissions) {
21
+ path = JavaPath(path);
22
+
23
+ var {
24
+ read: read,
25
+ write: write,
26
+ append: append,
27
+ update: update
28
+ } = exports.mode(mode);
29
+
30
+ if (update) {
31
+ throw new Error("Updating IO not yet implemented.");
32
+ } else if (write || append) {
33
+ return new IO(null, new Packages.java.io.FileOutputStream(path, append));
34
+ } else if (read) {
35
+ return new IO(new Packages.java.io.FileInputStream(path), null);
36
+ } else {
37
+ throw new Error("Files must be opened either for read, write, or update mode.");
38
+ }
39
+ };
40
+
41
+ /* paths */
42
+
43
+ exports.cwd = function () {
44
+ return String(Packages.java.lang.System.getProperty("user.dir"));
45
+ };
46
+
47
+ var JavaPath = function (path) {
48
+ return new java.io.File(String(path) || ".");
49
+ };
50
+
51
+ exports.canonical = function (path) {
52
+ return String(JavaPath(path).getCanonicalPath());
53
+ };
54
+
55
+ exports.mtime = function (path) {
56
+ path = JavaPath(path);
57
+ var lastModified = path.lastModified();
58
+ if (lastModified === 0) return undefined;
59
+ else return new Date(lastModified);
60
+ };
61
+
62
+ exports.size = function (path) {
63
+ path = JavaPath(path);
64
+ return path.length();
65
+ };
66
+
67
+ exports.stat = function (path) {
68
+ path = JavaPath(path);
69
+ return {
70
+ mtime: exports.mtime(path),
71
+ size: exports.size(path)
72
+ }
73
+ };
74
+
75
+ exports.exists = function (path) {
76
+ return JavaPath(path).exists();
77
+ };
78
+
79
+ exports.linkExists = function (path) {
80
+ return exports.isLink(path) || exports.exists(path);
81
+ };
82
+
83
+ exports.isDirectory = function (path) {
84
+ try { return JavaPath(path).isDirectory(); } catch (e) {}
85
+ return false;
86
+ };
87
+
88
+ exports.isFile = function (path) {
89
+ try { return JavaPath(path).isFile(); } catch (e) {}
90
+ return false;
91
+ };
92
+
93
+ // XXX not standard
94
+ exports.isAbsolute = function (path) {
95
+ return new java.io.File(path).isAbsolute();
96
+ };
97
+
98
+ /* see: http://www.idiom.com/~zilla/Xfiles/javasymlinks.html */
99
+ exports.isLink = function (path) {
100
+ path = exports.path(path);
101
+ var canonical = path.canonical().toString();
102
+ var absolute = path.absolute().toString();
103
+ return absolute != canonical;
104
+ };
105
+
106
+ exports.isReadable = function (path) {
107
+ return JavaPath(path).canRead();
108
+ };
109
+
110
+ exports.isWritable = function (path) {
111
+ return JavaPath(path).canWrite();
112
+ };
113
+
114
+ exports.chmod = function (path, mode) {
115
+ os.command(['chmod', mode.toString(8), path]);
116
+ };
117
+
118
+ exports.chown = function (path, owner, group) {
119
+
120
+ if (!owner)
121
+ owner = "";
122
+ else
123
+ owner = String(owner);
124
+
125
+ if (group)
126
+ group = String(group);
127
+
128
+ if (/:/.test(owner))
129
+ throw new Error("Invalid owner name");
130
+ if (/:/.test(group))
131
+ throw new Error("Invalid group name");
132
+
133
+ if (group)
134
+ owner = owner + ":" + String(group);
135
+
136
+ os.command(['chown', owner, path]);
137
+ };
138
+
139
+ exports.link = function (source, target) {
140
+ os.command(['ln', source, target]);
141
+ };
142
+
143
+ exports.symlink = function (source, target) {
144
+ // XXX this behavior of resolving the source
145
+ // path from the target path when the source
146
+ // path is relative ought to be discussed
147
+ // on ServerJS
148
+ if (exports.isRelative(source))
149
+ source = exports.relative(target, source);
150
+ os.command(['ln', '-s', source, target]);
151
+ };
152
+
153
+ exports.rename = function (source, target) {
154
+ source = exports.path(source);
155
+ target = source.resolve(target);
156
+ source = JavaPath(source);
157
+ target = JavaPath(target);
158
+ if (!source.renameTo(target))
159
+ throw new Error("failed to rename " + source + " to " + target);
160
+ };
161
+
162
+ exports.move = function (source, target) {
163
+ source = exports.path(source);
164
+ target = exports.path(target);
165
+ source = JavaPath(source);
166
+ target = JavaPath(target);
167
+ if (!source.renameTo(target))
168
+ throw new Error("failed to rename " + source + " to " + target);
169
+ };
170
+
171
+ exports.remove = function (path) {
172
+ if (!JavaPath(path)['delete']())
173
+ throw new Error("failed to delete " + path);
174
+ };
175
+
176
+ exports.mkdir = function (path) {
177
+ if (!JavaPath(path).mkdir())
178
+ throw new Error("failed to make directory " + path);
179
+ };
180
+
181
+ exports.mkdirs = function(path) {
182
+ JavaPath(path).mkdirs();
183
+ if (!exports.isDirectory(path))
184
+ throw new Error("failed to make directories leading to " + path);
185
+ };
186
+
187
+ exports.rmdir = function(path) {
188
+ if (!JavaPath(String(path))['delete']())
189
+ throw new Error("failed to remove the directory " + path);
190
+ };
191
+
192
+ exports.list = function (path) {
193
+ path = JavaPath(String(path));
194
+ var listing = path.list();
195
+
196
+ if (!(listing instanceof Array)) {
197
+ throw new Error("no such directory: " + path);
198
+ }
199
+
200
+ var paths = [];
201
+ for (var i = 0; i < listing.length; i++) {
202
+ paths[i] = String(listing[i]);
203
+ }
204
+
205
+ return paths;
206
+ };
207
+
208
+ exports.touch = function (path, mtime) {
209
+ if (mtime === undefined || mtime === null)
210
+ mtime = new Date();
211
+ path = JavaPath(path);
212
+ path.createNewFile();
213
+ if (!path.setLastModified(mtime.getTime()))
214
+ throw new Error("unable to set mtime of " + path + " to " + mtime);
215
+ };
216
+
@@ -0,0 +1,90 @@
1
+ var IO = require("io").IO,
2
+ HashP = require("hashp").HashP;
3
+
4
+ var engine = exports;
5
+
6
+ engine.connect = function HttpClient_engine_connect (tx) {
7
+ if (tx._isConnected) return;
8
+
9
+ var con = java.net.HttpURLConnection(new java.net.URL(tx.url).openConnection());
10
+ con.setRequestMethod(tx.method.toUpperCase());
11
+
12
+ HashP.forEach(tx.headers, function (h, v) {
13
+ con.setRequestProperty(h, v);
14
+ });
15
+ if (!tx.headers) tx.headers = {};
16
+ var cl = HashP.get(tx.headers, "Content-Length") || 0;
17
+ if (cl > 0) {
18
+ con.setDoOutput(true);
19
+ var os = null;
20
+ try {
21
+ os = con.getOutputStream();
22
+ } catch (ex) {}
23
+ if (os) {
24
+ var writer = new IO(null, con.getOutputStream());
25
+ tx.body.forEach(function (piece) {
26
+ writer.write(piece);
27
+ });
28
+ writer.close();
29
+ }
30
+ }
31
+
32
+ try {
33
+ con.connect();
34
+ } catch (ex) {
35
+ // It would be nice to do something clever and special here,
36
+ // but I'm not feeling it at the moment.
37
+ ex.message = [
38
+ "Could not connect to "+tx.url+". Probably a bad hostname.",
39
+ ex.message
40
+ ].join("\n");
41
+ throw ex;
42
+ }
43
+
44
+ tx._isConnected = true;
45
+ var resp = tx._response = {status:200, headers:{}, body:[]};
46
+
47
+ // Call this now to trigger the fetch asynchronously.
48
+ // This way, if you set up multiple HttpClients, and then call connect()
49
+ // on all of them, you'll only wait as long as the slowest one, since
50
+ // the streams will start filling up right away.
51
+
52
+
53
+ // now pull everything out.
54
+ var fields = con.getHeaderFields();
55
+ var fieldKeys = fields.keySet().toArray();
56
+ for (var i = 0, l = fieldKeys.length; i < l; i ++ ) {
57
+ var fieldValue = fields.get(fieldKeys[i]).toArray().join('');
58
+ var fieldName = fieldKeys[i];
59
+ if (fieldName === null) {
60
+ // Something like: HTTP/1.1 200 OK
61
+ HashP.set(resp, "status", +(/HTTP\/1\.[01] ([0-9]{3})/.exec(fieldValue)[1]));
62
+ // fieldName = "Status";
63
+ resp.statusText = fieldValue;
64
+ continue;
65
+ }
66
+ HashP.set(resp.headers, fieldName, fieldValue);
67
+ }
68
+
69
+ // TODO: Restructure using non-blocking IO to support asynchronous interactions.
70
+ // In that case, you could just have a callback that gets each bytestring.
71
+ var is = null;
72
+ try {
73
+ var is = con.getInputStream();
74
+ } catch (ex) {
75
+ return resp;
76
+ }
77
+
78
+ // TODO: Should the input stream be rewindable?
79
+ var reader = new IO(con.getInputStream(), null);
80
+ resp.body = {forEach : function (block) {
81
+ var buflen = 1024;
82
+ for (
83
+ var bytes = reader.read(buflen);
84
+ bytes.length > 0;
85
+ bytes = reader.read(buflen)
86
+ ) block(bytes);
87
+ }};
88
+
89
+ return resp;
90
+ };
@@ -0,0 +1,10 @@
1
+
2
+ var IO = require('./io').IO;
3
+
4
+ exports.IO = function (url) {
5
+ return new IO(
6
+ new java.net.URL(url).openStream(),
7
+ null
8
+ );
9
+ };
10
+
@@ -0,0 +1,347 @@
1
+ // IO: Rhino
2
+
3
+ var IO = exports.IO = function(inputStream, outputStream) {
4
+ this.inputStream = inputStream;
5
+ this.outputStream = outputStream;
6
+ };
7
+
8
+ IO.prototype.readInto = function(buffer, length, from) {
9
+ var bytes = buffer._bytes; // java byte array
10
+
11
+ var offset = buffer._offset;
12
+ if (typeof from === "number")
13
+ offset += from;
14
+
15
+ if (length > bytes.length + offset)
16
+ throw "FIXME: Buffer too small. Throw or truncate?";
17
+
18
+ var total = 0,
19
+ bytesRead = 0;
20
+
21
+ while (total < length) {
22
+ bytesRead = this.inputStream.read(bytes, offset + total, length - total);
23
+ if (bytesRead < 0)
24
+ break;
25
+ total += bytesRead;
26
+ }
27
+
28
+ return total;
29
+ };
30
+
31
+ IO.prototype.writeInto = function(buffer, from, to) {
32
+ this.outputStream.write(buffer._bytes, buffer._offset + from, to - from);
33
+ };
34
+
35
+ IO.prototype.copy = function (output, mode, options) {
36
+ while (true) {
37
+ var buffer = this.read(null);
38
+ if (!buffer.length)
39
+ break;
40
+ output.write(buffer);
41
+ }
42
+ output.flush();
43
+ return this;
44
+ };
45
+
46
+ IO.prototype.flush = function() {
47
+ this.outputStream.flush();
48
+ return this;
49
+ };
50
+
51
+ IO.prototype.close = function() {
52
+ if (this.inputStream)
53
+ this.inputStream.close();
54
+ if (this.outputStream)
55
+ this.outputStream.close();
56
+ };
57
+
58
+ IO.prototype.isatty = function () {
59
+ return false;
60
+ };
61
+
62
+ exports.TextInputStream = function (raw, lineBuffering, buffering, charset, options) {
63
+ var stream;
64
+
65
+ if (charset === undefined)
66
+ stream = new Packages.java.io.InputStreamReader(raw.inputStream);
67
+ else
68
+ stream = new Packages.java.io.InputStreamReader(raw.inputStream, charset);
69
+
70
+ if (buffering === undefined)
71
+ stream = new Packages.java.io.BufferedReader(stream);
72
+ else
73
+ stream = new Packages.java.io.BufferedReader(stream, buffering);
74
+
75
+ var self = this;
76
+
77
+ self.raw = raw;
78
+
79
+ self.readLine = function () {
80
+ var line = stream.readLine();
81
+ if (line === null)
82
+ return '';
83
+ return String(line) + "\n";
84
+ };
85
+
86
+ self.next = function () {
87
+ var line = stream.readLine();
88
+ if (line === null)
89
+ throw StopIteration;
90
+ return String(line);
91
+ };
92
+
93
+ self.iterator = function () {
94
+ return self;
95
+ };
96
+
97
+ self.forEach = function (block, context) {
98
+ var line;
99
+ while (true) {
100
+ try {
101
+ line = self.next();
102
+ } catch (exception) {
103
+ break;
104
+ }
105
+ block.call(context, line);
106
+ }
107
+ };
108
+
109
+ self.input = function () {
110
+ throw "NYI";
111
+ };
112
+
113
+ self.readLines = function () {
114
+ var lines = [];
115
+ do {
116
+ var line = self.readLine();
117
+ if (line.length)
118
+ lines.push(line);
119
+ } while (line.length);
120
+ return lines;
121
+ };
122
+
123
+ self.read = function () {
124
+ return self.readLines().join('');
125
+ };
126
+
127
+ self.readInto = function (buffer) {
128
+ throw "NYI";
129
+ };
130
+
131
+ self.copy = function (output, mode, options) {
132
+ do {
133
+ var line = self.readLine();
134
+ output.write(line).flush();
135
+ } while (line.length);
136
+ return self;
137
+ };
138
+
139
+ self.close = function () {
140
+ stream.close();
141
+ };
142
+
143
+ return Object.create(self);
144
+ };
145
+
146
+ exports.TextOutputStream = function (raw, lineBuffering, buffering, charset, options) {
147
+ var stream;
148
+
149
+ if (charset === undefined)
150
+ stream = new Packages.java.io.OutputStreamWriter(raw.outputStream);
151
+ else
152
+ stream = new Packages.java.io.OutputStreamWriter(raw.outputStream, charset);
153
+
154
+ if (buffering === undefined)
155
+ stream = new Packages.java.io.BufferedWriter(stream);
156
+ else
157
+ stream = new Packages.java.io.BufferedWriter(stream, buffering);
158
+
159
+ var self = this;
160
+
161
+ self.raw = raw;
162
+
163
+ self.write = function () {
164
+ stream.write.apply(stream, arguments);
165
+ return self;
166
+ };
167
+
168
+ self.writeLine = function (line) {
169
+ self.write(line + "\n"); // todo recordSeparator
170
+ return self;
171
+ };
172
+
173
+ self.writeLines = function (lines) {
174
+ lines.forEach(self.writeLine);
175
+ return self;
176
+ };
177
+
178
+ self.print = function () {
179
+ self.write(Array.prototype.join.call(arguments, " ") + "\n");
180
+ self.flush();
181
+ // todo recordSeparator, fieldSeparator
182
+ return self;
183
+ };
184
+
185
+ self.flush = function () {
186
+ stream.flush();
187
+ return self;
188
+ };
189
+
190
+ self.close = function () {
191
+ stream.close();
192
+ return self;
193
+ };
194
+
195
+ return Object.create(self);
196
+ };
197
+
198
+ exports.TextIOWrapper = function (raw, mode, lineBuffering, buffering, charset, options) {
199
+ if (mode.update) {
200
+ return new exports.TextIOStream(raw, lineBuffering, buffering, charset, options);
201
+ } else if (mode.write || mode.append) {
202
+ return new exports.TextOutputStream(raw, lineBuffering, buffering, charset, options);
203
+ } else if (mode.read) {
204
+ return new exports.TextInputStream(raw, lineBuffering, buffering, charset, options);
205
+ } else {
206
+ throw new Error("file must be opened for read, write, or append mode.");
207
+ }
208
+ };
209
+
210
+
211
+ /* ByteIO */
212
+
213
+ // FIXME: this doesn't read/write the same stream
214
+
215
+ var ByteIO = exports.ByteIO = function(binary) {
216
+ this.inputStream = binary ? new java.io.ByteArrayInputStream(binary._bytes, binary._offset, binary._length) : null;
217
+ this.outputStream = new java.io.ByteArrayOutputStream();
218
+
219
+ var stream = (this.inStream, this.outStream);
220
+
221
+ this.length = binary ? binary.length : 0;
222
+ };
223
+
224
+ ByteIO.prototype = new exports.IO();
225
+
226
+ ByteIO.prototype.toByteString = function() {
227
+ var bytes = this.outputStream.toByteArray();
228
+ var ByteString = require("binary").ByteString;
229
+ return new ByteString(bytes, 0, bytes.length);
230
+ }
231
+
232
+ ByteIO.prototype.decodeToString = function(charset) {
233
+ return String(charset ? this.outputStream.toString(charset) : this.outputStream.toString());
234
+ }
235
+
236
+ var StringIO = exports.StringIO = function (initial, delimiter) {
237
+ var buffer = new java.lang.StringBuffer();
238
+ if (!delimiter)
239
+ delimiter = "\n";
240
+ if (initial)
241
+ buffer.append(initial);
242
+
243
+ function length() {
244
+ return buffer.length();
245
+ }
246
+
247
+ function read(length) {
248
+ if (arguments.length == 0) {
249
+ var result = String(buffer);
250
+ buffer['delete'](0, buffer.length());
251
+ return result;
252
+ } else {
253
+ if (!length || length < 1)
254
+ length = 1024;
255
+ length = Math.min(buffer.length(), length);
256
+ var result = String(buffer.substring(0, length));
257
+ buffer['delete'](0, length);
258
+ return result;
259
+ }
260
+ }
261
+
262
+ function write(text) {
263
+ buffer.append(text);
264
+ return self;
265
+ }
266
+
267
+ function copy(output) {
268
+ output.write(read()).flush();
269
+ return self;
270
+ }
271
+
272
+ function next() {
273
+ if (buffer.length() == 0)
274
+ throw StopIteration;
275
+ var pos = buffer.indexOf(delimiter);
276
+ if (pos == -1)
277
+ pos = buffer.length();
278
+ var result = read(pos);
279
+ read(1);
280
+ return result;
281
+ }
282
+
283
+ var self = {
284
+ get length() {
285
+ return length();
286
+ },
287
+ read: read,
288
+ write: write,
289
+ copy: copy,
290
+ close: function () {
291
+ return self;
292
+ },
293
+ flush: function () {
294
+ return self;
295
+ },
296
+ iterator: function () {
297
+ return self;
298
+ },
299
+ forEach: function (block) {
300
+ while (true) {
301
+ try {
302
+ block.call(this, next());
303
+ } catch (exception) {
304
+ if (exception instanceof StopIteration)
305
+ break;
306
+ throw exception;
307
+ }
308
+ }
309
+ },
310
+ readLine: function () {
311
+ var pos = buffer.indexOf(delimiter);
312
+ if (pos == -1)
313
+ pos = buffer.length();
314
+ return read(pos + 1);
315
+ },
316
+ readLines: function () {
317
+ var lines = [];
318
+ do {
319
+ var line = self.readLine();
320
+ if (line.length)
321
+ lines.push(line);
322
+ } while (line.length);
323
+ return lines;
324
+ },
325
+ next: next,
326
+ print: function (line) {
327
+ return write(line + delimiter).flush();
328
+ },
329
+ toString: function() {
330
+ return String(buffer);
331
+ },
332
+ substring: function () {
333
+ var string = String(buffer);
334
+ return string.substring.apply(string, arguments);
335
+ },
336
+ slice: function () {
337
+ var string = String(buffer);
338
+ return string.slice.apply(string, arguments);
339
+ },
340
+ substr: function () {
341
+ var string = String(buffer);
342
+ return string.substr.apply(string, arguments);
343
+ }
344
+ };
345
+ return Object.create(self);
346
+ };
347
+