Skip to content

Decode vs. encode in node.js #78

Description

@dancesWithCycles

Hi folks,
I hope this finds you well. I hope I am blind or misunderstood the bindings version for node.js. I can get a decode example working but not for encoding. Here are the respective decoding and encoding source files. Can anyone open up my eyes please?

Decoding:

const GtfsRealtimeBindings = require('gtfs-realtime-bindings');
const debug = require('debug')('gtfs');
const fs = require("fs");

fs.open('./vehicle_position_another.pb', 'r', function(status, fd) {
    if (status) {
        debug('status: %s',status.message);
        return;
    }else{
        // fs.readFile takes the file path and the callback
        const buffer=fs.readFileSync('./vehicle_position_another.pb', (err, data) => {
            // if there's an error, log it and return
            if (err) {
                debug('error: %s',err)
                return
            }
        })
        // Print the string representation of the data
        if(buffer){
            // decode
            var feed = GtfsRealtimeBindings.transit_realtime.FeedMessage.decode(buffer);
            if(feed){
                debug('feed: %s',feed)
                debug('feed.toString(): %s',feed.toString())
                let header=feed.header;
                if(header){
                    debug('header: %s',header)
                    let gtfsRealtimeVersion=header.gtfsRealtimeVersion;
                    if(gtfsRealtimeVersion){
                        debug('gtfsRealtimeVersion: %s',gtfsRealtimeVersion)
                    }
                }
                feed.entity.forEach(function(entity) {
                    if (entity.trip_update) {
                        debug('trip update')
                    }else if(entity.vehicle){
                        debug('vehicle position')
                        debug('entity to string: %s',entity.vehicle.toString())
                    }else if(entity.alert){
                        debug('alert')
                    }else{
                        debug('entity unknown')
                    }
                });
            
                // Verify the payload if necessary (i.e. when possibly incomplete or invalid)
                let errMsg = GtfsRealtimeBindings.transit_realtime.FeedMessage.verify(feed);
                if (errMsg){
                    debug('msg invalid')
                    throw Error(errMsg);
                }else{
                    debug('msg valid')
                }

                feed.header.gtfsRealtimeVersion='2.0';

                // Verify the payload if necessary (i.e. when possibly incomplete or invalid)
                errMsg = GtfsRealtimeBindings.transit_realtime.FeedMessage.verify(feed);
                if (errMsg){
                    debug('msg invalid')
                    throw Error(errMsg);
                }else{
                    debug('msg valid')
                }

                const bufEnc = GtfsRealtimeBindings.transit_realtime.FeedMessage.encode(feed);
                debug('bufEnc: %s',bufEnc)
                debug('bufEnc.toString(): %s',bufEnc.toString())
            }else{
                debug('feed unavailabe')
            }
        }else{
            debug('buffer unavailable')
        }
    }
});

Encoding:

const GtfsRealtimeBindings = require('gtfs-realtime-bindings');
const debug = require('debug')('gtfs');

let msgFeedHdr={
    gtfs_realtime_version:"2.0"
}

var feedHeader = GtfsRealtimeBindings.transit_realtime.FeedHeader.create(msgFeedHdr); // or use .fromObject if conversion is necessary
debug('feedHeader created')
debug('feedHeader: %s',feedHeader)

var errMsg = GtfsRealtimeBindings.transit_realtime.FeedHeader.verify(feedHeader);
if (errMsg){
    debug('feedHeader invalid')
    throw Error(errMsg);
}else{
    debug('feedHeader valid')
}

let msgFeedMsg={
    header:{feedHeader}
}

var feedMessage = GtfsRealtimeBindings.transit_realtime.FeedMessage.create(msgFeedMsg); // or use .fromObject if conversion is necessary
debug('feedMessage created')
debug('feedMessage: %s',feedMessage)

var errMsg = GtfsRealtimeBindings.transit_realtime.FeedMessage.verify(feedMessage);
if (errMsg){
    debug('feedMessage invalid')
    throw Error(errMsg);
}else{
    debug('feedMessage valid')
}

Decoding output:

~/Desktop/sandbox/gtfsRtBindingsDecode$ nodemon index.js 
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node index.js`
  gtfs feed: [object Object] +0ms
  gtfs feed.toString(): [object Object] +4ms
  gtfs header: [object Object] +0ms
  gtfs gtfsRealtimeVersion: 1.0 +0ms
  gtfs vehicle position +0ms
  gtfs entity to string: [object Object] +0ms
  gtfs msg valid +1ms
  gtfs msg valid +0ms
  gtfs bufEnc: [object Object] +2ms
  gtfs bufEnc.toString(): [object Object] +1ms
[nodemon] clean exit - waiting for changes before restart

Encoding output:

~/Desktop/sandbox/gtfsRtBindingsEncode$ nodemon index.js 
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node index.js`
  gtfs feedHeader created +0ms
  gtfs feedHeader: [object Object] +3ms
  gtfs feedHeader valid +1ms
  gtfs feedMessage created +0ms
  gtfs feedMessage: [object Object] +0ms
  gtfs feedMessage invalid +0ms
/home/user/Desktop/sandbox/gtfsRtBindingsEncode/index.js:31
    throw Error(errMsg);
    ^

Error: header.gtfsRealtimeVersion: string expected
    at Object.<anonymous> (/home/user/Desktop/sandbox/gtfsRtBindingsEncode/index.js:31:11)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
[nodemon] app crashed - waiting for file changes before starting...

Cheers!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions