From bd214f7a841f22bb3cca9c99ad5f615a15e20dee Mon Sep 17 00:00:00 2001 From: Dipanjan Biswas Date: Fri, 23 Aug 2019 17:59:24 +0530 Subject: [PATCH] interim checkin --- rudder-client-javascript/RudderClient.js | 211 +++++++++++++------ rudder-client-javascript/RudderClient.min.js | 2 +- 2 files changed, 152 insertions(+), 61 deletions(-) diff --git a/rudder-client-javascript/RudderClient.js b/rudder-client-javascript/RudderClient.js index 5e7f2bea2b..760f713318 100644 --- a/rudder-client-javascript/RudderClient.js +++ b/rudder-client-javascript/RudderClient.js @@ -66,91 +66,76 @@ var RudderIntegrationPlatform = { AMPLITUDE: "amplitude" } -const BASE_URL = ""; +const BASE_URL = "https://rudderlabs.com"; + +const FLUSH_QUEUE_SIZE = 30; + +//Rudder configration class +var RudderConfig = (function () { -//Singleton implementation of the core SDK client class -var RudderClient = (function () { - - // Instance stores a reference to the Singleton var instance; - - function init() { + function init(){ - //Private variables and methods - + //Private variables + var endPointUri = BASE_URL; + var flushQueueSize = FLUSH_QUEUE_SIZE; + var integrations = []; - //Public variables and methods + //Public methods return { - //Track function - track: function(rudderElement){ - if(rudderElement.rl_message){ //process only if valid message is there - rudderElement.rl_message.validateFor(MessageType.TRACK); - //validated, now set event type and add to flush queue - rudderElement.rl_message.rl_type = MessageType.TRACK; - addToFlushQueue(rudderElement); - } + getDefaultIntegrations: function() { + return []; + }, + getEndPointUri: function() { + return this.endPointUri; }, - //Page function - page: function(rudderElement){ - if(rudderElement.rl_message){ //process only if valid message is there - rudderElement.rl_message.validateFor(MessageType.PAGE); - //validated, now set event type and add to flush queue - rudderElement.rl_message.rl_type = MessageType.PAGE; - addToFlushQueue(rudderElement); - } + getFlushQueueSize: function() { + return this.flushQueueSize; + }, + setIntegrations: function(integrations){ + this.integrations = integrations; }, - //Screen function - screen: function(rudderElement){ - if(rudderElement.rl_message){ //process only if valid message is there - rudderElement.rl_message.validateFor(MessageType.SCREEN); - //validated, now set event type and add to flush queue - rudderElement.rl_message.rl_type = MessageType.SCREEN; - addToFlushQueue(rudderElement); - } + setFlushQueueSize: function(flushQueueSize) { + this.flushQueueSize = flushQueueSize; + }, + setEndPointUri: function (endPointUri) { + this.endPointUri = endPointUri; } }; - - }; - - return { - - // Get the Singleton instance if one exists - // or create one if it doesn't - getInstance: function (context, - flushQueueSize = 10, - endPointUri = BASE_URL, - shouldCache = true) { - if ( !instance ) { - if (!context || !context.applicationContext){ - throw new Error("Application context cannot be null"); - } + }; + return { + getDefaultConfig: function() { + if (!instance){ instance = init(); - - //Initialize - instance.context = context; - instance.flushQueueSize = flushQueueSize; - instance.endPointUri = endPointUri; - instance.shouldCache = shouldCache; - } - return instance; } - }; - + })(); +//Event Repository +class EventRepository { + contructor(){ + var events = []; + var eventsBuffer = []; + var writeKey = null; + var rudderConfig = null; + } + + +} + //Payload class, contains batch of Elements class RudderPayload { @@ -500,13 +485,119 @@ class RudderNetwork { } } +//Singleton implementation of the core SDK client class +var RudderClient = function () { + + //Instance stores a reference to the Singleton + var instance; + + + function init() { + + //Private variables and methods + //Rudder config + var rudderConfig; + + //Event repository + var eventRepository; + + + //Public variables and methods + return { + + //Initialize integrations + initiateIntegrations: function (rudderConfig){ + + }, + + //Track function + track: function(rudderElement){ + if(rudderElement.rl_message){ //process only if valid message is there + rudderElement.rl_message.validateFor(MessageType.TRACK); + //validated, now set event type and add to flush queue + rudderElement.rl_message.rl_type = MessageType.TRACK; + addToFlushQueue(rudderElement); + } + + }, + + //Page function + page: function(rudderElement){ + if(rudderElement.rl_message){ //process only if valid message is there + rudderElement.rl_message.validateFor(MessageType.PAGE); + //validated, now set event type and add to flush queue + rudderElement.rl_message.rl_type = MessageType.PAGE; + addToFlushQueue(rudderElement); + } + + }, + + //Screen function + screen: function(rudderElement){ + if(rudderElement.rl_message){ //process only if valid message is there + rudderElement.rl_message.validateFor(MessageType.SCREEN); + //validated, now set event type and add to flush queue + rudderElement.rl_message.rl_type = MessageType.SCREEN; + addToFlushQueue(rudderElement); + } + + } + + } + + } + + return { + + // Get the Singleton instance if one exists + // or create one if it doesn't + getInstance: function (writeKey) { + + return getInstance(writeKey, RudderConfig.getDefaultConfig()); + }, + + getInstance: function (writeKey, rudderConfig){ + + + if ( !instance ) { + + //Check that valid inoput object instances have been provided for creating + //RudderClient instance + + if (!writeKey || 0 === writeKey.length){ + throw new Error("writeKey cannot be null or empty"); + } + + if(!rudderConfig){ + throw new Error("rudderConfig cannot be null"); + } + + + instance = init(); + + //Initialize + eventRepository = new EventRepository(writeKey, rudderConfig); + rudderConfig = rudderConfig; + + initiateIntegrations(rudderConfig); + } + + return instance; + } + + } + +}; + + //Test code context = new RudderContext(); context.applicationContext = {}; var Instance1 = RudderClient.getInstance(context); //console.log(JSON.stringify(new RudderElement())); - +var eventRepository = new EventRepository(); +eventRepository.rudderConfig = new RudderConfig(); diff --git a/rudder-client-javascript/RudderClient.min.js b/rudder-client-javascript/RudderClient.min.js index 907a38ae3a..74a6715792 100644 --- a/rudder-client-javascript/RudderClient.min.js +++ b/rudder-client-javascript/RudderClient.min.js @@ -1 +1 @@ -function generateUUID(){var e=new Date.getTime();typeof performance!=='undefined'&&typeof performance.now==='function'&&(e+=performance.now());return'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(r){var t=(e+Math.random()*16)%16|0;e=Math.floor(e/16);return(r==='x'?t:t&3|8).toString(16)})}var MessageType={TRACK:"track",PAGE:"page",SCREEN:"screen",IDENTIFY:"identify"},ECommerceEvents={PRODUCTS_SEARCHED:"Products Searched",PRODUCT_LIST_VIEWED:"Product List Viewed",PRODUCT_LIST_FILTERED:"Product List Filtered",PROMOTION_VIEWED:"Promotion Viewed",PROMOTION_CLICKED:"Promotion Clicked",PRODUCT_CLICKED:"Product Clicked",PRODUCT_VIEWED:"Product Viewed",PRODUCT_ADDED:"Product Added",PRODUCT_REMOVED:"Product Removed",CART_VIEWED:"Cart Viewed",CHECKOUT_STARTED:"Checkout Started",CHECKOUT_STEP_VIEWED:"Checkout Step Viewed",CHECKOUT_STEP_COMPLETED:"Checkout Step Completed",PAYMENT_INFO_ENTERED:"Payment Info Entered",ORDER_UPDATED:"Order Updated",ORDER_COMPLETED:"Order Completed",ORDER_REFUNDED:"Order Refunded",ORDER_CANCELLED:"Order Cancelled",COUPON_ENTERED:"Coupon Entered",COUPON_APPLIED:"Coupon Applied",COUPON_DENIED:"Coupon Denied",COUPON_REMOVED:"Coupon Removed",PRODUCT_ADDED_TO_WISHLIST:"Product Added to Wishlist",PRODUCT_REMOVED_FROM_WISHLIST:"Product Removed from Wishlist",WISH_LIST_PRODUCT_ADDED_TO_CART:"Wishlist Product Added to Cart",PRODUCT_SHARED:"Product Shared",CART_SHARED:"Cart Shared",PRODUCT_REVIEWED:"Product Reviewed"},RudderIntegrationPlatform={RUDDERLABS:"rudderlabs",GA:"ga",AMPLITUDE:"amplitude"};let BASE_URL="";var Analytics=(function(){var e;function r(){return{track:function(e){e.rl_message&&(e.rl_message.validateFor(MessageType.TRACK),e.rl_message.rl_type=MessageType.TRACK,addToFlushQueue(e))},page:function(e){e.rl_message&&(e.rl_message.validateFor(MessageType.PAGE),e.rl_message.rl_type=MessageType.PAGE,addToFlushQueue(e))},screen:function(e){e.rl_message&&(e.rl_message.validateFor(MessageType.SCREEN),e.rl_message.rl_type=MessageType.SCREEN,addToFlushQueue(e))}}}return{getInstance:function(t,n = 10,l = BASE_URL,s = !0){if(!e){if(!t||!t.applicationContext){throw new Error("Application context cannot be null")}e=r();e.context=t;e.flushQueueSize=n;e.endPointUri=l;e.shouldCache=s}return e}}})();class RudderPayload{constructor(){var e=new Date.toISOString(),r=e.split('T')[0],t=e.split('T')[1].split('Z')[0].split('.')[0],n=e.split('Z')[0].split('.')[1];this.sent_at=r+" "+t+"+"+n;this.batch=null}}class RudderElement{constructor(){this.rl_message=new RudderMessage}setType(e){this.rl_message.rl_type=e}setProperty(e){this.rl_message.rl_properties=rudderProoperty}setUserId(e){this.rl_message.rl_user_id=e}setEventName(e){this.rl_message.rl_event=e}updateTraits(e){this.rl_message.rl_context.rl_traits=e}addIntegrationProps(e,r,t){this.rl_message.rl_integrations.set(e,r);r&&this.rl_message.rl_destination_properties.set(e,t)}}class RudderElementBuilder{constructor(){this.rudderProperty=null;this.event=null;this.userId=null;this.channel=null}setProperty(e){this.rudderProperty=e;return this}setPropertyMap(e){this.rudderProperty||(this.rudderProperty=new RudderProperty);this.rudderProperty.addProperties(e);return this}setPropertyBuilder(e){this.rudderProperty=e.build();return this}setEvent(e){this.event=e;return this}setUserId(e){this.userId=e;return this}setChannel(e){this.channel=e;return this}build(){element=new RudderElement;element.setUserId(this.userId);element.setEventName(this.event);element.setProperty(this.rudderProperty);return element}}class RudderMessage{constructor(){this.rl_channel="web";this.rl_context=null;this.rl_type=null;this.rl_action=null;this.rl_message_id=generateUUID().toString();this.rl_timestamp=new Date.getTime();this.rl_anonymous_id=null;this.rl_user_id=null;this.rl_event=null;this.rl_properties=new Map;this.rl_integrations=new Map;this.rl_destination_properties=new Map}getProperty(e){return this.rl_properties.get(e)}addProperty(e,r){this.rl_properties.set(e,r)}validateFor(e){if(!this.rl_properties){throw new Error("Key rl_properties is required")}switch(e){case MessageType.TRACK:if(!this.rl_event){throw new Error("Key rl_event is required for track event")};if(this.rl_event in Object.values(ECommerceEvents)){switch(rl_event){case ECommerceEvents.CHECKOUT_STEP_VIEWED:;case ECommerceEvents.CHECKOUT_STEP_COMPLETED:;case ECommerceEvents.PAYMENT_INFO_ENTERED:checkForKey("checkout_id");checkForKey("step");break;case ECommerceEvents.PROMOTION_VIEWED:;case ECommerceEvents.PROMOTION_CLICKED:checkForKey("promotion_id");break;case ECommerceEvents.ORDER_REFUNDED:checkForKey("order_id");break;default:}}else if(!this.rl_properties.has("category")||!this.rl_properties.get("category")){throw new Error("Key 'category' is required in rl_properties")};break;case MessageType.PAGE:break;case MessageType.SCREEN:if(!this.rl_properties.has("name")||!this.rl_properties.get("name")){throw new Error("Key 'name' is required in rl_properties")};break}}checkForKey(e){if(!this.rl_properties.has(e)||!this.rl_properties.get(e)){throw new Error("Key '"+e+"' is required in rl_properties")}}addIntegration(e){this.rl_integrations.push(e)}addIntegrations(e){this.rl_integrations.pushValues(e)}}class RudderContext{constructor(){this.rl_app=null;this.rl_traits=null;this.rl_library=null;var e=new RudderOSInfo;e.rl_version="";var r=new RudderScreenInfo;typeof window==='undefined'?(r.rl_width=0,r.rl_height=0,r.rl_density=0,e.rl_version="",e.rl_name="",this.rl_user_agent=null,this.rl_locale=null):(r.rl_width=window.width,r.rl_height=window.height,r.rl_density=window.devicePixelRatio,this.rl_user_agent=navigator.userAgent,this.rl_locale=navigator.language||navigator.browserLanguage);this.screen=r;this.rl_device=null;this.rl_network=null}}class RudderApp{constructor(){this.rl_build="";this.rl_name="";this.rl_namespace="";this.rl_version=""}}class RudderTraits{constructor(){this.rl_address=null;this.rl_age=null;this.rl_birthday=null;this.rl_company=null;this.rl_createdat=null;this.rl_description=null;this.rl_email=null;this.rl_firstname=null;this.rl_gender=null;this.rl_id=null;this.rl_lastname=null;this.rl_name=null;this.rl_phone=null;this.rl_phone=null;this.rl_title=null;this.rl_username=null}}class TraitsAddress{constructor(){this.rl_city="";this.rl_country="";this.rl_postalcode="";this.rl_state="";this.rl_street=""}}class TraitsCompany{constructor(){this.rl_name="";this.rl_id="";this.rl_industry=""}}class RudderLibraryInfo{constructor(){this.rl_name="";this.rl_version=""}}class RudderOSInfo{constructor(){this.rl_name="";this.rl_version=""}}class RudderScreenInfo{constructor(){this.rl_density=0;this.rl_width=0;this.rl_height=0}}class RudderDeviceInfo{constructor(){this.rl_id="";this.rl_manufacturer="";this.rl_model="";this.rl_name=""}}class RudderNetwork{constructor(){this.rl_carrier=""}}context=new RudderContext;context.applicationContext={};var Instance1=Analytics.getInstance(context) +function generateUUID(){var e=new Date.getTime();typeof performance!=='undefined'&&typeof performance.now==='function'&&(e+=performance.now());return'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(r){var n=(e+Math.random()*16)%16|0;e=Math.floor(e/16);return(r==='x'?n:n&3|8).toString(16)})}var MessageType={TRACK:"track",PAGE:"page",SCREEN:"screen",IDENTIFY:"identify"},ECommerceEvents={PRODUCTS_SEARCHED:"Products Searched",PRODUCT_LIST_VIEWED:"Product List Viewed",PRODUCT_LIST_FILTERED:"Product List Filtered",PROMOTION_VIEWED:"Promotion Viewed",PROMOTION_CLICKED:"Promotion Clicked",PRODUCT_CLICKED:"Product Clicked",PRODUCT_VIEWED:"Product Viewed",PRODUCT_ADDED:"Product Added",PRODUCT_REMOVED:"Product Removed",CART_VIEWED:"Cart Viewed",CHECKOUT_STARTED:"Checkout Started",CHECKOUT_STEP_VIEWED:"Checkout Step Viewed",CHECKOUT_STEP_COMPLETED:"Checkout Step Completed",PAYMENT_INFO_ENTERED:"Payment Info Entered",ORDER_UPDATED:"Order Updated",ORDER_COMPLETED:"Order Completed",ORDER_REFUNDED:"Order Refunded",ORDER_CANCELLED:"Order Cancelled",COUPON_ENTERED:"Coupon Entered",COUPON_APPLIED:"Coupon Applied",COUPON_DENIED:"Coupon Denied",COUPON_REMOVED:"Coupon Removed",PRODUCT_ADDED_TO_WISHLIST:"Product Added to Wishlist",PRODUCT_REMOVED_FROM_WISHLIST:"Product Removed from Wishlist",WISH_LIST_PRODUCT_ADDED_TO_CART:"Wishlist Product Added to Cart",PRODUCT_SHARED:"Product Shared",CART_SHARED:"Cart Shared",PRODUCT_REVIEWED:"Product Reviewed"},RudderIntegrationPlatform={RUDDERLABS:"rudderlabs",GA:"ga",AMPLITUDE:"amplitude"};let BASE_URL="https://rudderlabs.com",FLUSH_QUEUE_SIZE=30;var RudderConfig=(function(){var e;function r(){[];return{getDefaultIntegrations:function(){return[]},getEndPointUri:function(){return this.endPointUri},getFlushQueueSize:function(){return this.flushQueueSize},setIntegrations:function(e){this.integrations=e},setFlushQueueSize:function(e){this.flushQueueSize=e},setEndPointUri:function(e){this.endPointUri=e}}}return{getDefaultConfig:function(){e||(e=r());return e}}})();class EventRepository{contructor(){[];[]}}class RudderPayload{constructor(){var e=new Date.toISOString(),r=e.split('T')[0],n=e.split('T')[1].split('Z')[0].split('.')[0],t=e.split('Z')[0].split('.')[1];this.sent_at=r+" "+n+"+"+t;this.batch=null}}class RudderElement{constructor(){this.rl_message=new RudderMessage}setType(e){this.rl_message.rl_type=e}setProperty(e){this.rl_message.rl_properties=rudderProoperty}setUserId(e){this.rl_message.rl_user_id=e}setEventName(e){this.rl_message.rl_event=e}updateTraits(e){this.rl_message.rl_context.rl_traits=e}addIntegrationProps(e,r,n){this.rl_message.rl_integrations.set(e,r);r&&this.rl_message.rl_destination_properties.set(e,n)}}class RudderElementBuilder{constructor(){this.rudderProperty=null;this.event=null;this.userId=null;this.channel=null}setProperty(e){this.rudderProperty=e;return this}setPropertyMap(e){this.rudderProperty||(this.rudderProperty=new RudderProperty);this.rudderProperty.addProperties(e);return this}setPropertyBuilder(e){this.rudderProperty=e.build();return this}setEvent(e){this.event=e;return this}setUserId(e){this.userId=e;return this}setChannel(e){this.channel=e;return this}build(){element=new RudderElement;element.setUserId(this.userId);element.setEventName(this.event);element.setProperty(this.rudderProperty);return element}}class RudderMessage{constructor(){this.rl_channel="web";this.rl_context=null;this.rl_type=null;this.rl_action=null;this.rl_message_id=generateUUID().toString();this.rl_timestamp=new Date.getTime();this.rl_anonymous_id=null;this.rl_user_id=null;this.rl_event=null;this.rl_properties=new Map;this.rl_integrations=new Map;this.rl_destination_properties=new Map}getProperty(e){return this.rl_properties.get(e)}addProperty(e,r){this.rl_properties.set(e,r)}validateFor(e){if(!this.rl_properties){throw new Error("Key rl_properties is required")}switch(e){case MessageType.TRACK:if(!this.rl_event){throw new Error("Key rl_event is required for track event")};if(this.rl_event in Object.values(ECommerceEvents)){switch(rl_event){case ECommerceEvents.CHECKOUT_STEP_VIEWED:;case ECommerceEvents.CHECKOUT_STEP_COMPLETED:;case ECommerceEvents.PAYMENT_INFO_ENTERED:checkForKey("checkout_id");checkForKey("step");break;case ECommerceEvents.PROMOTION_VIEWED:;case ECommerceEvents.PROMOTION_CLICKED:checkForKey("promotion_id");break;case ECommerceEvents.ORDER_REFUNDED:checkForKey("order_id");break;default:}}else if(!this.rl_properties.has("category")||!this.rl_properties.get("category")){throw new Error("Key 'category' is required in rl_properties")};break;case MessageType.PAGE:break;case MessageType.SCREEN:if(!this.rl_properties.has("name")||!this.rl_properties.get("name")){throw new Error("Key 'name' is required in rl_properties")};break}}checkForKey(e){if(!this.rl_properties.has(e)||!this.rl_properties.get(e)){throw new Error("Key '"+e+"' is required in rl_properties")}}addIntegration(e){this.rl_integrations.push(e)}addIntegrations(e){this.rl_integrations.pushValues(e)}}class RudderContext{constructor(){this.rl_app=null;this.rl_traits=null;this.rl_library=null;var e=new RudderOSInfo;e.rl_version="";var r=new RudderScreenInfo;typeof window==='undefined'?(r.rl_width=0,r.rl_height=0,r.rl_density=0,e.rl_version="",e.rl_name="",this.rl_user_agent=null,this.rl_locale=null):(r.rl_width=window.width,r.rl_height=window.height,r.rl_density=window.devicePixelRatio,this.rl_user_agent=navigator.userAgent,this.rl_locale=navigator.language||navigator.browserLanguage);this.screen=r;this.rl_device=null;this.rl_network=null}}class RudderApp{constructor(){this.rl_build="";this.rl_name="";this.rl_namespace="";this.rl_version=""}}class RudderTraits{constructor(){this.rl_address=null;this.rl_age=null;this.rl_birthday=null;this.rl_company=null;this.rl_createdat=null;this.rl_description=null;this.rl_email=null;this.rl_firstname=null;this.rl_gender=null;this.rl_id=null;this.rl_lastname=null;this.rl_name=null;this.rl_phone=null;this.rl_phone=null;this.rl_title=null;this.rl_username=null}}class TraitsAddress{constructor(){this.rl_city="";this.rl_country="";this.rl_postalcode="";this.rl_state="";this.rl_street=""}}class TraitsCompany{constructor(){this.rl_name="";this.rl_id="";this.rl_industry=""}}class RudderLibraryInfo{constructor(){this.rl_name="";this.rl_version=""}}class RudderOSInfo{constructor(){this.rl_name="";this.rl_version=""}}class RudderScreenInfo{constructor(){this.rl_density=0;this.rl_width=0;this.rl_height=0}}class RudderDeviceInfo{constructor(){this.rl_id="";this.rl_manufacturer="";this.rl_model="";this.rl_name=""}}class RudderNetwork{constructor(){this.rl_carrier=""}}var RudderClient=function(){var e;function r(){return{initiateIntegrations:function(e){},track:function(e){e.rl_message&&(e.rl_message.validateFor(MessageType.TRACK),e.rl_message.rl_type=MessageType.TRACK,addToFlushQueue(e))},page:function(e){e.rl_message&&(e.rl_message.validateFor(MessageType.PAGE),e.rl_message.rl_type=MessageType.PAGE,addToFlushQueue(e))},screen:function(e){e.rl_message&&(e.rl_message.validateFor(MessageType.SCREEN),e.rl_message.rl_type=MessageType.SCREEN,addToFlushQueue(e))}}}return{getInstance:function(e){return getInstance(e,RudderConfig.getDefaultConfig())},getInstance:function(n,t){if(!e){if(!n||0===n.length){throw new Error("writeKey cannot be null or empty")}if(!t){throw new Error("rudderConfig cannot be null")}e=r();eventRepository=new EventRepository(n,t);t=t;initiateIntegrations(t)}return e}}};context=new RudderContext;context.applicationContext={};var Instance1=RudderClient.getInstance(context),eventRepository=new EventRepository;eventRepository.rudderConfig=new RudderConfig