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