Skip to content

Decode vs. encode in node.js #78

Open
@dancesWithCycles

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions