Skip to content
Emad Aghayi edited this page Sep 26, 2018 · 5 revisions

Server-side Implementation

Crowdcode’s server is implemented on a Node.js platform with the Express.js framework. The advantage of the Node server is that it is asynchronous. This means there is only one thread that runs continuously, which does not wait for requests to be responded before moving on to another request, increasing server performance. In this version, there are only two types of microtasks.

  1. Implementation – The worker can write code or tests or do both.
  2. Review – The worker shall review implementation tasks submitted by another worker. Either accept or reject

Differences with the previous version or CrowdCode

In the traditional approach

  1. Client sends requests
  2. The server fetches data from the database
  3. Performs operations
  4. Stores data back into the database
  5. Responds to request

But this is modified in the current implementation of Crowd Microservises, where all the project data related to microtasks is eagerly loaded into the servers’ memory at the first request for a project.

  1. Client sends request
  2. The server performs the operation on the data memory
  3. Responds to client
  4. Updates database

There are 4 main classes in the server

  1. User Services – Methods for user login and logout as well as obtaining user data such as avatar pic, email id, etc.
  2. Firebase Service – Methods to create, update, retrieve and delete all the objects in firebase.
  3. Microtask Service – Methods to load projects into memory as well as methods to perform generate, submit, fetch and skip microtask operations in the server
  4. Deployment Service – Methods to create a microservice from the project and deploy it as a separate app on Heroku.

MicrotaskService class

  1. LoadProject – Loads a project into the memory from firebase, if it does not already exist
  2. LoadFunctions – Loads all the functions that are yet to be implemented
  3. LoadTests – Loads all the tests for each function that is present in the memory
  4. LoadState – If the project was previously being implemented, it loads the state of the project into memory
  5. LoadMicrotasks – Loads all the microtasks, that are listed in the state or generates the tasks
  6. GenerateImplementationTask – Generates an implementation microtask for a function
  7. GenerateReviewTask – Generates a review microtask based on the implementation task
  8. SubmitImplementationTask – Stores the user submission in microtask and calls for the generation of a review task.
  9. SubmitReviewTask – Stores the user review and rating. Based on which the function is updated/not updated. Calls for generation of implementation task if the function is not completed. If the function is complete, it is removed from memory and an implementation task is generated for the next incomplete function.
  10. FetchMicrotask – Returns a microtask. Review tasks always have priority over implementation. The method checks if the user requesting already had a task assigned, in which case it returns the same task again. It triggers a timer for the task to be auto-submitted after the interval
  11. SkipMicrotask – Add the users' current microtask to the skipped tasks list for that user. Add the microtask back into its respective queue and calls fetch microtask. If there are no new tasks in the queue and there is more than one task in the skipped task list, it clears the skipped tasks list and then calls for fetch microtask
  12. UnassignLockedMicrotask – If the task is not submitted even after the allocated time, this changes its status back to unassigned and creates a new microtask. The previous task is flagged as submitted. The assigned task for the user is also changed to null.

Firebaseservice class

  1. All interactions are logged in the database in the \histroy\events via firebase.createEvent method

Implementation decisions

The server holds data in the form of maps (shown below) with keys generated by firebase and values being the JSON objects. Some queues are implemented using stacks (as queues are not available in JavaScript). Below is a list of all the objects held by the server in its memory.

  1. Projects Map – holds all the projects a. (Project Id, Project Map)
  2. Project Map – Hold individual project a. (“functions”, Functions Map) b. (“tests”, Tests Map) c. (“microtasks”, Microtasks Map) d. (“workers”, Workers Map) e. (“ImplementationQ”, Implementation Queue Array) f. (“reviewQ”, Review Queue Array) g. (“inProgressQ”, In Progress Map)
  3. Functions Map a. (function id, function object)
  4. Tests Map a. (test id, test object)
  5. Microtasks Map a. (microtask id, microtask object)
  6. Implementation Queue Array a. Implementation Microtask Ids
  7. Review Queue Array a. Review Microtasks Ids
  8. In Progress Queue Map a. (microtask id, Microtask Map)
  9. Microtask Map a. (“worker”, Worker Id) b. (“assigned_time”, Timestamp)
  10. Workers Map a. (“assigned”, Assigned task Map) b. (“skipped” Skipped Tasks Array) c. (“completed”, Completed tasks Array)
  11. Assigned task Map a. (“id”, Microtask Id) b. (“type”, Microtask Type) c. (“fetch_time”, Timestamp)
  12. Skipped Tasks Array a. Skipped Microtask Ids
  13. Completed Tasks Array a. Completed Microtasks Ids
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Backend · devuxd/CrowdCode Wiki · GitHub
Skip to content
Emad Aghayi edited this page Sep 26, 2018 · 5 revisions

