SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
With a Chrome Extension and Chrome Native Messaging
How to connect 1980 and
2018
Matthieu KERN
matthieu.kern@doctolib.com
@MatthieuKern
Quentin MÉNORET
quentin.menoret@doctolib.com
@QuentinMenoret
Goal
Make our users feel like they have
only one software
A chrome extension
Our solution
Connecting 2000
What we’re building
● A chrome extension that allow to exchange messages between
Doctolib and the PMS
● Three topics should be addressed:
○ Have buttons into each software to trigger actions in the other
○ Allow to switch the focus
○ Synchronise data
Zipper
Actions
Temporality
Appointment booking
(online, by phone, update/cancellation)
1
Welcoming of the patient
(identity validation and waiting room management)
2
Rebook an appointment8
Billing6
Remote transmission7
Consultation: medical prescription5
Consultation: medical data seizure4
Medical and administrative records seizure with or
without insurance card
3
Messaging System
Background Script
Content Script
(Doctolib)
Content Script
(PMS)
Injected Script
(Doctolib)
Injected Script
(PMS)
Chrome Extension
PMS PageDoctolib Page
PostMessage PostMessage
Chrome Messaging Chrome Messaging
Background script
● The code that runs in chrome, not in a specific tab
● It is where we put all the “routing” and “logic” stuff
● It can do magic stuff using the chrome API, such as focusing a tab
Content script
● It is injected on a tab based on the URL
● Shares the context of the website
● Have access to the DOM, but not to the window object
Communication between components
● To communicate between Content Scripts and Background Scripts:
● Chrome messaging
● To communicate between the PMS and Content Scripts:
● window.postMessage
The window
postMessage API
Communication between the page
and the content script
Content Script
Page Script
The Chrome
Messaging API
Communication between content
scripts and background script
Background Script
Content Script
How it looks like for
the partner
Communication between the
partner and Doctolib
The partner code
Plug&Play API vs REST API
● Focus switches
● Frontend synchronization
● No need for a specific backend API
How to test ?
● No possibility for Headless
● But you can use a platform such as Browserstack
● Selenium or puppeteer would work just fine
Connecting 1980
Context: The Case of Desktop Softwares
● Half of our customers are using a desktop software (the Internet did not exist in
1980)
● We need to connect them as well
● Most of desktop softwares are old and bloated, we need a simple API
Communication With The Software
Chrome Native Messaging
● API provided by Google Chrome and implemented by most browsers
● A way to exchange messages with a program installed on the user computer
● API similar to other message passing APIs provided by Chrome
● Chrome starts the native host on a separate process
● It communicates using standard input and standard output, sending and
receiving serialized JSON preceded by the length of the message (using a 32-bit
native integer)
Chrome Native
Messaging:
Sending a Message
● Connects to a native host
using connectNative
method
● Use the postMessage
method to send a message to
native host
Chrome Native
Messaging:
Receiving a Message
Adding listeners:
● on onMessageto handle
messages received from
native host
● on onDisconnectto catch
native host disconnection
Chrome Native
Messaging:
The Manifest File
● The file that defines the
configuration of the bridge
● Path defined by a registry key
on Windows, specific paths
on Linux and Mac
Packaging a Binary
With Pkg
● Node.JS binary packager
developed by Zeit
● Cross-compilation, easy to
install and use
Packaging a Binary With Pkg: How it Works
● Uses pre-compiled base node binaries with some patches applied
● Transforms javascript code into bytecode
● Snapshot filesystem: all files are embedded in the binary and prefixed by
/snapshot/, the program have access to the snapshot file system during runtime
● Targets:
○ node version
○ platform: windows, mac, linux or bsd
○ architecture: x64, x86, armv6 or armv7
○ all targets available in the pkg-fetch last release:
https://github.com/zeit/pkg-fetch/releases/tag/v2.5
Testing
● Using Jest for unit and integration tests
○ All the code is unit tested
○ Integration tests fakes the PMS and Chrome to assert an output when an
input is given
○ Installer tests runs installers on Windows to check that all files are
correctly deployed
● A lot of snapshot testing
An Example of Integration Test
Spawning of the Zipper Desktop Process
Connection of the Fake Socket
An Actual Socket
Test
Resources
● https://developer.mozilla.org/fr/docs/Web/API/Window/postMessage: window postMessage documentation
● https://developer.chrome.com/apps/messaging: Chrome messaging documentation
● https://developer.chrome.com/extensions/content_scripts: Content scripts documentation
● https://www.browserstack.com/: Platform for running e2e tests on VM
● https://developer.chrome.com/extensions/background_pages: Background scripts
● https://developer.chrome.com/apps/nativeMessaging: Chrome Native Messaging documentation
● https://github.com/zeit/pkg: Pkg documentation
● http://nsis.sourceforge.net/Main_Page: NSIS documentation
● http://www.grivet-tools.com/blog/2014/build-simple-pkg-pkgbuild/: How to use pkgbuild
● https://jestjs.io/: Jest test framework
Matthieu KERN
matthieu.kern@doctolib.com
@MatthieuKern
Quentin MÉNORET
quentin.menoret@doctolib.com
@QuentinMenoret
We are hiring! https://careers.doctolib.fr/engineering/

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (12)

