1
0
Fork 0

[DEV-5312] Set processed flag

master
Austin Schaffer 2019-11-12 17:10:19 -05:00
parent e737850efd
commit 309585cf6e
7 changed files with 235 additions and 32 deletions

7
.env 100644
View File

@ -0,0 +1,7 @@
hostname=localhost
port=5672
username=
password=
vhost=dev
exchange=quoteupdate

View File

@ -61,18 +61,6 @@
"heartbeat": 0, "heartbeat": 0,
"vhost": "/", "vhost": "/",
"exchange": "postrate" "exchange": "postrate"
},
"deltaPublish": {
"protocol": "amqp",
"hostname": "localhost",
"port": 5672,
"username": "",
"password": "",
"locale": "en_US",
"frameMax": 0,
"heartbeat": 0,
"vhost": "/",
"exchange": "quoteupdate"
} }
}, },
"c1export": { "c1export": {

View File

@ -39,7 +39,8 @@
"@types/mocha": "5.2.0", "@types/mocha": "5.2.0",
"sinon": ">=1.17.4", "sinon": ">=1.17.4",
"es6-promise": "~3", "es6-promise": "~3",
"@types/amqplib": "0.5.13" "@types/amqplib": "0.5.13",
"avro-js": "1.9.1"
}, },
"licenses": [ "licenses": [

View File

@ -34,7 +34,7 @@ export declare class BaseQuote implements Quote
* *
* @return quote program * @return quote program
*/ */
getProgram(): Program getProgram(): Program;
/** /**
@ -42,7 +42,7 @@ export declare class BaseQuote implements Quote
* *
* @return program id * @return program id
*/ */
getProgramId(): string getProgramId(): string;
/** /**
@ -54,7 +54,7 @@ export declare class BaseQuote implements Quote
* *
* @return quote id * @return quote id
*/ */
getId(): QuoteId getId(): QuoteId;
/** /**
@ -62,7 +62,7 @@ export declare class BaseQuote implements Quote
* *
* @return id of current step * @return id of current step
*/ */
getCurrentStepId(): number getCurrentStepId(): number;
/** /**
@ -73,7 +73,7 @@ export declare class BaseQuote implements Quote
* *
* @return self * @return self
*/ */
setExplicitLock( reason: string, step: number ): this setExplicitLock( reason: string, step: number ): this;
/** /**
@ -83,7 +83,7 @@ export declare class BaseQuote implements Quote
* *
* @return self * @return self
*/ */
setLastPremiumDate( timestamp: UnixTimestamp ): this setLastPremiumDate( timestamp: UnixTimestamp ): this;
/** /**
@ -91,7 +91,7 @@ export declare class BaseQuote implements Quote
* *
* @return last calculated time or 0 * @return last calculated time or 0
*/ */
getLastPremiumDate(): UnixTimestamp getLastPremiumDate(): UnixTimestamp;
/** /**
@ -99,7 +99,7 @@ export declare class BaseQuote implements Quote
* *
* @return the data bucket * @return the data bucket
*/ */
getBucket(): QuoteDataBucket getBucket(): QuoteDataBucket;
/** /**
@ -107,7 +107,7 @@ export declare class BaseQuote implements Quote
* *
* @return lock reason * @return lock reason
*/ */
getExplicitLockReason(): string getExplicitLockReason(): string;
/** /**
@ -117,7 +117,7 @@ export declare class BaseQuote implements Quote
* *
* @return {number} locked max step or 0 if not applicable * @return {number} locked max step or 0 if not applicable
*/ */
getExplicitLockStep(): PositiveInteger getExplicitLockStep(): PositiveInteger;
/** /**
@ -125,7 +125,7 @@ export declare class BaseQuote implements Quote
* *
* @return true if imported, otherwise false * @return true if imported, otherwise false
*/ */
isImported(): boolean isImported(): boolean;
/** /**
@ -133,7 +133,7 @@ export declare class BaseQuote implements Quote
* *
* @return true if bound, otherwise false * @return true if bound, otherwise false
*/ */
isBound(): boolean isBound(): boolean;
/** /**
@ -141,7 +141,7 @@ export declare class BaseQuote implements Quote
* *
* @return top visited step id * @return top visited step id
*/ */
getTopVisitedStepId(): PositiveInteger getTopVisitedStepId(): PositiveInteger;
/** /**
@ -149,5 +149,5 @@ export declare class BaseQuote implements Quote
* *
* @return top saved step id * @return top saved step id
*/ */
getTopSavedStepId(): PositiveInteger getTopSavedStepId(): PositiveInteger;
} }

View File