Server-side Implementation

Crowdcode’s server is implemented on a Node.js platform with the Express.js framework. The advantage of the Node server is that it is asynchronous. This means there is only one thread that runs continuously, which does not wait for requests to be responded before moving on to another request, increasing server performance. In this version, there are only two types of microtasks.

  1. Implementation – The worker can write code or tests or do both.
  2. Review – The worker shall review implementation tasks submitted by another worker. Either accept or reject

Differences with the previous version or CrowdCode

In the traditional approach

  1. Client sends requests
  2. The server fetches data from the database
  3. Performs operations
  4. Stores data back into the database
  5. Responds to request

But this is modified in the current implementation of Crowd Microservises, where all the project data related to microtasks is eagerly loaded into the servers’ memory at the first request for a project.

  1. Client sends request
  2. The server performs the operation on the data memory
  3. Responds to client
  4. Updates database

There are 4 main classes in the server

  1. User Services – Methods for user login and logout as well as obtaining user data such as avatar pic, email id, etc.
  2. Firebase Service – Methods to create, update, retrieve and delete all the objects in firebase.
  3. Microtask Service – Methods to load projects into memory as well as methods to perform generate, submit, fetch and skip microtask operations in the server
  4. Deployment Service – Methods to create a microservice from the project and deploy it as a separate app on Heroku.

MicrotaskService class

  1. LoadProject – Loads a project into the memory from firebase, if it does not already exist
  2. LoadFunctions – Loads all the functions that are yet to be implemented
  3. LoadTests – Loads all the tests for each function that is present in the memory
  4. LoadState – If the project was previously being implemented, it loads the state of the project into memory
  5. LoadMicrotasks – Loads all the microtasks, that are listed in the state or generates the tasks
  6. GenerateImplementationTask – Generates an implementation microtask for a function
  7. GenerateReviewTask – Generates a review microtask based on the implementation task
  8. SubmitImplementationTask – Stores the user submission in microtask and calls for the generation of a review task.
  9. SubmitReviewTask – Stores the user review and rating. Based on which the function is updated/not updated. Calls for generation of implementation task if the function is not completed. If the function is complete, it is removed from memory and an implementation task is generated for the next incomplete function.
  10. FetchMicrotask – Returns a microtask. Review tasks always have priority over implementation. The method checks if the user requesting already had a task assigned, in which case it returns the same task again. It triggers a timer for the task to be auto-submitted after the interval
  11. SkipMicrotask – Add the users' current microtask to the skipped tasks list for that user. Add the microtask back into its respective queue and calls fetch microtask. If there are no new tasks in the queue and there is more than one task in the skipped task list, it clears the skipped tasks list and then calls for fetch microtask
  12. UnassignLockedMicrotask – If the task is not submitted even after the allocated time, this changes its status back to unassigned and creates a new microtask. The previous task is flagged as submitted. The assigned task for the user is also changed to null.

Firebaseservice class

  1. All interactions are logged in the database in the \histroy\events via firebase.createEvent method

Implementation decisions

The server holds data in the form of maps (shown below) with keys generated by firebase and values being the JSON objects. Some queues are implemented using stacks (as queues are not available in JavaScript). Below is a list of all the objects held by the server in its memory.

  1. Projects Map – holds all the projects a. (Project Id, Project Map)
  2. Project Map – Hold individual project a. (“functions”, Functions Map) b. (“tests”, Tests Map) c. (“microtasks”, Microtasks Map) d. (“workers”, Workers Map) e. (“ImplementationQ”, Implementation Queue Array) f. (“reviewQ”, Review Queue Array) g. (“inProgressQ”, In Progress Map)
  3. Functions Map a. (function id, function object)
  4. Tests Map a. (test id, test object)
  5. Microtasks Map a. (microtask id, microtask object)
  6. Implementation Queue Array a. Implementation Microtask Ids
  7. Review Queue Array a. Review Microtasks Ids
  8. In Progress Queue Map a. (microtask id, Microtask Map)
  9. Microtask Map a. (“worker”, Worker Id) b. (“assigned_time”, Timestamp)
  10. Workers Map a. (“assigned”, Assigned task Map) b. (“skipped” Skipped Tasks Array) c. (“completed”, Completed tasks Array)
  11. Assigned task Map a. (“id”, Microtask Id) b. (“type”, Microtask Type) c. (“fetch_time”, Timestamp)
  12. Skipped Tasks Array a. Skipped Microtask Ids
  13. Completed Tasks Array a. Completed Microtasks Ids
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Backend · devuxd/CrowdCode Wiki · GitHub
Skip to content
Emad Aghayi edited this page Sep 26, 2018 · 5 revisions