MuleSoft Slack Integration - meetup
MuleSoft Slack Integration - meetupMuleSoft Slack Integration - meetup
MuleSoft Slack Integration - meetup
 
Ahmadabad mule soft_meetup_20_february_2021_muleconnectordevelopment
Ahmadabad mule soft_meetup_20_february_2021_muleconnectordevelopmentAhmadabad mule soft_meetup_20_february_2021_muleconnectordevelopment
Ahmadabad mule soft_meetup_20_february_2021_muleconnectordevelopment
 
How Secure is Your API?
How Secure is Your API?How Secure is Your API?
How Secure is Your API?
 
How to keep modules up to date
How to keep modules up to dateHow to keep modules up to date
How to keep modules up to date
 
Vagrant and Docker
Vagrant and DockerVagrant and Docker
Vagrant and Docker
 
Workspace on asp.net web aplication development
Workspace on asp.net  web aplication developmentWorkspace on asp.net  web aplication development
Workspace on asp.net web aplication development
 
20210916 mule soft_meetup_nz_online_uploadedversion
20210916 mule soft_meetup_nz_online_uploadedversion20210916 mule soft_meetup_nz_online_uploadedversion
20210916 mule soft_meetup_nz_online_uploadedversion
 
Sustainability Challenge, Postman, Rest sheet and Anypoint provider : MuleSof...
Sustainability Challenge, Postman, Rest sheet and Anypoint provider : MuleSof...Sustainability Challenge, Postman, Rest sheet and Anypoint provider : MuleSof...
Sustainability Challenge, Postman, Rest sheet and Anypoint provider : MuleSof...
 
Lightning Web Components- Ep 2 - Component Communication using Events
Lightning Web Components- Ep 2 - Component Communication using EventsLightning Web Components- Ep 2 - Component Communication using Events
Lightning Web Components- Ep 2 - Component Communication using Events
 
Behaviour Driven Development Hands-on
Behaviour Driven Development Hands-onBehaviour Driven Development Hands-on
Behaviour Driven Development Hands-on
 
Test Driven Development (TDD) with Windows PowerShell
Test Driven Development (TDD) with Windows PowerShellTest Driven Development (TDD) with Windows PowerShell
Test Driven Development (TDD) with Windows PowerShell
 
Bangalore mulesoft meetup#10
Bangalore mulesoft meetup#10Bangalore mulesoft meetup#10
Bangalore mulesoft meetup#10
 

Ähnlich wie How to connect 1980 and 2018

Cpp In Soa
Cpp In SoaCpp In Soa
Cpp In Soa
WSO2
 
Presentation on Application layer_201.pdf
Presentation on Application layer_201.pdfPresentation on Application layer_201.pdf
Presentation on Application layer_201.pdf
prince2412001
 

Ähnlich wie How to connect 1980 and 2018 (20)

