This comes a bit too late to help you, sorry, but the C docs will tell you
which classes extend a base class, e.g. for GInputStream (Gio.InputStream
in GJS):
https://developer.gnome.org/gio/stable/GInputStream.html#GInputStream.object-hierarchy

On Tue, Nov 7, 2017 at 2:36 PM Andrea Giammarchi <
andrea.giammar...@gmail.com> wrote:

> 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
>
_______________________________________________
javascript-list mailing list
javascript-list@gnome.org
https://mail.gnome.org/mailman/listinfo/javascript-list

Reply via email to