Server-side Implementation

Crowdcode’s server is implemented on a Node.js platform with the Express.js framework. The advantage of the Node server is that it is asynchronous. This means there is only one thread that runs continuously, which does not wait for requests to be responded before moving on to another request, increasing server performance. In this version, there are only two types of microtasks.

  1. Implementation – The worker can write code or tests or do both.
  2. Review – The worker shall review implementation tasks submitted by another worker. Either accept or reject

Differences with the previous version or CrowdCode

In the traditional approach

  1. Client sends requests
  2. The server fetches data from the database
  3. Performs operations
  4. Stores data back into the database
  5. Responds to request

But this is modified in the current implementation of Crowd Microservises, where all the project data related to microtasks is eagerly loaded into the servers’ memory at the first request for a project.

  1. Client sends request
  2. The server performs the operation on the data memory
  3. Responds to client
  4. Updates database

There are 4 main classes in the server

  1. User Services – Methods for user login and logout as well as obtaining user data such as avatar pic, email id, etc.
  2. Firebase Service – Methods to create, update, retrieve and delete all the objects in firebase.
  3. Microtask Service – Methods to load projects into memory as well as methods to perform generate, submit, fetch and skip microtask operations in the server
  4. Deployment Service – Methods to create a microservice from the project and deploy it as a separate app on Heroku.

MicrotaskService class

  1. LoadProject – Loads a project into the memory from firebase, if it does not already exist
  2. LoadFunctions – Loads all the functions that are yet to be implemented
  3. LoadTests – Loads all the tests for each function that is present in the memory
  4. LoadState – If the project was previously being implemented, it loads the state of the project into memory
  5. LoadMicrotasks – Loads all the microtasks, that are listed in the state or generates the tasks
  6. GenerateImplementationTask – Generates an implementation microtask for a function
  7. GenerateReviewTask – Generates a review microtask based on the implementation task
  8. SubmitImplementationTask – Stores the user submission in microtask and calls for the generation of a review task.
  9. SubmitReviewTask – Stores the user review and rating. Based on which the function is updated/not updated. Calls for generation of implementation task if the function is not completed. If the function is complete, it is removed from memory and an implementation task is generated for the next incomplete function.
  10. FetchMicrotask – Returns a microtask. Review tasks always have priority over implementation. The method checks if the user requesting already had a task assigned, in which case it returns the same task again. It triggers a timer for the task to be auto-submitted after the interval
  11. SkipMicrotask – Add the users' current microtask to the skipped tasks list for that user. Add the microtask back into its respective queue and calls fetch microtask. If there are no new tasks in the queue and there is more than one task in the skipped task list, it clears the skipped tasks list and then calls for fetch microtask
  12. UnassignLockedMicrotask – If the task is not submitted even after the allocated time, this changes its status back to unassigned and creates a new microtask. The previous task is flagged as submitted. The assigned task for the user is also changed to null.

Firebaseservice class

  1. All interactions are logged in the database in the \histroy\events via firebase.createEvent method

Implementation decisions

The server holds data in the form of maps (shown below) with keys generated by firebase and values being the JSON objects. Some queues are implemented using stacks (as queues are not available in JavaScript). Below is a list of all the objects held by the server in its memory.

  1. Projects Map – holds all the projects a. (Project Id, Project Map)
  2. Project Map – Hold individual project a. (“functions”, Functions Map) b. (“tests”, Tests Map) c. (“microtasks”, Microtasks Map) d. (“workers”, Workers Map) e. (“ImplementationQ”, Implementation Queue Array) f. (“reviewQ”, Review Queue Array) g. (“inProgressQ”, In Progress Map)
  3. Functions Map a. (function id, function object)
  4. Tests Map a. (test id, test object)
  5. Microtasks Map a. (microtask id, microtask object)
  6. Implementation Queue Array a. Implementation Microtask Ids
  7. Review Queue Array a. Review Microtasks Ids
  8. In Progress Queue Map a. (microtask id, Microtask Map)
  9. Microtask Map a. (“worker”, Worker Id) b. (“assigned_time”, Timestamp)
  10. Workers Map a. (“assigned”, Assigned task Map) b. (“skipped” Skipped Tasks Array) c. (“completed”, Completed tasks Array)
  11. Assigned task Map a. (“id”, Microtask Id) b. (“type”, Microtask Type) c. (“fetch_time”, Timestamp)
  12. Skipped Tasks Array a. Skipped Microtask Ids
  13. Completed Tasks Array a. Completed Microtasks Ids
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Backend · devuxd/CrowdCode Wiki · GitHub
Skip to content
Emad Aghayi edited this page Sep 26, 2018 · 5 revisions