Upgrade your InfoSec, Ops and Dev teams with PCF 1.12
Upgrade your InfoSec, Ops and Dev teams with PCF 1.12Upgrade your InfoSec, Ops and Dev teams with PCF 1.12
Upgrade your InfoSec, Ops and Dev teams with PCF 1.12
 
Resume
ResumeResume
Resume
 
Cpp In Soa
Cpp In SoaCpp In Soa
Cpp In Soa
 
Zing Me Real Time Web Chat Architect
Zing Me Real Time Web Chat ArchitectZing Me Real Time Web Chat Architect
Zing Me Real Time Web Chat Architect
 
COM+ & MSMQ
COM+ & MSMQCOM+ & MSMQ
COM+ & MSMQ
 
WebRTC Live Q&A Session #5 - JavaScript Promises and WebRTC Interoperability ...
WebRTC Live Q&A Session #5 - JavaScript Promises and WebRTC Interoperability ...WebRTC Live Q&A Session #5 - JavaScript Promises and WebRTC Interoperability ...
WebRTC Live Q&A Session #5 - JavaScript Promises and WebRTC Interoperability ...
 
What do you need to know about g rpc on .net
What do you need to know about g rpc on .net What do you need to know about g rpc on .net
What do you need to know about g rpc on .net
 
Build Great Networked APIs with Swift, OpenAPI, and gRPC
Build Great Networked APIs with Swift, OpenAPI, and gRPCBuild Great Networked APIs with Swift, OpenAPI, and gRPC
Build Great Networked APIs with Swift, OpenAPI, and gRPC
 
MongoDB World 2018: Building Serverless Apps with MongoDB Atlas on Google Clo...
MongoDB World 2018: Building Serverless Apps with MongoDB Atlas on Google Clo...MongoDB World 2018: Building Serverless Apps with MongoDB Atlas on Google Clo...
MongoDB World 2018: Building Serverless Apps with MongoDB Atlas on Google Clo...
 
Presentation on Application layer_201.pdf
Presentation on Application layer_201.pdfPresentation on Application layer_201.pdf
Presentation on Application layer_201.pdf
 
APIs at the Edge
APIs at the EdgeAPIs at the Edge
APIs at the Edge
 
Building Kick Ass Video Games for the Cloud
Building Kick Ass Video Games for the CloudBuilding Kick Ass Video Games for the Cloud
Building Kick Ass Video Games for the Cloud
 
Bootcamp Introduction.pptx
Bootcamp Introduction.pptxBootcamp Introduction.pptx
Bootcamp Introduction.pptx
 
Introducing chrome apps (ogura)
Introducing chrome apps (ogura)Introducing chrome apps (ogura)
Introducing chrome apps (ogura)
 
0nline shopping
0nline shopping0nline shopping
0nline shopping
 
Introduction to back-end
Introduction to back-endIntroduction to back-end
Introduction to back-end
 
DevOps Braga #15: Agentless monitoring with icinga and prometheus
DevOps Braga #15: Agentless monitoring with icinga and prometheusDevOps Braga #15: Agentless monitoring with icinga and prometheus
DevOps Braga #15: Agentless monitoring with icinga and prometheus
 
Designing flexible apps deployable to App Engine, Cloud Functions, or Cloud Run
Designing flexible apps deployable to App Engine, Cloud Functions, or Cloud RunDesigning flexible apps deployable to App Engine, Cloud Functions, or Cloud Run
Designing flexible apps deployable to App Engine, Cloud Functions, or Cloud Run
 
Introduction to Modern DevOps Technologies
Introduction to  Modern DevOps TechnologiesIntroduction to  Modern DevOps Technologies
Introduction to Modern DevOps Technologies
 
Why is .Net Technology Recognised for Software Development?
Why is .Net Technology Recognised for Software Development?Why is .Net Technology Recognised for Software Development?
Why is .Net Technology Recognised for Software Development?
 

Kürzlich hochgeladen

在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
ydyuyu
 
Russian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girls
Russian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girlsRussian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girls
Russian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girls
Monica Sydney
 
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdfpdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
JOHNBEBONYAP1
 
