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

Reply via email to