Server-side Implementation

Crowdcode’s server is implemented on a Node.js platform with the Express.js framework. The advantage of the Node server is that it is asynchronous. This means there is only one thread that runs continuously, which does not wait for requests to be responded before moving on to another request, increasing server performance. In this version, there are only two types of microtasks.

  1. Implementation – The worker can write code or tests or do both.
  2. Review – The worker shall review implementation tasks submitted by another worker. Either accept or reject

Differences with the previous version or CrowdCode

In the traditional approach

  1. Client sends requests
  2. The server fetches data from the database
  3. Performs operations
  4. Stores data back into the database
  5. Responds to request

But this is modified in the current implementation of Crowd Microservises, where all the project data related to microtasks is eagerly loaded into the servers’ memory at the first request for a project.

  1. Client sends request
  2. The server performs the operation on the data memory
  3. Responds to client
  4. Updates database

There are 4 main classes in the server

  1. User Services – Methods for user login and logout as well as obtaining user data such as avatar pic, email id, etc.
  2. Firebase Service – Methods to create, update, retrieve and delete all the objects in firebase.
  3. Microtask Service – Methods to load projects into memory as well as methods to perform generate, submit, fetch and skip microtask operations in the server
  4. Deployment Service – Methods to create a microservice from the project and deploy it as a separate app on Heroku.

MicrotaskService class

  1. LoadProject – Loads a project into the memory from firebase, if it does not already exist
  2. LoadFunctions – Loads all the functions that are yet to be implemented
  3. LoadTests – Loads all the tests for each function that is present in the memory
  4. LoadState – If the project was previously being implemented, it loads the state of the project into memory
  5. LoadMicrotasks – Loads all the microtasks, that are listed in the state or generates the tasks
  6. GenerateImplementationTask – Generates an implementation microtask for a function
  7. GenerateReviewTask – Generates a review microtask based on the implementation task
  8. SubmitImplementationTask – Stores the user submission in microtask and calls for the generation of a review task.
  9. SubmitReviewTask – Stores the user review and rating. Based on which the function is updated/not updated. Calls for generation of implementation task if the function is not completed. If the function is complete, it is removed from memory and an implementation task is generated for the next incomplete function.
  10. FetchMicrotask – Returns a microtask. Review tasks always have priority over implementation. The method checks if the user requesting already had a task assigned, in which case it returns the same task again. It triggers a timer for the task to be auto-submitted after the interval
  11. SkipMicrotask – Add the users' current microtask to the skipped tasks list for that user. Add the microtask back into its respective queue and calls fetch microtask. If there are no new tasks in the queue and there is more than one task in the skipped task list, it clears the skipped tasks list and then calls for fetch microtask
  12. UnassignLockedMicrotask – If the task is not submitted even after the allocated time, this changes its status back to unassigned and creates a new microtask. The previous task is flagged as submitted. The assigned task for the user is also changed to null.

Firebaseservice class

  1. All interactions are logged in the database in the \histroy\events via firebase.createEvent method

Implementation decisions

The server holds data in the form of maps (shown below) with keys generated by firebase and values being the JSON objects. Some queues are implemented using stacks (as queues are not available in JavaScript). Below is a list of all the objects held by the server in its memory.

  1. Projects Map – holds all the projects a. (Project Id, Project Map)
  2. Project Map – Hold individual project a. (“functions”, Functions Map) b. (“tests”, Tests Map) c. (“microtasks”, Microtasks Map) d. (“workers”, Workers Map) e. (“ImplementationQ”, Implementation Queue Array) f. (“reviewQ”, Review Queue Array) g. (“inProgressQ”, In Progress Map)
  3. Functions Map a. (function id, function object)
  4. Tests Map a. (test id, test object)
  5. Microtasks Map a. (microtask id, microtask object)
  6. Implementation Queue Array a. Implementation Microtask Ids
  7. Review Queue Array a. Review Microtasks Ids
  8. In Progress Queue Map a. (microtask id, Microtask Map)
  9. Microtask Map a. (“worker”, Worker Id) b. (“assigned_time”, Timestamp)
  10. Workers Map a. (“assigned”, Assigned task Map) b. (“skipped” Skipped Tasks Array) c. (“completed”, Completed tasks Array)
  11. Assigned task Map a. (“id”, Microtask Id) b. (“type”, Microtask Type) c. (“fetch_time”, Timestamp)
  12. Skipped Tasks Array a. Skipped Microtask Ids
  13. Completed Tasks Array a. Completed Microtasks Ids
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Backend · devuxd/CrowdCode Wiki · GitHub
Skip to content
Emad Aghayi edited this page Sep 26, 2018 · 5 revisions