原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查
原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查
原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查
ydyuyu
 
Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...
Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...
Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...
gajnagarg
 
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi EscortsIndian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Monica Sydney
 
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
ydyuyu
 

Kürzlich hochgeladen (20)

best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...
best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...
best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...
 
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
 
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
 
Russian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girls
Russian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girlsRussian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girls
Russian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girls
 
Meaning of On page SEO & its process in detail.
Meaning of On page SEO & its process in detail.Meaning of On page SEO & its process in detail.
Meaning of On page SEO & its process in detail.
 
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdfpdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
 
原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查
原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查
原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查
 
Nagercoil Escorts Service Girl ^ 9332606886, WhatsApp Anytime Nagercoil
Nagercoil Escorts Service Girl ^ 9332606886, WhatsApp Anytime NagercoilNagercoil Escorts Service Girl ^ 9332606886, WhatsApp Anytime Nagercoil
Nagercoil Escorts Service Girl ^ 9332606886, WhatsApp Anytime Nagercoil
 
APNIC Updates presented by Paul Wilson at ARIN 53
APNIC Updates presented by Paul Wilson at ARIN 53APNIC Updates presented by Paul Wilson at ARIN 53
APNIC Updates presented by Paul Wilson at ARIN 53
 
Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...
Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...
Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...
 
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi EscortsIndian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
 
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
 
Real Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirtReal Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirt
 
20240507 QFM013 Machine Intelligence Reading List April 2024.pdf
20240507 QFM013 Machine Intelligence Reading List April 2024.pdf20240507 QFM013 Machine Intelligence Reading List April 2024.pdf
20240507 QFM013 Machine Intelligence Reading List April 2024.pdf
 
Mira Road Housewife Call Girls 07506202331, Nalasopara Call Girls
Mira Road Housewife Call Girls 07506202331, Nalasopara Call GirlsMira Road Housewife Call Girls 07506202331, Nalasopara Call Girls
Mira Road Housewife Call Girls 07506202331, Nalasopara Call Girls
 
"Boost Your Digital Presence: Partner with a Leading SEO Agency"
"Boost Your Digital Presence: Partner with a Leading SEO Agency""Boost Your Digital Presence: Partner with a Leading SEO Agency"
"Boost Your Digital Presence: Partner with a Leading SEO Agency"
 
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
 
Ballia Escorts Service Girl ^ 9332606886, WhatsApp Anytime Ballia
Ballia Escorts Service Girl ^ 9332606886, WhatsApp Anytime BalliaBallia Escorts Service Girl ^ 9332606886, WhatsApp Anytime Ballia
Ballia Escorts Service Girl ^ 9332606886, WhatsApp Anytime Ballia
 
Trump Diapers Over Dems t shirts Sweatshirt
Trump Diapers Over Dems t shirts SweatshirtTrump Diapers Over Dems t shirts Sweatshirt
Trump Diapers Over Dems t shirts Sweatshirt
 
Best SEO Services Company in Dallas | Best SEO Agency Dallas
Best SEO Services Company in Dallas | Best SEO Agency DallasBest SEO Services Company in Dallas | Best SEO Agency Dallas
Best SEO Services Company in Dallas | Best SEO Agency Dallas
 

