so, just FYI ... Buffered, Converter, Data, File, Memory and Unix InputStream are available.
Buffered, Converter, and Data need a base_stream to work ... not a primitive. File and Unix need attributes or fd pointers The Memory seems to be the "base/primitive" I was looking for together with its MemoryOutputStream counterpart. Regards On Tue, Nov 7, 2017 at 7:28 PM, Andrea Giammarchi < andrea.giammar...@gmail.com> wrote: > oh gosh, my own utility ... that is less useful in pretty print for these > kind of things .... although the list has many non-usable streams but now I > want to know which one is usable. > > P.S. for namespaces you don't' need gi prefix ... cgjs-about Gio would do > the same ;-) > > Thanks again > > On Tue, Nov 7, 2017 at 7:09 PM, Sam Jansen <sam.jan...@starleaf.com> > wrote: > >> >> >> 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