Server-side Implementation

Crowdcode’s server is implemented on a Node.js platform with the Express.js framework. The advantage of the Node server is that it is asynchronous. This means there is only one thread that runs continuously, which does not wait for requests to be responded before moving on to another request, increasing server performance. In this version, there are only two types of microtasks.

  1. Implementation – The worker can write code or tests or do both.
  2. Review – The worker shall review implementation tasks submitted by another worker. Either accept or reject

Differences with the previous version or CrowdCode

In the traditional approach

  1. Client sends requests
  2. The server fetches data from the database
  3. Performs operations
  4. Stores data back into the database
  5. Responds to request

But this is modified in the current implementation of Crowd Microservises, where all the project data related to microtasks is eagerly loaded into the servers’ memory at the first request for a project.

  1. Client sends request
  2. The server performs the operation on the data memory
  3. Responds to client
  4. Updates database

There are 4 main classes in the server

  1. User Services – Methods for user login and logout as well as obtaining user data such as avatar pic, email id, etc.
  2. Firebase Service – Methods to create, update, retrieve and delete all the objects in firebase.
  3. Microtask Service – Methods to load projects into memory as well as methods to perform generate, submit, fetch and skip microtask operations in the server
  4. Deployment Service – Methods to create a microservice from the project and deploy it as a separate app on Heroku.

MicrotaskService class

  1. LoadProject – Loads a project into the memory from firebase, if it does not already exist
  2. LoadFunctions – Loads all the functions that are yet to be implemented
  3. LoadTests – Loads all the tests for each function that is present in the memory
  4. LoadState – If the project was previously being implemented, it loads the state of the project into memory
  5. LoadMicrotasks – Loads all the microtasks, that are listed in the state or generates the tasks
  6. GenerateImplementationTask – Generates an implementation microtask for a function
  7. GenerateReviewTask – Generates a review microtask based on the implementation task
  8. SubmitImplementationTask – Stores the user submission in microtask and calls for the generation of a review task.
  9. SubmitReviewTask – Stores the user review and rating. Based on which the function is updated/not updated. Calls for generation of implementation task if the function is not completed. If the function is complete, it is removed from memory and an implementation task is generated for the next incomplete function.
  10. FetchMicrotask – Returns a microtask. Review tasks always have priority over implementation. The method checks if the user requesting already had a task assigned, in which case it returns the same task again. It triggers a timer for the task to be auto-submitted after the interval
  11. SkipMicrotask – Add the users' current microtask to the skipped tasks list for that user. Add the microtask back into its respective queue and calls fetch microtask. If there are no new tasks in the queue and there is more than one task in the skipped task list, it clears the skipped tasks list and then calls for fetch microtask
  12. UnassignLockedMicrotask – If the task is not submitted even after the allocated time, this changes its status back to unassigned and creates a new microtask. The previous task is flagged as submitted. The assigned task for the user is also changed to null.

Firebaseservice class

  1. All interactions are logged in the database in the \histroy\events via firebase.createEvent method

Implementation decisions

The server holds data in the form of maps (shown below) with keys generated by firebase and values being the JSON objects. Some queues are implemented using stacks (as queues are not available in JavaScript). Below is a list of all the objects held by the server in its memory.

  1. Projects Map – holds all the projects a. (Project Id, Project Map)
  2. Project Map – Hold individual project a. (“functions”, Functions Map) b. (“tests”, Tests Map) c. (“microtasks”, Microtasks Map) d. (“workers”, Workers Map) e. (“ImplementationQ”, Implementation Queue Array) f. (“reviewQ”, Review Queue Array) g. (“inProgressQ”, In Progress Map)
  3. Functions Map a. (function id, function object)
  4. Tests Map a. (test id, test object)
  5. Microtasks Map a. (microtask id, microtask object)
  6. Implementation Queue Array a. Implementation Microtask Ids
  7. Review Queue Array a. Review Microtasks Ids
  8. In Progress Queue Map a. (microtask id, Microtask Map)
  9. Microtask Map a. (“worker”, Worker Id) b. (“assigned_time”, Timestamp)
  10. Workers Map a. (“assigned”, Assigned task Map) b. (“skipped” Skipped Tasks Array) c. (“completed”, Completed tasks Array)
  11. Assigned task Map a. (“id”, Microtask Id) b. (“type”, Microtask Type) c. (“fetch_time”, Timestamp)
  12. Skipped Tasks Array a. Skipped Microtask Ids
  13. Completed Tasks Array a. Completed Microtasks Ids
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Backend · devuxd/CrowdCode Wiki · GitHub
Skip to content
Emad Aghayi edited this page Sep 26, 2018 · 5 revisions

