return // dont run this test for now since tape is weird and broken on 0.10 var fs = require('fs') var JSONStream = require('../') var file = process.argv[2] || '/tmp/JSONStream-test-large.json' var size = Number(process.argv[3] || 100000) var tape = require('tape') // if (process.title !== 'browser') { tape('out of mem', function (t) { t.plan(1) ////////////////////////////////////////////////////// // Produces a random number between arg1 and arg2 ////////////////////////////////////////////////////// var randomNumber = function (min, max) { var number = Math.floor(Math.random() * (max - min + 1) + min); return number; }; ////////////////////////////////////////////////////// // Produces a random string of a length between arg1 and arg2 ////////////////////////////////////////////////////// var randomString = function (min, max) { // add several spaces to increase chanses of creating 'words' var chars = ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; var result = ''; var randomLength = randomNumber(min, max); for (var i = randomLength; i > 0; --i) { result += chars[Math.round(Math.random() * (chars.length - 1))]; } return result; }; ////////////////////////////////////////////////////// // Produces a random JSON document, as a string ////////////////////////////////////////////////////// var randomJsonDoc = function () { var doc = { "CrashOccurenceID": randomNumber(10000, 50000), "CrashID": randomNumber(1000, 10000), "SiteName": randomString(10, 25), "MachineName": randomString(10, 25), "Date": randomString(26, 26), "ProcessDuration": randomString(18, 18), "ThreadIdentityName": null, "WindowsIdentityName": randomString(15, 40), "OperatingSystemName": randomString(35, 65), "DetailedExceptionInformation": randomString(100, 800) }; doc = JSON.stringify(doc); doc = doc.replace(/\,/g, ',\n'); // add new lines after each attribute return doc; }; ////////////////////////////////////////////////////// // generates test data ////////////////////////////////////////////////////// var generateTestData = function (cb) { console.log('generating large data file...'); var stream = fs.createWriteStream(file, { encoding: 'utf8' }); var i = 0; var max = size; var writing = false var split = ',\n'; var doc = randomJsonDoc(); stream.write('['); function write () { if(writing) return writing = true while(++i < max) { if(Math.random() < 0.001) console.log('generate..', i + ' / ' + size) if(!stream.write(doc + split)) { writing = false return stream.once('drain', write) } } stream.write(doc + ']') stream.end(); console.log('END') } write() stream.on('close', cb) }; ////////////////////////////////////////////////////// // Shows that parsing 100000 instances using JSONStream fails // // After several seconds, you will get this crash // FATAL ERROR: JS Allocation failed - process out of memory ////////////////////////////////////////////////////// var testJSONStreamParse_causesOutOfMem = function (done) { var items = 0 console.log('parsing data files using JSONStream...'); var parser = JSONStream.parse([true]); var stream = fs.createReadStream(file); stream.pipe(parser); parser.on('data', function (data) { items++ if(Math.random() < 0.01) console.log(items, '...') }); parser.on('end', function () { t.equal(items, size) }); }; ////////////////////////////////////////////////////// // main ////////////////////////////////////////////////////// fs.stat(file, function (err, stat) { console.log(stat) if(err) generateTestData(testJSONStreamParse_causesOutOfMem); else testJSONStreamParse_causesOutOfMem() }) }) // }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 19553 | swellard | Move and rename clients | ||
//guest/perforce_software/helix-web-services/main/source/clients/2016.1.0/javascript/node_modules/JSONStream/test/gen.js | |||||
#1 | 18810 | tjuricek |
First-pass at JavaScript client SDK. JavaScript requires Node with Gulp to "browserfy" the library. It's the easiest way I found to use the swagger-js project; bundle up a wrapping method. There is no JavaScript reference guide. The swagger-js doesn't really document what they do very well, actually. Overall I'm not particularly impressed by swagger-js, it was hard to even figure out what the right method syntax was. We may want to invest time in doing it better. This required setting CORS response headers, which are currently defaulted to a fairly insecure setting. |