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

Reply via email to