diff --git a/README.md b/README.md index 9db2e3c..afb6e4d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,12 @@ # test_broswer_plugin -Test de création d'un plugin pour firefox lié a websocketd \ No newline at end of file + +Test de création d'un plugin pour firefox lié a websocketd +POC fonctionnel sur la base de trackingd + + +## Pour l'installation si trackind fonctionne ! +npm install +build.zsh +make + diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..ff4eccf --- /dev/null +++ b/manifest.json @@ -0,0 +1,20 @@ +{ + + "manifest_version": 2, + "name": "Borderify", + "version": "1.0", + + "description": "Adds a solid red border to all webpages matching mozilla.org.", + + "icons": { + "48": "icons/border-48.png" + }, + + "content_scripts": [ + { + "matches": ["*://*.mozilla.org/*"], + "js": ["public/main.bundle.js"] + } + ] + +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..cf833fe --- /dev/null +++ b/package-lock.json @@ -0,0 +1,100 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "browserify-livescript": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/browserify-livescript/-/browserify-livescript-0.2.4.tgz", + "integrity": "sha512-xbHGs4l2RSCxY/WN1PKxmHtMc2ri95KWSgXgNF3ieADAuOe0KRpAppoz5+A4Klzhww9yQh7oOes8h+9Lr619fQ==", + "requires": { + "livescript": "^1.6.0", + "through": "*" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "livescript": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/livescript/-/livescript-1.6.0.tgz", + "integrity": "sha512-x5q+sx1/rOPmx6Fp04gjUqRr4XL5djqXPctu6FPBktm7d7gfRrKkYj9PhMeKT8OKE1bfL92njzAwaN8JCj8kRQ==", + "requires": { + "optionator": "~0.8.2", + "prelude-ls": "~1.1.2", + "source-map": "=0.6.1", + "source-map-support": "=0.5.6" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + } + } +} diff --git a/project.zsh b/project.zsh new file mode 100644 index 0000000..10ed9d3 --- /dev/null +++ b/project.zsh @@ -0,0 +1,19 @@ + +package=test-pluging +version=0.1.0 + +targets=(public/main.js) +type[public/main.js]=livescript +sources[public/main.js]=src/main.ls +depends[public/main.js]="$(find src | grep '\.ls$' | grep -v "/main.ls$" | tr '\n' ' ' )" + + +for ext in eot woff2 woff ttf svg; do + for style in solid-900 regular-400 light-300; do + t=public/fa-${style}.${ext} + targets+=($t) + type[$t]=script + sources[$t]=node_modules/@fortawesome/fontawesome-pro/webfonts/$(basename $t) + done +done + diff --git a/src/main.ls b/src/main.ls new file mode 100644 index 0000000..7694334 --- /dev/null +++ b/src/main.ls @@ -0,0 +1,53 @@ +WebsocketdWS = require "./websocketd-ws.ls" +a = WebsocketdWS "trackingd", "ws://localhost:9998/tracking.JSON" +storage = window.local-storage + +request-types = { #client to server + "get-token": 0 + "session-init": 11 + "action": 20 + "url-action": 21 +} + +response-types = { #server to client + "error": 0 + "default-id": 10 + "action": 12 +} + +for name, value of response-types + a.register-response-type value, name + +a.on-default-id = (payload) -> + console.log payload.default_id + unless storage.get-item "visitor_id" + storage.set-item "visitor_id", payload.default_id + + a.send request-types[\session-init], JSON.stringify { + visitor_id: storage.get-item "visitor_id" + user_agent: window.navigator.userAgent + resolution_height: window.screen.availHeight + resolution_width: window.screen.availWidth + referrer: document.referrer + } + + +a.action = (action) -> + a.send request-types[\action], JSON.stringify { + action: action + } + +a.urlaction = (urlaction) -> + a.send request-types[\url-action], JSON.stringify { + urlaction: urlaction + } + +a.urlaction "blabla.com0" +#a.action "blabla.com" + + +a.on-error = (message) -> + console.error "Error received: #{message.reason}" + + + diff --git a/src/websocketd-ws.ls b/src/websocketd-ws.ls new file mode 100644 index 0000000..5a52b6f --- /dev/null +++ b/src/websocketd-ws.ls @@ -0,0 +1,74 @@ + +pascal-case = (string) -> + string.replace /^./g, ((.to-upper-case!)) + .replace /-(.)/g, (m, m1) -> m1.to-upper-case! + +module.exports = (socket-name, socket-url) -> + self = {} + + request-types = {} + + response-types = {} + + delayed-messages = [] + + # TODO: naming convention + # users can record functions to run on events + self.user-on-socket-error = [] + self.user-on-socket-close = [] + + self.open-socket = -> + self.socket := new WebSocket socket-url + + self.socket.onerror = (event) -> + for f in self.user-on-socket-error + f event + self.socket.close! + + self.socket.onclose = (event) -> + for f in self.user-on-socket-close + f event + + self.socket.onmessage = (event) -> + message = JSON.parse(event.data) + + key = "on" + pascal-case (response-types[message.utype] || "unknown-message") + + payload = JSON.parse message.payload + + console.log socket-name, message.utype, key, payload + + if callback = self[key] + callback payload + + self.socket.onopen = -> + delayed-messages.for-each (pair) -> + [type, opts] = pair + + self.real-send type, opts + + delayed-messages := [] + + self.reopen = -> + self.socket.close! + self.open-socket! + + self.open-socket! + + self.send = (type, opts) -> + if self.socket.ready-state + self.real-send type, opts + else + delayed-messages.push [type, opts] + + self.real-send = (type, opts) -> + self.socket.send JSON.stringify { utype: type, payload: opts } + + self.register-response-type = (type, type-name) -> + response-types[type] = type-name + + self.close = -> + self.socket.close! + + self +