Server-side Implementation

Crowdcode’s server is implemented on a Node.js platform with the Express.js framework. The advantage of the Node server is that it is asynchronous. This means there is only one thread that runs continuously, which does not wait for requests to be responded before moving on to another request, increasing server performance. In this version, there are only two types of microtasks.

  1. Implementation – The worker can write code or tests or do both.
  2. Review – The worker shall review implementation tasks submitted by another worker. Either accept or reject

Differences with the previous version or CrowdCode

In the traditional approach

  1. Client sends requests
  2. The server fetches data from the database
  3. Performs operations
  4. Stores data back into the database
  5. Responds to request

But this is modified in the current implementation of Crowd Microservises, where all the project data related to microtasks is eagerly loaded into the servers’ memory at the first request for a project.

  1. Client sends request
  2. The server performs the operation on the data memory
  3. Responds to client
  4. Updates database

There are 4 main classes in the server

  1. User Services – Methods for user login and logout as well as obtaining user data such as avatar pic, email id, etc.
  2. Firebase Service – Methods to create, update, retrieve and delete all the objects in firebase.
  3. Microtask Service – Methods to load projects into memory as well as methods to perform generate, submit, fetch and skip microtask operations in the server
  4. Deployment Service – Methods to create a microservice from the project and deploy it as a separate app on Heroku.

MicrotaskService class

  1. LoadProject – Loads a project into the memory from firebase, if it does not already exist
  2. LoadFunctions – Loads all the functions that are yet to be implemented
  3. LoadTests – Loads all the tests for each function that is present in the memory
  4. LoadState – If the project was previously being implemented, it loads the state of the project into memory
  5. LoadMicrotasks – Loads all the microtasks, that are listed in the state or generates the tasks
  6. GenerateImplementationTask – Generates an implementation microtask for a function
  7. GenerateReviewTask – Generates a review microtask based on the implementation task
  8. SubmitImplementationTask – Stores the user submission in microtask and calls for the generation of a review task.
  9. SubmitReviewTask – Stores the user review and rating. Based on which the function is updated/not updated. Calls for generation of implementation task if the function is not completed. If the function is complete, it is removed from memory and an implementation task is generated for the next incomplete function.
  10. FetchMicrotask – Returns a microtask. Review tasks always have priority over implementation. The method checks if the user requesting already had a task assigned, in which case it returns the same task again. It triggers a timer for the task to be auto-submitted after the interval
  11. SkipMicrotask – Add the users' current microtask to the skipped tasks list for that user. Add the microtask back into its respective queue and calls fetch microtask. If there are no new tasks in the queue and there is more than one task in the skipped task list, it clears the skipped tasks list and then calls for fetch microtask
  12. UnassignLockedMicrotask – If the task is not submitted even after the allocated time, this changes its status back to unassigned and creates a new microtask. The previous task is flagged as submitted. The assigned task for the user is also changed to null.

Firebaseservice class

  1. All interactions are logged in the database in the \histroy\events via firebase.createEvent method

Implementation decisions

The server holds data in the form of maps (shown below) with keys generated by firebase and values being the JSON objects. Some queues are implemented using stacks (as queues are not available in JavaScript). Below is a list of all the objects held by the server in its memory.

  1. Projects Map – holds all the projects a. (Project Id, Project Map)
  2. Project Map – Hold individual project a. (“functions”, Functions Map) b. (“tests”, Tests Map) c. (“microtasks”, Microtasks Map) d. (“workers”, Workers Map) e. (“ImplementationQ”, Implementation Queue Array) f. (“reviewQ”, Review Queue Array) g. (“inProgressQ”, In Progress Map)
  3. Functions Map a. (function id, function object)
  4. Tests Map a. (test id, test object)
  5. Microtasks Map a. (microtask id, microtask object)
  6. Implementation Queue Array a. Implementation Microtask Ids
  7. Review Queue Array a. Review Microtasks Ids
  8. In Progress Queue Map a. (microtask id, Microtask Map)
  9. Microtask Map a. (“worker”, Worker Id) b. (“assigned_time”, Timestamp)
  10. Workers Map a. (“assigned”, Assigned task Map) b. (“skipped” Skipped Tasks Array) c. (“completed”, Completed tasks Array)
  11. Assigned task Map a. (“id”, Microtask Id) b. (“type”, Microtask Type) c. (“fetch_time”, Timestamp)
  12. Skipped Tasks Array a. Skipped Microtask Ids
  13. Completed Tasks Array a. Completed Microtasks Ids
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Backend · devuxd/CrowdCode Wiki · GitHub
Skip to content
Emad Aghayi edited this page Sep 26, 2018 · 5 revisions

