On 7 November 2017 at 21:55, Andrea Giammarchi <andrea.giammar...@gmail.com> wrote:
> 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! > > I just took an educated guess: I figured anything useful would extend Gio.InputStream. I then just browsed through the docs, looking for anything with "InputStream" in their name, which isn't so many... This is a good place to start perhaps: $ cgjs-about gi.Gio --json | grep InputStream | grep -Ev "Class|Private" It would be a neat extension to cgjs-about if one could have it list the classes known to implement an interface or extend from a class... > 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