How to connect 1980 and 2018

  • 1. With a Chrome Extension and Chrome Native Messaging How to connect 1980 and 2018
  • 3. Goal Make our users feel like they have only one software
  • 6. What we’re building ● A chrome extension that allow to exchange messages between Doctolib and the PMS ● Three topics should be addressed: ○ Have buttons into each software to trigger actions in the other ○ Allow to switch the focus ○ Synchronise data
  • 7.
  • 8. Zipper Actions Temporality Appointment booking (online, by phone, update/cancellation) 1 Welcoming of the patient (identity validation and waiting room management) 2 Rebook an appointment8 Billing6 Remote transmission7 Consultation: medical prescription5 Consultation: medical data seizure4 Medical and administrative records seizure with or without insurance card 3 Messaging System
  • 9. Background Script Content Script (Doctolib) Content Script (PMS) Injected Script (Doctolib) Injected Script (PMS) Chrome Extension PMS PageDoctolib Page PostMessage PostMessage Chrome Messaging Chrome Messaging
  • 10. Background script ● The code that runs in chrome, not in a specific tab ● It is where we put all the “routing” and “logic” stuff ● It can do magic stuff using the chrome API, such as focusing a tab
  • 11. Content script ● It is injected on a tab based on the URL ● Shares the context of the website ● Have access to the DOM, but not to the window object
  • 12. Communication between components ● To communicate between Content Scripts and Background Scripts: ● Chrome messaging ● To communicate between the PMS and Content Scripts: ● window.postMessage
  • 13. The window postMessage API Communication between the page and the content script Content Script Page Script
  • 14. The Chrome Messaging API Communication between content scripts and background script Background Script Content Script
  • 15. How it looks like for the partner Communication between the partner and Doctolib The partner code
  • 16. Plug&Play API vs REST API ● Focus switches ● Frontend synchronization ● No need for a specific backend API
  • 17. How to test ? ● No possibility for Headless ● But you can use a platform such as Browserstack ● Selenium or puppeteer would work just fine
  • 19. Context: The Case of Desktop Softwares ● Half of our customers are using a desktop software (the Internet did not exist in 1980) ● We need to connect them as well ● Most of desktop softwares are old and bloated, we need a simple API
  • 21. Chrome Native Messaging ● API provided by Google Chrome and implemented by most browsers ● A way to exchange messages with a program installed on the user computer ● API similar to other message passing APIs provided by Chrome ● Chrome starts the native host on a separate process ● It communicates using standard input and standard output, sending and receiving serialized JSON preceded by the length of the message (using a 32-bit native integer)
  • 22. Chrome Native Messaging: Sending a Message ● Connects to a native host using connectNative method ● Use the postMessage method to send a message to native host
  • 23. Chrome Native Messaging: Receiving a Message Adding listeners: ● on onMessageto handle messages received from native host ● on onDisconnectto catch native host disconnection
  • 24. Chrome Native Messaging: The Manifest File ● The file that defines the configuration of the bridge ● Path defined by a registry key on Windows, specific paths on Linux and Mac
  • 25. Packaging a Binary With Pkg ● Node.JS binary packager developed by Zeit ● Cross-compilation, easy to install and use
  • 26. Packaging a Binary With Pkg: How it Works ● Uses pre-compiled base node binaries with some patches applied ● Transforms javascript code into bytecode ● Snapshot filesystem: all files are embedded in the binary and prefixed by /snapshot/, the program have access to the snapshot file system during runtime ● Targets: ○ node version ○ platform: windows, mac, linux or bsd ○ architecture: x64, x86, armv6 or armv7 ○ all targets available in the pkg-fetch last release: https://github.com/zeit/pkg-fetch/releases/tag/v2.5
  • 27. Testing ● Using Jest for unit and integration tests ○ All the code is unit tested ○ Integration tests fakes the PMS and Chrome to assert an output when an input is given ○ Installer tests runs installers on Windows to check that all files are correctly deployed ● A lot of snapshot testing
  • 28. An Example of Integration Test
  • 29. Spawning of the Zipper Desktop Process
  • 30. Connection of the Fake Socket
  • 32. Resources ● https://developer.mozilla.org/fr/docs/Web/API/Window/postMessage: window postMessage documentation ● https://developer.chrome.com/apps/messaging: Chrome messaging documentation ● https://developer.chrome.com/extensions/content_scripts: Content scripts documentation ● https://www.browserstack.com/: Platform for running e2e tests on VM ● https://developer.chrome.com/extensions/background_pages: Background scripts ● https://developer.chrome.com/apps/nativeMessaging: Chrome Native Messaging documentation ● https://github.com/zeit/pkg: Pkg documentation ● http://nsis.sourceforge.net/Main_Page: NSIS documentation ● http://www.grivet-tools.com/blog/2014/build-simple-pkg-pkgbuild/: How to use pkgbuild ● https://jestjs.io/: Jest test framework