Server-side Implementation

Crowdcode’s server is implemented on a Node.js platform with the Express.js framework. The advantage of the Node server is that it is asynchronous. This means there is only one thread that runs continuously, which does not wait for requests to be responded before moving on to another request, increasing server performance. In this version, there are only two types of microtasks.

  1. Implementation – The worker can write code or tests or do both.
  2. Review – The worker shall review implementation tasks submitted by another worker. Either accept or reject

Differences with the previous version or CrowdCode

In the traditional approach

  1. Client sends requests
  2. The server fetches data from the database
  3. Performs operations
  4. Stores data back into the database
  5. Responds to request

But this is modified in the current implementation of Crowd Microservises, where all the project data related to microtasks is eagerly loaded into the servers’ memory at the first request for a project.

  1. Client sends request
  2. The server performs the operation on the data memory
  3. Responds to client
  4. Updates database

There are 4 main classes in the server

  1. User Services – Methods for user login and logout as well as obtaining user data such as avatar pic, email id, etc.
  2. Firebase Service – Methods to create, update, retrieve and delete all the objects in firebase.
  3. Microtask Service – Methods to load projects into memory as well as methods to perform generate, submit, fetch and skip microtask operations in the server
  4. Deployment Service – Methods to create a microservice from the project and deploy it as a separate app on Heroku.

MicrotaskService class

  1. LoadProject – Loads a project into the memory from firebase, if it does not already exist
  2. LoadFunctions – Loads all the functions that are yet to be implemented
  3. LoadTests – Loads all the tests for each function that is present in the memory
  4. LoadState – If the project was previously being implemented, it loads the state of the project into memory
  5. LoadMicrotasks – Loads all the microtasks, that are listed in the state or generates the tasks
  6. GenerateImplementationTask – Generates an implementation microtask for a function
  7. GenerateReviewTask – Generates a review microtask based on the implementation task
  8. SubmitImplementationTask – Stores the user submission in microtask and calls for the generation of a review task.
  9. SubmitReviewTask – Stores the user review and rating. Based on which the function is updated/not updated. Calls for generation of implementation task if the function is not completed. If the function is complete, it is removed from memory and an implementation task is generated for the next incomplete function.
  10. FetchMicrotask – Returns a microtask. Review tasks always have priority over implementation. The method checks if the user requesting already had a task assigned, in which case it returns the same task again. It triggers a timer for the task to be auto-submitted after the interval
  11. SkipMicrotask – Add the users' current microtask to the skipped tasks list for that user. Add the microtask back into its respective queue and calls fetch microtask. If there are no new tasks in the queue and there is more than one task in the skipped task list, it clears the skipped tasks list and then calls for fetch microtask
  12. UnassignLockedMicrotask – If the task is not submitted even after the allocated time, this changes its status back to unassigned and creates a new microtask. The previous task is flagged as submitted. The assigned task for the user is also changed to null.

Firebaseservice class

  1. All interactions are logged in the database in the \histroy\events via firebase.createEvent method

Implementation decisions

The server holds data in the form of maps (shown below) with keys generated by firebase and values being the JSON objects. Some queues are implemented using stacks (as queues are not available in JavaScript). Below is a list of all the objects held by the server in its memory.

  1. Projects Map – holds all the projects a. (Project Id, Project Map)
  2. Project Map – Hold individual project a. (“functions”, Functions Map) b. (“tests”, Tests Map) c. (“microtasks”, Microtasks Map) d. (“workers”, Workers Map) e. (“ImplementationQ”, Implementation Queue Array) f. (“reviewQ”, Review Queue Array) g. (“inProgressQ”, In Progress Map)
  3. Functions Map a. (function id, function object)
  4. Tests Map a. (test id, test object)
  5. Microtasks Map a. (microtask id, microtask object)
  6. Implementation Queue Array a. Implementation Microtask Ids
  7. Review Queue Array a. Review Microtasks Ids
  8. In Progress Queue Map a. (microtask id, Microtask Map)
  9. Microtask Map a. (“worker”, Worker Id) b. (“assigned_time”, Timestamp)
  10. Workers Map a. (“assigned”, Assigned task Map) b. (“skipped” Skipped Tasks Array) c. (“completed”, Completed tasks Array)
  11. Assigned task Map a. (“id”, Microtask Id) b. (“type”, Microtask Type) c. (“fetch_time”, Timestamp)
  12. Skipped Tasks Array a. Skipped Microtask Ids
  13. Completed Tasks Array a. Completed Microtasks Ids
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Backend · devuxd/CrowdCode Wiki · GitHub
Skip to content
Emad Aghayi edited this page Sep 26, 2018 · 5 revisions