@ -168,4 +168,26 @@ export class DeltaProcessor
return 0; return 0;
} }
/**
* Generate amqp config from environment variables
*
* @returns the amqp configuration
*/
// generateConfigFromEnv(): AmqpConfig
// {
// return <AmqpConfig>{
// "protocol": "amqp",
// "hostname": process.env.hostname,
// "port": process.env.port,
// "username": process.env.username,
// "password": process.env.password,
// "locale": "en_US",
// "frameMax": 0,
// "heartbeat": 0,
// "vhost": process.env.vhost,
// "exchange": process.env.exchange,
// };
// }
} }

View File

@ -29,6 +29,8 @@ import {
Channel Channel
} from 'amqplib'; } from 'amqplib';
const avro = require( 'avro-js' );
export interface AmqpConfig extends Options.Connect { export interface AmqpConfig extends Options.Connect {
/** The name of a queue or exchange to publish to */ /** The name of a queue or exchange to publish to */
@ -38,6 +40,9 @@ export interface AmqpConfig extends Options.Connect {
export class DeltaPublisher implements AmqpPublisher export class DeltaPublisher implements AmqpPublisher
{ {
/** The path to the avro schema */
readonly SCHEMA_PATH = './avro/schema.avsc';
/** A mapping of which delta type translated to which avro event */ /** A mapping of which delta type translated to which avro event */
readonly DELTA_MAP: Record<string, string> = { readonly DELTA_MAP: Record<string, string> = {
data: 'rate', data: 'rate',
@ -48,8 +53,8 @@ export class DeltaPublisher implements AmqpPublisher
/** /**
* Initialize trait * Initialize trait
* *
* @param {Object} conf AMQP configuration * @param _conf - amqp configuration
* @param {DebugLog} logger logger instance * @param _logger - logger instance
*/ */
constructor( constructor(
private readonly _conf: AmqpConfig, private readonly _conf: AmqpConfig,
@ -115,10 +120,12 @@ export class DeltaPublisher implements AmqpPublisher
const event_id = this.DELTA_MAP[ delta.type ]; const event_id = this.DELTA_MAP[ delta.type ];
const data = new Buffer( JSON.stringify( { const data = {
delta: delta, delta: delta,
event: event_id, event: event_id,
} ) ); };
const avro_buffer = this._avroEncode( data );
// we don't use a routing key; fanout exchange // we don't use a routing key; fanout exchange
const routing_key = ''; const routing_key = '';
@ -126,8 +133,25 @@ export class DeltaPublisher implements AmqpPublisher
return channel.publish( return channel.publish(
exchange, exchange,
routing_key, routing_key,
data, avro_buffer,
{ headers: headers }, { headers: headers },
); );
} }
/**
* Encode the data in an avro buffer
*
* @param data - the data to encode
*
* @return the avro buffer
*/
_avroEncode( data: Record<string, any> ): Buffer
{
const type = avro.parse( this.SCHEMA_PATH );
const buffer = type.toBuffer( data );
return buffer;
}
} }

View File

@ -0,0 +1,161 @@
{
"type": "record",
"name": "update",
"fields": [
{
"name": "event",
"type": {
"type": "record",
"name": "Event",
"fields": [
{
"name": "id",
"type": {
"name": "EventId",
"type": "enum",
"symbols": [
"STEP_SAVE",
"RATE"
]
}
},
{
"name": "ts",
"type": "long",
"logicalType": "timestamp-millis"
},
{
"name": "actor",
"type": {
"type": "enum",
"name": "EventActor",
"symbols": [ "USER", "CLIENT", "SERVER" ]
}
},
{
"name": "step",
"type": {
"type": "record",
"name": "EventStep",
"fields": [
{
"name": "transition",
"type": {
"type": "enum",
"name": "EventStepTransition",
"symbols": [ "BACK", "FORWARD", "END" ]
}
},
{
"name": "src",
"type": "string"
},
{
"name": "dest",
"type": "string"
}
]
}
}
]
}
},
{
"name": "document",
"type": {
"type": "record",
"name": "Document",
"doc": "Source document (quote)",
"fields": [
{
"name": "id",
"type": "int"
},
{
"name": "created",
"type": "long",
"logicalType": "timestamp-millis"
},
{
"name": "modified",
"type": "long",
"logicalType": "timestamp-millis"
},
{
"name": "top_visited_step",
"type": "string"
}
]
}
},
{
"name": "session",
"type": {
"type": "record",
"name": "Session",
"fields": [
{
"name": "entity_name",
"type": "string"
},
{
"name": "entity_id",
"type": "int"
}
]
}
},
{
"name": "data",
"type": [
"null",
{
"type": "record",
"name": "Data",
"fields": [
{
"name": "bucket",
"type": {
"type": "map",
"values": {
"type" : "array",
"items" : "string"
}
}
}
]
}
]
},
{
"name": "delta",
"type": [
"null",
"Data"
]
},
{
"name": "program",
"type": [
"null",
{
"type": "record",
"name": "Program",
"fields": [
{
"type": "string",
"name": "id",
"doc": "Program id"
},
{
"type": "string",
"name": "version",
"doc": "Program version"
}
]
}
]
}
]
}