this is gold, thank you!!! do you know if MemoryInputStream is the only one usable? is there any list of available GJS streams one can use? I think memory is just fine though, thanks again a lot!
On Tue, Nov 7, 2017 at 6:46 PM, Sam Jansen <sam.jan...@starleaf.com> wrote: > Hi Andrea, > > I've come up with something that... almost does what you're looking at > here. Perhaps it's useful as a guide of what one can do with the Gio > interface. > > I think you may hit some awkward problems with modelling Node-style > streams with GLib ones. But perhaps it is possible and this helps. I don't > really know the Node stream semantics so I have assumed various things in > my Readable implementation as you'll see... Note that MemoryInputStream > really is just a byte stream; so there is no guarantee you'll receive the > exact block of bytes that was written -- for example, when I run this I get > a first chunk of "12", followed by "3", "4", etc. > > > let Gio = imports.gi.Gio; > let byteArray = imports.byteArray; > let mainloop = imports.mainloop; > > class Readable { > constructor() { > this._mio = Gio.MemoryInputStream.new(); > this._callbacks = {}; > this._startNext(); > } > > _startNext() { > // Enqueue an async read; and re-enqueue when it finishes, so we're > // always waiting for data... > this._mio.read_bytes_async(4096, 1, null, (source, res) => { > this._onData(this._mio.read_bytes_finish(res)); > this._startNext(); > }); > } > > _onData(bytes) { > if (this._callbacks['data']) { > let ba = byteArray.fromGBytes(bytes); > this._callbacks['data'](ba); > this._read(); > } > } > > push(bytes) { > if (bytes == null) { > mainloop.quit('main'); > return; > } > this._mio.add_bytes(bytes); > } > > on(name, callback) { > this._callbacks[name] = callback; > if (name === 'data') { > this._read(); > } > } > } > > class Counter extends Readable { > constructor(opt) { > super(opt); > this._max = 1000; > this._index = 1; > } > > _read() { > const i = this._index++; > if (i > this._max) > this.push(null); > else { > const str = '' + i; > const buf = byteArray.fromString(str); // Buffer.from(str, 'ascii'); > this.push(buf); > } > } > } > > (new Counter).on('data', (str) => { > print("data", str.toString()); > }); > > mainloop.run('main'); > > > On 7 November 2017 at 10:08, Andrea Giammarchi < > andrea.giammar...@gmail.com> wrote: > >> I am trying to implement a stream module and apparently I have everything >> I need but practically I'm unable to use streams. >> >> If I instantiate a `new Gio.InputStream` I have the following error: >> cannot create instance of abstract (non-instantiatable) type >> 'GInputStream' >> >> I cannot even extend it ... so I've though "ok, maybe it's like an >> interface, I implement it and that's it" >> >> But then a JS class wouldn't work as base_stream for a >> Gio.BufferedInputStream, and if I extend the JS class to be a >> GObject.Object then: >> Gjs-WARNING **: JS ERROR: TypeError: Object is of type GObject.Object - >> cannot convert to GInputStream >> >> where GInputStream is the one I cannot use in the first place. >> >> I've reached full circle then so ... I wonder if anyone has any idea how >> to use/create/extend streams in GJS (not talking about file streams but >> streams in general) or if it's even possible. >> >> In node, as example, I could do this and it will work: >> >> ```js >> >> const { Readable } = require('stream'); >> >> class Counter extends Readable { >> constructor(opt) { >> super(opt); >> this._max = 1000; >> this._index = 1; >> } >> >> _read() { >> const i = this._index++; >> if (i > this._max) >> this.push(null); >> else { >> const str = '' + i; >> const buf = Buffer.from(str, 'ascii'); >> this.push(buf); >> } >> } >> } >> >> (new Counter).on('data', console.log); >> >> ``` >> >> _______________________________________________ >> javascript-list mailing list >> javascript-list@gnome.org >> https://mail.gnome.org/mailman/listinfo/javascript-list >> >> >
_______________________________________________ javascript-list mailing list javascript-list@gnome.org https://mail.gnome.org/mailman/listinfo/javascript-list