Server-side Implementation

Crowdcode’s server is implemented on a Node.js platform with the Express.js framework. The advantage of the Node server is that it is asynchronous. This means there is only one thread that runs continuously, which does not wait for requests to be responded before moving on to another request, increasing server performance. In this version, there are only two types of microtasks.

  1. Implementation – The worker can write code or tests or do both.
  2. Review – The worker shall review implementation tasks submitted by another worker. Either accept or reject

Differences with the previous version or CrowdCode

In the traditional approach

  1. Client sends requests
  2. The server fetches data from the database
  3. Performs operations
  4. Stores data back into the database
  5. Responds to request

But this is modified in the current implementation of Crowd Microservises, where all the project data related to microtasks is eagerly loaded into the servers’ memory at the first request for a project.

  1. Client sends request
  2. The server performs the operation on the data memory
  3. Responds to client
  4. Updates database

There are 4 main classes in the server

  1. User Services – Methods for user login and logout as well as obtaining user data such as avatar pic, email id, etc.
  2. Firebase Service – Methods to create, update, retrieve and delete all the objects in firebase.
  3. Microtask Service – Methods to load projects into memory as well as methods to perform generate, submit, fetch and skip microtask operations in the server
  4. Deployment Service – Methods to create a microservice from the project and deploy it as a separate app on Heroku.

MicrotaskService class

  1. LoadProject – Loads a project into the memory from firebase, if it does not already exist
  2. LoadFunctions – Loads all the functions that are yet to be implemented
  3. LoadTests – Loads all the tests for each function that is present in the memory
  4. LoadState – If the project was previously being implemented, it loads the state of the project into memory
  5. LoadMicrotasks – Loads all the microtasks, that are listed in the state or generates the tasks
  6. GenerateImplementationTask – Generates an implementation microtask for a function
  7. GenerateReviewTask – Generates a review microtask based on the implementation task
  8. SubmitImplementationTask – Stores the user submission in microtask and calls for the generation of a review task.
  9. SubmitReviewTask – Stores the user review and rating. Based on which the function is updated/not updated. Calls for generation of implementation task if the function is not completed. If the function is complete, it is removed from memory and an implementation task is generated for the next incomplete function.
  10. FetchMicrotask – Returns a microtask. Review tasks always have priority over implementation. The method checks if the user requesting already had a task assigned, in which case it returns the same task again. It triggers a timer for the task to be auto-submitted after the interval
  11. SkipMicrotask – Add the users' current microtask to the skipped tasks list for that user. Add the microtask back into its respective queue and calls fetch microtask. If there are no new tasks in the queue and there is more than one task in the skipped task list, it clears the skipped tasks list and then calls for fetch microtask
  12. UnassignLockedMicrotask – If the task is not submitted even after the allocated time, this changes its status back to unassigned and creates a new microtask. The previous task is flagged as submitted. The assigned task for the user is also changed to null.

Firebaseservice class

  1. All interactions are logged in the database in the \histroy\events via firebase.createEvent method

Implementation decisions

The server holds data in the form of maps (shown below) with keys generated by firebase and values being the JSON objects. Some queues are implemented using stacks (as queues are not available in JavaScript). Below is a list of all the objects held by the server in its memory.

  1. Projects Map – holds all the projects a. (Project Id, Project Map)
  2. Project Map – Hold individual project a. (“functions”, Functions Map) b. (“tests”, Tests Map) c. (“microtasks”, Microtasks Map) d. (“workers”, Workers Map) e. (“ImplementationQ”, Implementation Queue Array) f. (“reviewQ”, Review Queue Array) g. (“inProgressQ”, In Progress Map)
  3. Functions Map a. (function id, function object)
  4. Tests Map a. (test id, test object)
  5. Microtasks Map a. (microtask id, microtask object)
  6. Implementation Queue Array a. Implementation Microtask Ids
  7. Review Queue Array a. Review Microtasks Ids
  8. In Progress Queue Map a. (microtask id, Microtask Map)
  9. Microtask Map a. (“worker”, Worker Id) b. (“assigned_time”, Timestamp)
  10. Workers Map a. (“assigned”, Assigned task Map) b. (“skipped” Skipped Tasks Array) c. (“completed”, Completed tasks Array)
  11. Assigned task Map a. (“id”, Microtask Id) b. (“type”, Microtask Type) c. (“fetch_time”, Timestamp)
  12. Skipped Tasks Array a. Skipped Microtask Ids
  13. Completed Tasks Array a. Completed Microtasks Ids