SDE2🏢 Swiggy Practice Problem
Create an analytics SDK
Reference Discussion: LeetCode / Discussion Link
Problem Description & Specifications
This is a Swiggy frontend interview question.
Implement an analytics SDK that exposes log events, it takes in events and queues them, and then starts sending the events. The SDK should adhere the following properties.
Send each event after a delay of 1 second and this logging fails every n % 5 times.
Send the next event only after the previous one resolves.
When the failure occurs attempt a retry.
Input:
const sdk = new SDK();
sdk.logEvent("event 1");
sdk.logEvent("event 2");
sdk.logEvent("event 3");
sdk.logEvent("event 4");
sdk.logEvent("event 5");
sdk.logEvent("event 6");
sdk.logEvent("event 7");
sdk.logEvent("event 8");
sdk.logEvent("event 9");
sdk.logEvent("event 10");
sdk.send();
Output:
"Analytics sent event 1"
"Analytics sent event 2"
"Analytics sent event 3"
"Analytics sent event 4"
"-----------------------"
"Failed to send event 5"
"Retrying sending event 5"
"-----------------------"
"Analytics sent event 5"
"Analytics sent event 6"
"Analytics sent event 7"
"Analytics sent event 8"
"-----------------------"
"Failed to send event 9"
"Retrying sending event 9"
"-----------------------"
"Analytics sent event 9"
"Analytics sent event 10"
Related Link - https://leetcode.com/discuss/post/1857338/swiggy-phone-design-analytics-sdk-sde2-b-ustr/Implementation & Test Harness
Editable Monaco RunnerJavaScript Lab Sandbox
/*
This is a Swiggy frontend interview question.
Implement an analytics SDK that exposes log events, it takes in events and queues them, and then starts sending the events. The SDK should adhere the following properties.
Send each event after a delay of 1 second and this logging fails every n % 5 times.
Send the next event only after the previous one resolves.
When the failure occurs attempt a retry.
Input:
const sdk = new SDK();
sdk.logEvent("event 1");
sdk.logEvent("event 2");
sdk.logEvent("event 3");
sdk.logEvent("event 4");
sdk.logEvent("event 5");
sdk.logEvent("event 6");
sdk.logEvent("event 7");
sdk.logEvent("event 8");
sdk.logEvent("event 9");
sdk.logEvent("event 10");
sdk.send();
Output:
"Analytics sent event 1"
"Analytics sent event 2"
"Analytics sent event 3"
"Analytics sent event 4"
"-----------------------"
"Failed to send event 5"
"Retrying sending event 5"
"-----------------------"
"Analytics sent event 5"
"Analytics sent event 6"
"Analytics sent event 7"
"Analytics sent event 8"
"-----------------------"
"Failed to send event 9"
"Retrying sending event 9"
"-----------------------"
"Analytics sent event 9"
"Analytics sent event 10"
Related Link - https://leetcode.com/discuss/post/1857338/swiggy-phone-design-analytics-sdk-sde2-b-ustr/
*/
function customPromise(fn) {
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(fn);
}, 1000);
});
}
class SDK {
constructor() {
this.events = [];
this.count = 1;
};
logEvent(event) {
this.events.push(event);
};
wait() {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (this.count % 5 === 0) {
reject();
} else {
resolve();
}
}, 1000);
});
}
async send() {
while (this.events.length > 0) {
let currentEvent = this.events.shift();
try {
await this.wait();
console.log(`Analytics send ${currentEvent}`);
this.count++;
} catch (error) {
console.log("-----------------------");
console.log("Failed to send " + currentEvent);
console.log("Retrying sending " + currentEvent);
console.log("-----------------------");
this.count = 1;
this.events.unshift(currentEvent);
}
}
}
}
const sdk = new SDK();
sdk.logEvent("event 1");
sdk.logEvent("event 2");
sdk.logEvent("event 3");
sdk.logEvent("event 4");
sdk.logEvent("event 5");
sdk.logEvent("event 6");
sdk.logEvent("event 7");
sdk.logEvent("event 8");
sdk.logEvent("event 9");
sdk.logEvent("event 10");
sdk.send();
Console Output
Click "Run Code" above to execute and view output...