This is work in progress...
Code Reality framework enables building networked extended reality (XR) experiences with A-Frame.
aframe-dataspace servers provide a shared space to store and transmit scene data between browsers.
Production:
Public test:
Tested browsers (latest versions):
- Windows / Firefox
- Windows / Chrome
- macOS / Firefox
- macOS / Chrome
- macOS / Safari
- iOS / Safari
Tested devices:
- HTC Vive
- Oculus Go (Oculus Browser)
npm run build:node npm run build:browser
heroku create --region eu code-reality
git push heroku master
heroku logs -t
heroku logs -t --dyno=web
To run the node http server in development mode you need to run locally the following commands in separate terminals:
- npm run dev:node
- npm run dev:browser
Browse to: http://localhost:3001/
Currently implemented authentication method is facebook authentication with express passport.
Authorization to rest and web socket services are transmitted with JWT token. The trusted issuer public keys are listed in cluster configuration.
RSA key pair can be generated as follows:
openssl genrsa -aes128 -out private.pem 2048
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
openssl base64 -in private.pem -out private.base64
openssl base64 -in public.pem -out public.base64
Windows base64 encode:
certutil -encode public.pem tmp.b64; findstr /v /c:- tmp.b64 > public.b64; rm tmp.b64
certutil -encode private.pem tmp.b64; findstr /v /c:- tmp.b64 > private.b64; rm tmp.b64
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApl9jOIkv7+MQpc3Y1UTz 9DNSXQeQJRI8IgkHoyKT2FXlaty+DBh42qLdcsRUWhT6BcTdV++3MI9mUluUA8zc 6s/oYR/Q3D8FJUi2Oe8VXhv1/edDQU2TguYaBvxiVZYXlXuDkjU05iKMYdiBcFp8 8t4FDFPUMRGgMNWpIDxGOeCxN0v8ott3OBkFHyokGdxMvu1q5KVS4Y60D8UgC/4i IGE3QCLqIzZ+jm0o8vAqgJG/rAL5UmufR+KnWdIIVfHyhZwxFjWuurfPZwKX23aj gcIDFjPf1XdeWdEViCGADeaiYfyrCk5E+I7x38Zj1eHqljJYh6o2jaKJxHsH0ZJK uwIDAQAB -----END PUBLIC KEY-----
Base64 encoded pem: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFwbDlqT0lrdjcrTVFwYzNZMVVUego5RE5TWFFlUUpSSThJZ2tIb3lLVDJGWGxhdHkrREJoNDJxTGRjc1JVV2hUNkJjVGRWKyszTUk5bVVsdVVBOHpjCjZzL29ZUi9RM0Q4RkpVaTJPZThWWGh2MS9lZERRVTJUZ3VZYUJ2eGlWWllYbFh1RGtqVTA1aUtNWWRpQmNGcDgKOHQ0RkRGUFVNUkdnTU5XcElEeEdPZUN4TjB2OG90dDNPQmtGSHlva0dkeE12dTFxNUtWUzRZNjBEOFVnQy80aQpJR0UzUUNMcUl6WitqbTBvOHZBcWdKRy9yQUw1VW11ZlIrS25XZElJVmZIeWhad3hGald1dXJmUFp3S1gyM2FqCmdjSURGalBmMVhkZVdkRVZpQ0dBRGVhaVlmeXJDazVFK0k3eDM4WmoxZUhxbGpKWWg2bzJqYUtKeEhzSDBaSksKdXdJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==
-----BEGIN ENCRYPTED PRIVATE KEY----- MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIcWh6z9EMYM0CAggA MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBBqOpXbx71NJZBKMR/68q72BIIE 0HVBN0ufwa3UrYO/J+KDVtvYAV4HkZ3RBP9D6DKutPK92wT6CiOB8wcfSj1dEEgl FHZNDh7fMhKnm68SZyYuCV69dmZBMDLg5PqEtjvwQ1J5ppMCnDgLKriYI4mPfhrC g8Ogfogus9fcS5/tynV+VdDAtVXnU5WV6GnQ711CHQttzgNZMF8fel5ymXix8kEA WnSt2pAWXrGNCtBw8/8XfQ1gz4LhzqcWGxMsZ1GoQQETT4LpsTY7misJU8hSEPij UyQL1Yp0jDIpnIBNrL0cQuqiyLN2FDKF/DAjxWTeJsma1ykq528qXwJ543h9AsQJ UVh9aemfPE2R29EO6s/jqZTgoIX2KS6Jg8Bag8PrrkYQBzwECNjiBEiJccH+bDzH VvKwCw2gnMX2jnJ57YTrCqpz1QdL1ennvtJUMHjNwa3PAA8PYMGjvR72d8tF2neS kR64PKbBQjKdcuGpK4yPHsA3xQ2hnB/Ubi26JW2QB1FrBMsVynksfP0YKZWp4ssQ f8k2riid9puvOuDyu8u0Vn6lvEOf91v9Cl85GeSbg3L6PJ/HLSRYrSfrOmm/oSA1 HXHJbh7h8C6XnYxc6ktJymx44WO6qdHo8rATzXsAJhbXz/vWhJd77D2tTN+R3M3n 9LBeQzOqf2AWeLVYFtRvQ5UOG39ln5ZbYVI838Zi7FcjLQSaH4JnjRlnKez1uD8K ppukUVaYf/RxIGvBpPd+DB+yzrg4UAVzmy59n7L91IlfnqAhY5wfSFBxCfRcWExA YbVe6v93+ucgDOjxwrQzTkim2BSFHe0B+iuUhJCkfV4vmbMUGaiCwi6rqsSlvpe1 BBXEHmN05CphH0KITC4rhKAxsbDi5wvsXYRxitjtNkaAFBz98uxIznmJJesoUBlw kensqow3hiKmSyj6QbwgycRTEvBohx6/vBW4KpFZRiZ5OfCD5vBTgyaAjHx+DfYv 6rCfiGtuHLBt19fKMAzFHit4Y1lFO5tzcMIBzhHtctTNp7mHU/lfEkTbGaRX1KwA z1iPSiC1Bo2UPs4nuYxWYxJiXDXZWl+9aVKghJZZrbJR1r/G92FTHpsIua0fg03U 9bYHDYcN3vuKnXpInROLFmhcH+9gx9wYFLIOB/KkdRow+cLrY46YL5TvAAXXnfhB sy/sLQp8jhV4M84TJKKX6bcweElK5CjBiVa803nHZtIGzscyQofx05z1VXuH+VDs /kXfMmEzvuEGB+kw1ool2Os0vCqlWhhC9RMpx+4kliTnHklMaqjEshWBYhUUwhm+ Ajz33YU1NwmezChCDbLnBy1xAYGW9MkFS4bbfVJszq4Xb7EbX5+SASczsdSpfosu /Bqkf5+LssOoAQjXDyqBlouapjm42Y6Nix9wdd857N10us+/jGurKxlRu9QlXN+C wCeRS6iziOmwxIYFWngIfgplZ03UulD5+CjMMBEuyvwZtgeFLRLINyfpaotdAGq1 WlUtQTobiadOwVCoSWC8JI0lE0HELbR34rPgC+rMAy0vrZdwAr+7uijsZNLwgdAV OinFzij2tlyj7A7pmP+KPNsfbVgo2l34vIJyR8NGGhpY5FKxbuXdzAgK3oLENTHY 7XkOmhjGgctN3IrlVfizEyl2dYXB6wTUVNkIFW9OyA7E -----END ENCRYPTED PRIVATE KEY-----
Base64 encoded pem: LS0tLS1CRUdJTiBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQpNSUlGTFRCWEJna3Foa2lHOXcwQkJRMHdTakFwQmdrcWhraUc5dzBCQlF3d0hBUUljV2g2ejlFTVlNMENBZ2dBCk1Bd0dDQ3FHU0liM0RRSUpCUUF3SFFZSllJWklBV1VEQkFFcUJCQnFPcFhieDcxTkpaQktNUi82OHE3MkJJSUUKMEhWQk4wdWZ3YTNVcllPL0orS0RWdHZZQVY0SGtaM1JCUDlENkRLdXRQSzkyd1Q2Q2lPQjh3Y2ZTajFkRUVnbApGSFpORGg3Zk1oS25tNjhTWnlZdUNWNjlkbVpCTURMZzVQcUV0anZ3UTFKNXBwTUNuRGdMS3JpWUk0bVBmaHJDCmc4T2dmb2d1czlmY1M1L3R5blYrVmREQXRWWG5VNVdWNkduUTcxMUNIUXR0emdOWk1GOGZlbDV5bVhpeDhrRUEKV25TdDJwQVdYckdOQ3RCdzgvOFhmUTFnejRMaHpxY1dHeE1zWjFHb1FRRVRUNExwc1RZN21pc0pVOGhTRVBpagpVeVFMMVlwMGpESXBuSUJOckwwY1F1cWl5TE4yRkRLRi9EQWp4V1RlSnNtYTF5a3E1MjhxWHdKNTQzaDlBc1FKClVWaDlhZW1mUEUyUjI5RU82cy9qcVpUZ29JWDJLUzZKZzhCYWc4UHJya1lRQnp3RUNOamlCRWlKY2NIK2JEekgKVnZLd0N3MmduTVgyam5KNTdZVHJDcXB6MVFkTDFlbm52dEpVTUhqTndhM1BBQThQWU1HanZSNzJkOHRGMm5lUwprUjY0UEtiQlFqS2RjdUdwSzR5UEhzQTN4UTJobkIvVWJpMjZKVzJRQjFGckJNc1Z5bmtzZlAwWUtaV3A0c3NRCmY4azJyaWlkOXB1dk91RHl1OHUwVm42bHZFT2Y5MXY5Q2w4NUdlU2JnM0w2UEovSExTUllyU2ZyT21tL29TQTEKSFhISmJoN2g4QzZYbll4YzZrdEp5bXg0NFdPNnFkSG84ckFUelhzQUpoYlh6L3ZXaEpkNzdEMnRUTitSM00zbgo5TEJlUXpPcWYyQVdlTFZZRnRSdlE1VU9HMzlsbjVaYllWSTgzOFppN0ZjakxRU2FINEpualJsbktlejF1RDhLCnBwdWtVVmFZZi9SeElHdkJwUGQrREIreXpyZzRVQVZ6bXk1OW43TDkxSWxmbnFBaFk1d2ZTRkJ4Q2ZSY1dFeEEKWWJWZTZ2OTMrdWNnRE9qeHdyUXpUa2ltMkJTRkhlMEIraXVVaEpDa2ZWNHZtYk1VR2FpQ3dpNnJxc1NsdnBlMQpCQlhFSG1OMDVDcGhIMEtJVEM0cmhLQXhzYkRpNXd2c1hZUnhpdGp0TmthQUZCejk4dXhJem5tSkplc29VQmx3CmtlbnNxb3czaGlLbVN5ajZRYndneWNSVEV2Qm9oeDYvdkJXNEtwRlpSaVo1T2ZDRDV2QlRneWFBakh4K0RmWXYKNnJDZmlHdHVITEJ0MTlmS01BekZIaXQ0WTFsRk81dHpjTUlCemhIdGN0VE5wN21IVS9sZkVrVGJHYVJYMUt3QQp6MWlQU2lDMUJvMlVQczRudVl4V1l4SmlYRFhaV2wrOWFWS2doSlpacmJKUjFyL0c5MkZUSHBzSXVhMGZnMDNVCjliWUhEWWNOM3Z1S25YcEluUk9MRm1oY0grOWd4OXdZRkxJT0IvS2tkUm93K2NMclk0NllMNVR2QUFYWG5maEIKc3kvc0xRcDhqaFY0TTg0VEpLS1g2YmN3ZUVsSzVDakJpVmE4MDNuSFp0SUd6c2N5UW9meDA1ejFWWHVIK1ZEcwova1hmTW1FenZ1RUdCK2t3MW9vbDJPczB2Q3FsV2hoQzlSTXB4KzRrbGlUbkhrbE1hcWpFc2hXQlloVVV3aG0rCkFqejMzWVUxTndtZXpDaENEYkxuQnkxeEFZR1c5TWtGUzRiYmZWSnN6cTRYYjdFYlg1K1NBU2N6c2RTcGZvc3UKL0Jxa2Y1K0xzc09vQVFqWER5cUJsb3VhcGptNDJZNk5peDl3ZGQ4NTdOMTB1cysvakd1ckt4bFJ1OVFsWE4rQwp3Q2VSUzZpemlPbXd4SVlGV25nSWZncGxaMDNVdWxENStDak1NQkV1eXZ3WnRnZUZMUkxJTnlmcGFvdGRBR3ExCldsVXRRVG9iaWFkT3dWQ29TV0M4SkkwbEUwSEVMYlIzNHJQZ0Mrck1BeTB2clpkd0FyKzd1aWpzWk5Md2dkQVYKT2luRnppajJ0bHlqN0E3cG1QK0tQTnNmYlZnbzJsMzR2SUp5UjhOR0docFk1Rkt4YnVYZHpBZ0szb0xFTlRIWQo3WGtPbWhqR2djdE4zSXJsVmZpekV5bDJkWVhCNndUVVZOa0lGVzlPeUE3RQotLS0tLUVORCBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQo=
Controllers inputs are mapped to semantically meaningful buttons and sticks:
- Trigger
- Grip
- Menu
- Left
- Right
- Up
- Down
- Translate
- Rotate
Terms:
- Point - Entity is pointed by laser pointer.
- Hover - Entity is intersected or pointed by controller.
-
Grip Down - If entity hovered then hold else spawn and hold.
-
Grip Up - Release hold entity.
-
Trigger Down - Start laser pointer.
-
Trigger Up - Stop laser pointer.
-
Point - Increasing haptic feedback when entity is pointed until deleted after 3 seconds.
npm publish --access public
npm version patch
npm publish