[sword-devel] Prototyping node-sword-interface web service
Tobias Klein
contact at tklein.info
Sun Aug 11 16:34:18 EDT 2024
Hi Fred!
I suppose the redundancy is a general issue of json or xml when having long
lists of elements.
Http servers and clients support gzip compression (and other more modern
algorithms). That's something I could check to optimize the data amounts
that are sent when making requests on this web-based API.
Best regards,
Tobias
Am 11. August 2024 21:03:26 schrieb Fred <fred.fredex at gmail.com>:
> I'm just a lurker here, but... even though I've dabbled in json, I gotta
> say that is horribly verbose! I'd be willing to bet oh, say, fifty cents
> that a slow link would perform poorly. since (as I understand it) it is the
> remote server sending all that, that there'd be no way to filter out all
> the redundant json on each verse, which I'd expect to make it much more
> slow-link-friendly.
>
> Fred
>
> On Sun, Aug 11, 2024 at 1:56 AM Aaron Rainbolt <arraybolt3 at gmail.com> wrote:
> Haven't been replying since I'm busy, but this is awesome. Thank you
> for actually giving my idea a shot! I'll have to experiment with it :)
>
> On Sun, 4 Aug 2024 21:00:24 +0200
> Tobias Klein <contact at tklein.info> wrote:
>
>> Hi Aaron & all,
>>
>> so, this whole thread about SWORD over network inspired me to play
>> with existing technology a bit.
>> The goal: Run Ezra Bible App accessing the SWORD modules via a remote
>> server instead of locally.
>>
>> I implemented a small web service API based on node-sword-interface
>> and expressjs.
>> See https://github.com/ezra-bible-app/ezra-bible-app-server
>>
>> Example -
>> https://github.com/ezra-bible-app/ezra-bible-app-server/blob/main/routes/module.js
>>
>> // Delivers the text of a chapter via the url
>> /module/<moduleCode>/chaptertext/<bookCode>/<chapterNumber>
>>
>> router.get('/:moduleCode/chaptertext/:bookCode/:chapter', (req, res)
>> => { const moduleCode = req.params.moduleCode;
>> const bookCode = req.params.bookCode;
>> const chapter = parseInt(req.params.chapter);
>>
>> const chapterText = nsi.getChapterText(moduleCode, bookCode,
>> chapter); res.json(chapterText);
>> });
>>
>> See here for example server deployed on some AWS machine I quickly
>> set up. The following URL delivers the KJV text of John 5 as JSON.
>> http://ec2-13-48-148-192.eu-north-1.compute.amazonaws.com/module/KJV/chaptertext/John/5
>>
>> Then I made some adjustments in the backend of Ezra Bible App,
>> implementing a "switch" in a few methods that normally access a local
>> node-sword-interface / SWORD installation.
>>
>> The respective example section in the Ezra Bible App backend looks
>> like this:
>> https://github.com/ezra-bible-app/ezra-bible-app/blob/web-api/app/backend/ipc/ipc_nsi_handler.js#L243
>>
>> this._ipcMain.add('nsi_getChapterText', async (moduleCode,
>> bookCode, chapter) => {
>> if (!this._useWebApi) {
>> return this._nsi.getChapterText(moduleCode, bookCode,
>> chapter); } else {
>> return await
>> this.getFromWebApi(`/module/${moduleCode}/chaptertext/${bookCode}/${chapter}`);
>> }
>> });
>>
>> Based on the switch useWebApi (currently just a constant) I can
>> switch between the "local version" and the "remote version".
>> The interface is compatible, because both the local version and the
>> remote version pull data from node-sword-interface and that already
>> returns JSON as of today.
>>
>> I ended up with a test version of Ezra Bible App that would load
>> module lists and offer the regular browsing capabilities as the
>> normal "offline" variant.
>> The performance in the UI for regular Bible browsing is nearly the
>> same.
>>
>> The use case that I see is to install a bunch of popular modules on
>> the server side for different languages and offer these to the user
>> based on quick "online access" right after installing the app.
>>
>> I am also interested how this behaves when the internet connection is
>> slower. I'll report some findings once I have them. It should be easy
>> to simulate that now based on the developer tools built into Electron.
>>
>> Right now this is an experiment. I'll explore a bit more and if this
>> turns out useful, I may think about integrating this into Ezra.
>>
>> Best regards,
>> Tobias
>>
>
> _______________________________________________
> sword-devel mailing list: sword-devel at crosswire.org
> http://crosswire.org/mailman/listinfo/sword-devel
> Instructions to unsubscribe/change your settings at above page
> _______________________________________________
> sword-devel mailing list: sword-devel at crosswire.org
> http://crosswire.org/mailman/listinfo/sword-devel
> Instructions to unsubscribe/change your settings at above page
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://crosswire.org/pipermail/sword-devel/attachments/20240811/8beb00d1/attachment.htm>
More information about the sword-devel
mailing list