├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── build ├── api.d.ts ├── api.js ├── constants │ ├── index.d.ts │ └── index.js ├── index.d.ts ├── index.js ├── models │ ├── account.d.ts │ ├── account.js │ ├── certificate.d.ts │ ├── certificate.js │ ├── index.d.ts │ ├── index.js │ ├── lesson.d.ts │ ├── lesson.js │ ├── pupil.d.ts │ ├── pupil.js │ ├── request-base-data.d.ts │ └── request-base-data.js └── utils │ ├── encryption.d.ts │ ├── encryption.js │ ├── requests.d.ts │ ├── requests.js │ ├── time.d.ts │ └── time.js ├── package-lock.json ├── package.json ├── src ├── api.ts ├── constants │ └── index.ts ├── index.ts ├── models │ ├── account.ts │ ├── certificate.ts │ ├── index.ts │ ├── lesson.ts │ ├── pupil.ts │ └── request-base-data.ts └── utils │ ├── encryption.ts │ ├── requests.ts │ └── time.ts ├── tsconfig.json ├── tslint.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules\\typescript\\lib" 3 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Eryk Rakowski 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # uonet 2 | 3 | Nieoficjalne SDK do e-dziennika UONET+ napisane w Node.js. 4 | 5 | # Instalacja 6 | 7 | Upewnij się, że na Twoim komputerze jest Node.js zainstalowane, a następnie uruchom poniższą komendę: 8 | 9 | ```bash 10 | $ npm install uonet 11 | ``` 12 | 13 | # Przykład 14 | 15 | ```javascript 16 | const { UONET } = require("uonet"); 17 | 18 | const uonet = new UONET(); 19 | 20 | uonet.login("pin", "token", "symbol"); 21 | 22 | uonet 23 | .getTimetable(uonet.accounts[0].id, "2018-02-23", "2018-02-23") 24 | .then(timetable => { 25 | console.log(timetable); 26 | }); 27 | ``` 28 | 29 | # Dokumentacja 30 | 31 | Aby uzyskać jakiekolwiek dane z e-dziennika UONET+, należy dokonać autoryzacji i otrzymać certyfikat, aby później wykonywać żądania np. o plan lekcji. 32 | 33 | ## Klasa `UONET` 34 | 35 | ### `new UONET()` 36 | 37 | #### Właściwości 38 | 39 | `accounts` Account[] - przechowywane są dane o zarejestrowanych kontach 40 | 41 | #### Metody 42 | 43 | `request(accountId: number, body: object, method: string)` - wykonuje żądanie do UONET+ z podanymi danymi o koncie, treści i metody. 44 | 45 | - `accountId` number - ID konta, z którego ma zostać wykonane żądanie 46 | - `body` object - treść żądania 47 | - `method` string - ostatnia część URL żądania np: 48 | - `PlanLekcjiZeZmianami` 49 | - `Slowniki` 50 | 51 | Zwraca obiekt - wynik żądania. 52 | 53 | `getTimetable(accountId: number, from: string, to: string)` - zwraca plan lekcji w danym okresie. 54 | 55 | - `from` string - data początkowa w formacie rrrr-mm-dd 56 | - `to` string - data końcowa w formacie rrrr-mm-dd 57 | 58 | Zwraca [Lesson](#lesson)[] 59 | 60 | `login(pin: string, token: string, symbol: string)` - rejestruje urządzenie i zwraca potrzebne dane o koncie do dalszch żądań. 61 | 62 | Zwraca [Account](#account). 63 | 64 | ## `Lesson` 65 | 66 | Obiekt przechowujący dane o danej lekcji w planie. 67 | 68 | - `date` object 69 | - `start` Date - data rozpoczęcia lekcji 70 | - `end` Date - data zakończenia lekcji 71 | - `order` number - numer lekcji (kolejność) 72 | - `name` string - nazwa przedmiotu 73 | - `room` string - sala 74 | - `teacher` object - nauczyciel 75 | - `firstName` string - imię nauczyciela 76 | - `lastName` string - nazwisko nauczyciela 77 | - `note` string - notatka o lekcji (np. "Uczniowie zwolnieni") 78 | - `isForPupil` boolean - określa czy dana lekcja dotyczy ucznia. 79 | 80 | ## `Account` 81 | 82 | Obiekt przechowujący dane o koncie. 83 | 84 | - `id` number - ID konta 85 | - `branchId` number - numer oddziału 86 | - `periodId` number - ID okresu klasyfikacyjnego 87 | - `baseURL` string - bazowy adres REST API 88 | - `certificate` [Certificate](#certificate) - dane o certyfikacie konta 89 | 90 | ## `Certificate` 91 | 92 | Obiekt przechowujący dane o certyfikacie. 93 | 94 | - `key` string - klucz certyfikatu 95 | - `pfx` string - PFX certyfikatu 96 | -------------------------------------------------------------------------------- /build/api.d.ts: -------------------------------------------------------------------------------- 1 | import { Account, Lesson } from './models'; 2 | export declare class UONET { 3 | accounts: Account[]; 4 | request(accountId: number, body: any, method: string): Promise; 5 | getTimetable(accountId: number, from: string, to: string): Promise; 6 | login(pin: string, token: string, symbol: string): Promise; 7 | } 8 | -------------------------------------------------------------------------------- /build/api.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const axios_1 = __importDefault(require("axios")); 7 | const uuid_1 = require("uuid"); 8 | const requests_1 = require("./utils/requests"); 9 | const constants_1 = require("./constants"); 10 | class UONET { 11 | constructor() { 12 | this.accounts = []; 13 | } 14 | async request(accountId, body, method) { 15 | try { 16 | const account = this.accounts.find(x => x.id === accountId); 17 | if (!account) { 18 | throw new Error("Couldn't find the account with given ID."); 19 | } 20 | const url = `${account.baseURL}/mobile-api/Uczen.v3.Uczen/${method}`; 21 | const req = await requests_1.getRequest({ 22 | body, 23 | url, 24 | }, { 25 | key: account.certificate.key, 26 | pfx: account.certificate.pfx, 27 | }); 28 | const res = await axios_1.default(req); 29 | return res.data; 30 | } 31 | catch (e) { 32 | throw e; 33 | } 34 | } 35 | async getTimetable(accountId, from, to) { 36 | try { 37 | const account = this.accounts.find(x => x.id === accountId); 38 | let data = (await this.request(accountId, { 39 | IdOkresKlasyfikacyjny: account.periodId, 40 | IdUczen: account.id, 41 | IdOddzial: account.branchId, 42 | DataPoczatkowa: from, 43 | DataKoncowa: to, 44 | }, 'PlanLekcjiZeZmianami')).Data; 45 | const dictionary = (await this.request(accountId, {}, 'Slowniki')).Data; 46 | data = data.sort((a, b) => { 47 | return a.NumerLekcji - b.NumerLekcji; 48 | }); 49 | const timetable = data.map(item => { 50 | const teacher = dictionary.Nauczyciele.find((x) => x.Id === item.IdPracownik); 51 | const hour = dictionary.PoryLekcji.find((x) => x.Id === item.IdPoraLekcji); 52 | const start = new Date(`${item.DzienTekst} ${hour.PoczatekTekst}:00`); 53 | const end = new Date(`${item.DzienTekst} ${hour.KoniecTekst}:00`); 54 | const lesson = { 55 | name: item.PrzedmiotNazwa, 56 | order: item.NumerLekcji, 57 | room: item.Sala, 58 | teacher: { 59 | firstName: teacher.Imie, 60 | lastName: teacher.Nazwisko, 61 | }, 62 | date: { 63 | start, 64 | end, 65 | }, 66 | note: item.AdnotacjaOZmianie, 67 | isForPupil: item.PlanUcznia, 68 | }; 69 | return lesson; 70 | }); 71 | return timetable; 72 | } 73 | catch (e) { 74 | throw e; 75 | } 76 | } 77 | async login(pin, token, symbol) { 78 | try { 79 | const code = token.substring(0, 3); 80 | const url = await requests_1.getRestApiURL(code); 81 | const req = await requests_1.getRequest({ 82 | body: { 83 | PIN: parseInt(pin, 10), 84 | TokenKey: token, 85 | DeviceId: uuid_1.v1(), 86 | DeviceName: 'uonet-api#uonet-api', 87 | DeviceNameUser: '', 88 | DeviceDescription: '', 89 | DeviceSystemType: 'Android', 90 | DeviceSystemVersion: '7.1.0', 91 | AppVersion: constants_1.APP_VERSION, 92 | }, 93 | headers: { 94 | RequestMobileType: 'RegisterDevice', 95 | }, 96 | url: `${url}/${symbol}/mobile-api/Uczen.v3.UczenStart/Certyfikat`, 97 | }); 98 | const cert = await axios_1.default(req); 99 | if (cert.data.IsError) { 100 | console.log(req.data); 101 | throw new Error('UONET+ certificate obtaining failed'); 102 | } 103 | const { CertyfikatPfx, CertyfikatKlucz } = cert.data.TokenCert; 104 | const pupilList = await axios_1.default(await requests_1.getRequest({ 105 | url: `${url}/${symbol}/mobile-api/Uczen.v3.UczenStart/ListaUczniow`, 106 | }, { 107 | key: CertyfikatKlucz, 108 | pfx: CertyfikatPfx, 109 | })); 110 | pupilList.data.Data.forEach((pupil) => { 111 | const account = { 112 | baseURL: `${url}/${symbol}/${pupil.JednostkaSprawozdawczaSymbol}`, 113 | id: pupil.Id, 114 | certificate: { 115 | key: CertyfikatKlucz, 116 | pfx: CertyfikatPfx, 117 | }, 118 | branchId: pupil.IdOddzial, 119 | periodId: pupil.IdOkresKlasyfikacyjny, 120 | }; 121 | this.accounts.push(account); 122 | }); 123 | } 124 | catch (err) { 125 | throw err; 126 | } 127 | } 128 | } 129 | exports.UONET = UONET; 130 | -------------------------------------------------------------------------------- /build/constants/index.d.ts: -------------------------------------------------------------------------------- 1 | export declare const APP_VERSION = "18.4.1.388"; 2 | export declare const APP_NAME = "VULCAN-Android-ModulUcznia"; 3 | export declare const PASSWORD = "CE75EA598C7743AD9B0B7328DED85B06"; 4 | -------------------------------------------------------------------------------- /build/constants/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.APP_VERSION = '18.4.1.388'; 4 | exports.APP_NAME = 'VULCAN-Android-ModulUcznia'; 5 | exports.PASSWORD = 'CE75EA598C7743AD9B0B7328DED85B06'; 6 | -------------------------------------------------------------------------------- /build/index.d.ts: -------------------------------------------------------------------------------- 1 | import { UONET } from './api'; 2 | export { UONET }; 3 | -------------------------------------------------------------------------------- /build/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | const api_1 = require("./api"); 4 | exports.UONET = api_1.UONET; 5 | -------------------------------------------------------------------------------- /build/models/account.d.ts: -------------------------------------------------------------------------------- 1 | import { Certificate } from '.'; 2 | export interface Account { 3 | id: number; 4 | branchId: number; 5 | periodId: number; 6 | baseURL: string; 7 | certificate: Certificate; 8 | } 9 | -------------------------------------------------------------------------------- /build/models/account.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /build/models/certificate.d.ts: -------------------------------------------------------------------------------- 1 | export interface Certificate { 2 | key: string; 3 | pfx: string; 4 | } 5 | -------------------------------------------------------------------------------- /build/models/certificate.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /build/models/index.d.ts: -------------------------------------------------------------------------------- 1 | export * from './account'; 2 | export * from './certificate'; 3 | export * from './pupil'; 4 | export * from './request-base-data'; 5 | export * from './lesson'; 6 | -------------------------------------------------------------------------------- /build/models/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /build/models/lesson.d.ts: -------------------------------------------------------------------------------- 1 | export interface UONETLesson { 2 | Dzien: number; 3 | DzienTekst: string; 4 | NumerLekcji: number; 5 | IdPoraLekcji: number; 6 | IdPrzedmiot: number; 7 | PrzedmiotNazwa: string; 8 | PodzialSkrot: string; 9 | Sala: string; 10 | IdPracownik: number; 11 | IdPracownikWspomagajacy: number; 12 | IdPracownikOld: number; 13 | IdPracownikWspomagajacyOld: number; 14 | IdPlanLekcji: number; 15 | AdnotacjaOZmianie: string; 16 | PrzekreslonaNazwa: boolean; 17 | PogrubionaNazwa: boolean; 18 | PlanUcznia: boolean; 19 | } 20 | export interface Lesson { 21 | date: { 22 | start: Date; 23 | end: Date; 24 | }; 25 | order: number; 26 | name: string; 27 | room: string; 28 | teacher: { 29 | firstName: string; 30 | lastName: string; 31 | }; 32 | note: string; 33 | isForPupil: boolean; 34 | } 35 | -------------------------------------------------------------------------------- /build/models/lesson.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /build/models/pupil.d.ts: -------------------------------------------------------------------------------- 1 | export interface UONETPupil { 2 | JednostkaSprawozdawczaSymbol: string; 3 | Id: number; 4 | IdOddzial: number; 5 | IdOkresKlasyfikacyjny: number; 6 | } 7 | -------------------------------------------------------------------------------- /build/models/pupil.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /build/models/request-base-data.d.ts: -------------------------------------------------------------------------------- 1 | export interface RequestBaseData { 2 | body?: any; 3 | headers?: any; 4 | url: string; 5 | } 6 | -------------------------------------------------------------------------------- /build/models/request-base-data.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /build/utils/encryption.d.ts: -------------------------------------------------------------------------------- 1 | export declare function signContent(content: string, certificate: string, password: string): any; 2 | -------------------------------------------------------------------------------- /build/utils/encryption.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const node_forge_1 = __importDefault(require("node-forge")); 7 | // tslint:disable-next-line 8 | const Crypto = require("node-webcrypto-ossl"); 9 | const crypto = new Crypto(); 10 | function signContent(content, certificate, password) { 11 | const p12Der = node_forge_1.default.util.decode64(certificate); 12 | const p12Asn1 = node_forge_1.default.asn1.fromDer(p12Der); 13 | const pkcs12 = node_forge_1.default.pkcs12.pkcs12FromAsn1(p12Asn1, false, password); 14 | return importCryptoKeyPkcs8(loadPrivateKey(pkcs12), true).then((cryptoKey) => crypto.subtle 15 | .sign('RSASSA-PKCS1-v1_5', cryptoKey, stringToArrayBuffer(content)) 16 | .then((signature) => { 17 | return node_forge_1.default.util.encode64(arrayBufferToString(signature)); 18 | })); 19 | } 20 | exports.signContent = signContent; 21 | function arrayBufferToString(buffer) { 22 | let binary = ''; 23 | const bytes = new Uint8Array(buffer); 24 | const len = bytes.byteLength; 25 | for (let i = 0; i < len; i += 1) { 26 | binary += String.fromCharCode(bytes[i]); 27 | } 28 | return binary; 29 | } 30 | function privateKeyToPkcs8(privateKey) { 31 | // @ts-ignore 32 | const rsaPrivateKey = node_forge_1.default.pki.privateKeyToAsn1(privateKey); 33 | // @ts-ignore 34 | const privateKeyInfo = node_forge_1.default.pki.wrapRsaPrivateKey(rsaPrivateKey); 35 | const privateKeyInfoDer = node_forge_1.default.asn1.toDer(privateKeyInfo).getBytes(); 36 | return stringToArrayBuffer(privateKeyInfoDer); 37 | } 38 | function stringToArrayBuffer(data) { 39 | const arrBuff = new ArrayBuffer(data.length); 40 | const writer = new Uint8Array(arrBuff); 41 | for (let i = 0, len = data.length; i < len; i += 1) { 42 | writer[i] = data.charCodeAt(i); 43 | } 44 | return arrBuff; 45 | } 46 | function loadPrivateKey(pkcs12) { 47 | // load keypair and cert chain from safe content(s) 48 | for (let sci = 0; sci < pkcs12.safeContents.length; sci += 1) { 49 | const safeContents = pkcs12.safeContents[sci]; 50 | for (let sbi = 0; sbi < safeContents.safeBags.length; sbi += 1) { 51 | const safeBag = safeContents.safeBags[sbi]; 52 | // this bag has a private key 53 | if (safeBag.type === node_forge_1.default.pki.oids.keyBag) { 54 | // Found plain private key 55 | return safeBag.key; 56 | } 57 | if (safeBag.type === node_forge_1.default.pki.oids.pkcs8ShroudedKeyBag) { 58 | // found encrypted private key 59 | return safeBag.key; 60 | } 61 | if (safeBag.type === node_forge_1.default.pki.oids.certBag) { 62 | // this bag has a certificate... 63 | } 64 | } 65 | } 66 | } 67 | function importCryptoKeyPkcs8(privateKey, extractable) { 68 | const privateKeyInfoDerBuff = privateKeyToPkcs8(privateKey); 69 | // Import the webcrypto key 70 | return crypto.subtle.importKey('pkcs8', privateKeyInfoDerBuff, { 71 | name: 'RSASSA-PKCS1-v1_5', 72 | hash: { 73 | name: 'SHA-1', 74 | }, 75 | }, extractable, ['sign']); 76 | } 77 | -------------------------------------------------------------------------------- /build/utils/requests.d.ts: -------------------------------------------------------------------------------- 1 | import { RequestBaseData, Certificate } from '../models'; 2 | export declare const getRestApiURL: (code: string) => Promise; 3 | export declare const getRequest: (data: RequestBaseData, certificate?: Certificate) => Promise<{ 4 | data: any; 5 | headers: any; 6 | url: string; 7 | method: string; 8 | }>; 9 | -------------------------------------------------------------------------------- /build/utils/requests.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const uuid_1 = require("uuid"); 7 | const axios_1 = __importDefault(require("axios")); 8 | const constants_1 = require("../constants"); 9 | const time_1 = require("./time"); 10 | const encryption_1 = require("./encryption"); 11 | exports.getRestApiURL = async (code) => { 12 | try { 13 | const urlList = await axios_1.default.get('https://komponenty.vulcan.net.pl/UonetPlusMobile/RoutingRules.txt'); 14 | const urls = urlList.data.split(/\r\n/).map((e) => e.split(',')); 15 | const url = urls.filter((e) => e[0] === code.substring(0, 3))[0][1]; 16 | return url; 17 | } 18 | catch (err) { 19 | throw err; 20 | } 21 | }; 22 | exports.getRequest = async (data, certificate = null) => { 23 | try { 24 | const requestBase = { 25 | data: { 26 | ...data.body, 27 | RemoteMobileTimeKey: time_1.getTimestamp(), 28 | TimeKey: time_1.getTimestamp() - 1, 29 | RequestId: uuid_1.v4(), 30 | RemoteMobileAppVersion: constants_1.APP_VERSION, 31 | RemoteMobileAppName: constants_1.APP_NAME, 32 | }, 33 | headers: { 34 | ...data.headers, 35 | 'User-Agent': 'MobileUserAgent', 36 | 'Content-Type': 'application/json; charset=UTF-8', 37 | }, 38 | url: data.url, 39 | method: 'POST', 40 | }; 41 | if (certificate) { 42 | requestBase.headers.RequestCertificateKey = certificate.key; 43 | requestBase.headers.RequestSignatureValue = await encryption_1.signContent(JSON.stringify(requestBase.data), certificate.pfx, constants_1.PASSWORD); 44 | } 45 | return requestBase; 46 | } 47 | catch (e) { 48 | throw e; 49 | } 50 | }; 51 | -------------------------------------------------------------------------------- /build/utils/time.d.ts: -------------------------------------------------------------------------------- 1 | export declare const getTimestamp: () => number; 2 | -------------------------------------------------------------------------------- /build/utils/time.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | const date_fns_1 = require("date-fns"); 4 | exports.getTimestamp = () => date_fns_1.getUnixTime(new Date()); 5 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "uonet-sdk", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@fimbul/bifrost": { 8 | "version": "0.11.0", 9 | "resolved": "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.11.0.tgz", 10 | "integrity": "sha512-GspMaQafpaUoXWWOUgNLQ4vsV52tIHUt0zpKPeJUYEyMvOSp7FIcZ1eQa7SK3GTusrEiksjMrDX/fwanigC3nQ==", 11 | "dev": true, 12 | "requires": { 13 | "@fimbul/ymir": "^0.11.0", 14 | "get-caller-file": "^1.0.2", 15 | "tslib": "^1.8.1", 16 | "tsutils": "^2.24.0" 17 | } 18 | }, 19 | "@fimbul/ymir": { 20 | "version": "0.11.0", 21 | "resolved": "https://registry.npmjs.org/@fimbul/ymir/-/ymir-0.11.0.tgz", 22 | "integrity": "sha512-aIYQMCWbBXe7DIofgu+4DLCPDCfqbKhPjBg4ajskJdq6CAJgySz6KyhGLNnKiDYZMF93ZsaEB/y3SafyMi98Mg==", 23 | "dev": true, 24 | "requires": { 25 | "inversify": "^4.10.0", 26 | "reflect-metadata": "^0.1.12", 27 | "tslib": "^1.8.1" 28 | } 29 | }, 30 | "@types/node": { 31 | "version": "10.12.0", 32 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.0.tgz", 33 | "integrity": "sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ==" 34 | }, 35 | "@types/node-forge": { 36 | "version": "0.7.6", 37 | "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-0.7.6.tgz", 38 | "integrity": "sha512-P6OLX3dH3rf7Un2EgR3s0QkW1atDLxeykfPDqJlFecEVKDF9etp0IR3+oj9O++2inmXrgHMEcOWDuUNavylwpw==", 39 | "requires": { 40 | "@types/node": "*" 41 | } 42 | }, 43 | "@types/uuid": { 44 | "version": "3.4.4", 45 | "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.4.tgz", 46 | "integrity": "sha512-tPIgT0GUmdJQNSHxp0X2jnpQfBSTfGxUMc/2CXBU2mnyTFVYVa2ojpoQ74w0U2yn2vw3jnC640+77lkFFpdVDw==", 47 | "requires": { 48 | "@types/node": "*" 49 | } 50 | }, 51 | "ansi-regex": { 52 | "version": "2.1.1", 53 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 54 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 55 | "dev": true 56 | }, 57 | "ansi-styles": { 58 | "version": "2.2.1", 59 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 60 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 61 | "dev": true 62 | }, 63 | "argparse": { 64 | "version": "1.0.10", 65 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 66 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 67 | "dev": true, 68 | "requires": { 69 | "sprintf-js": "~1.0.2" 70 | } 71 | }, 72 | "axios": { 73 | "version": "0.18.0", 74 | "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz", 75 | "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", 76 | "requires": { 77 | "follow-redirects": "^1.3.0", 78 | "is-buffer": "^1.1.5" 79 | } 80 | }, 81 | "babel-code-frame": { 82 | "version": "6.26.0", 83 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 84 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 85 | "dev": true, 86 | "requires": { 87 | "chalk": "^1.1.3", 88 | "esutils": "^2.0.2", 89 | "js-tokens": "^3.0.2" 90 | }, 91 | "dependencies": { 92 | "chalk": { 93 | "version": "1.1.3", 94 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 95 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 96 | "dev": true, 97 | "requires": { 98 | "ansi-styles": "^2.2.1", 99 | "escape-string-regexp": "^1.0.2", 100 | "has-ansi": "^2.0.0", 101 | "strip-ansi": "^3.0.0", 102 | "supports-color": "^2.0.0" 103 | } 104 | } 105 | } 106 | }, 107 | "balanced-match": { 108 | "version": "1.0.0", 109 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 110 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 111 | "dev": true 112 | }, 113 | "brace-expansion": { 114 | "version": "1.1.11", 115 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 116 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 117 | "dev": true, 118 | "requires": { 119 | "balanced-match": "^1.0.0", 120 | "concat-map": "0.0.1" 121 | } 122 | }, 123 | "builtin-modules": { 124 | "version": "1.1.1", 125 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 126 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 127 | "dev": true 128 | }, 129 | "chalk": { 130 | "version": "2.4.1", 131 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 132 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 133 | "dev": true, 134 | "requires": { 135 | "ansi-styles": "^3.2.1", 136 | "escape-string-regexp": "^1.0.5", 137 | "supports-color": "^5.3.0" 138 | }, 139 | "dependencies": { 140 | "ansi-styles": { 141 | "version": "3.2.1", 142 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 143 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 144 | "dev": true, 145 | "requires": { 146 | "color-convert": "^1.9.0" 147 | } 148 | }, 149 | "supports-color": { 150 | "version": "5.5.0", 151 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 152 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 153 | "dev": true, 154 | "requires": { 155 | "has-flag": "^3.0.0" 156 | } 157 | } 158 | } 159 | }, 160 | "color-convert": { 161 | "version": "1.9.3", 162 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 163 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 164 | "dev": true, 165 | "requires": { 166 | "color-name": "1.1.3" 167 | } 168 | }, 169 | "color-name": { 170 | "version": "1.1.3", 171 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 172 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 173 | "dev": true 174 | }, 175 | "commander": { 176 | "version": "2.19.0", 177 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", 178 | "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", 179 | "dev": true 180 | }, 181 | "concat-map": { 182 | "version": "0.0.1", 183 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 184 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 185 | "dev": true 186 | }, 187 | "date-fns": { 188 | "version": "2.0.0-alpha.24", 189 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.0.0-alpha.24.tgz", 190 | "integrity": "sha512-jpLzKHKSq0nTcZ3K5ZnTelxWmUwPepuoEaXkATwIUnc1tc+/rIooAvDMR+zdAGnwQ35eVWiyn5dikoLHjhEYeA==" 191 | }, 192 | "debug": { 193 | "version": "3.1.0", 194 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 195 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 196 | "requires": { 197 | "ms": "2.0.0" 198 | } 199 | }, 200 | "diff": { 201 | "version": "3.5.0", 202 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 203 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 204 | "dev": true 205 | }, 206 | "doctrine": { 207 | "version": "0.7.2", 208 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", 209 | "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", 210 | "dev": true, 211 | "requires": { 212 | "esutils": "^1.1.6", 213 | "isarray": "0.0.1" 214 | }, 215 | "dependencies": { 216 | "esutils": { 217 | "version": "1.1.6", 218 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", 219 | "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", 220 | "dev": true 221 | } 222 | } 223 | }, 224 | "escape-string-regexp": { 225 | "version": "1.0.5", 226 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 227 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 228 | "dev": true 229 | }, 230 | "esprima": { 231 | "version": "4.0.1", 232 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 233 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 234 | "dev": true 235 | }, 236 | "esutils": { 237 | "version": "2.0.2", 238 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 239 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 240 | "dev": true 241 | }, 242 | "follow-redirects": { 243 | "version": "1.5.9", 244 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz", 245 | "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==", 246 | "requires": { 247 | "debug": "=3.1.0" 248 | } 249 | }, 250 | "fs.realpath": { 251 | "version": "1.0.0", 252 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 253 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 254 | "dev": true 255 | }, 256 | "get-caller-file": { 257 | "version": "1.0.3", 258 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", 259 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", 260 | "dev": true 261 | }, 262 | "glob": { 263 | "version": "7.1.3", 264 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 265 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 266 | "dev": true, 267 | "requires": { 268 | "fs.realpath": "^1.0.0", 269 | "inflight": "^1.0.4", 270 | "inherits": "2", 271 | "minimatch": "^3.0.4", 272 | "once": "^1.3.0", 273 | "path-is-absolute": "^1.0.0" 274 | } 275 | }, 276 | "has-ansi": { 277 | "version": "2.0.0", 278 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 279 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 280 | "dev": true, 281 | "requires": { 282 | "ansi-regex": "^2.0.0" 283 | } 284 | }, 285 | "has-flag": { 286 | "version": "3.0.0", 287 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 288 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 289 | "dev": true 290 | }, 291 | "inflight": { 292 | "version": "1.0.6", 293 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 294 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 295 | "dev": true, 296 | "requires": { 297 | "once": "^1.3.0", 298 | "wrappy": "1" 299 | } 300 | }, 301 | "inherits": { 302 | "version": "2.0.3", 303 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 304 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 305 | "dev": true 306 | }, 307 | "inversify": { 308 | "version": "4.13.0", 309 | "resolved": "https://registry.npmjs.org/inversify/-/inversify-4.13.0.tgz", 310 | "integrity": "sha512-O5d8y7gKtyRwrvTLZzYET3kdFjqUy58sGpBYMARF13mzqDobpfBXVOPLH7HmnD2VR6Q+1HzZtslGvsdQfeb0SA==", 311 | "dev": true 312 | }, 313 | "is-buffer": { 314 | "version": "1.1.6", 315 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 316 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 317 | }, 318 | "isarray": { 319 | "version": "0.0.1", 320 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 321 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 322 | "dev": true 323 | }, 324 | "js-tokens": { 325 | "version": "3.0.2", 326 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 327 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 328 | "dev": true 329 | }, 330 | "js-yaml": { 331 | "version": "3.13.1", 332 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 333 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 334 | "dev": true, 335 | "requires": { 336 | "argparse": "^1.0.7", 337 | "esprima": "^4.0.0" 338 | } 339 | }, 340 | "minimatch": { 341 | "version": "3.0.4", 342 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 343 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 344 | "dev": true, 345 | "requires": { 346 | "brace-expansion": "^1.1.7" 347 | } 348 | }, 349 | "minimist": { 350 | "version": "0.0.8", 351 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 352 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 353 | }, 354 | "mkdirp": { 355 | "version": "0.5.1", 356 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 357 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 358 | "requires": { 359 | "minimist": "0.0.8" 360 | } 361 | }, 362 | "ms": { 363 | "version": "2.0.0", 364 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 365 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 366 | }, 367 | "nan": { 368 | "version": "2.11.1", 369 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", 370 | "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==" 371 | }, 372 | "node-forge": { 373 | "version": "0.7.6", 374 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", 375 | "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==" 376 | }, 377 | "node-webcrypto-ossl": { 378 | "version": "1.0.38", 379 | "resolved": "https://registry.npmjs.org/node-webcrypto-ossl/-/node-webcrypto-ossl-1.0.38.tgz", 380 | "integrity": "sha512-UiQcDiBDNzaZbP0WVgz4QvVTVI4uR4jrFAtOtFsKbDDNOMFWc9+3mVeiF1hVvdLlv3ILC0ODgs8Wp/hp7SMoLA==", 381 | "requires": { 382 | "mkdirp": "^0.5.1", 383 | "nan": "^2.10.0", 384 | "tslib": "^1.9.0", 385 | "webcrypto-core": "^0.1.22" 386 | } 387 | }, 388 | "once": { 389 | "version": "1.4.0", 390 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 391 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 392 | "dev": true, 393 | "requires": { 394 | "wrappy": "1" 395 | } 396 | }, 397 | "path-is-absolute": { 398 | "version": "1.0.1", 399 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 400 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 401 | "dev": true 402 | }, 403 | "path-parse": { 404 | "version": "1.0.6", 405 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 406 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 407 | "dev": true 408 | }, 409 | "reflect-metadata": { 410 | "version": "0.1.12", 411 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", 412 | "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", 413 | "dev": true 414 | }, 415 | "resolve": { 416 | "version": "1.8.1", 417 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", 418 | "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", 419 | "dev": true, 420 | "requires": { 421 | "path-parse": "^1.0.5" 422 | } 423 | }, 424 | "semver": { 425 | "version": "5.6.0", 426 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 427 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", 428 | "dev": true 429 | }, 430 | "sprintf-js": { 431 | "version": "1.0.3", 432 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 433 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 434 | "dev": true 435 | }, 436 | "strip-ansi": { 437 | "version": "3.0.1", 438 | "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 439 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 440 | "dev": true, 441 | "requires": { 442 | "ansi-regex": "^2.0.0" 443 | } 444 | }, 445 | "supports-color": { 446 | "version": "2.0.0", 447 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 448 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 449 | "dev": true 450 | }, 451 | "tslib": { 452 | "version": "1.9.3", 453 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 454 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" 455 | }, 456 | "tslint": { 457 | "version": "5.11.0", 458 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", 459 | "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", 460 | "dev": true, 461 | "requires": { 462 | "babel-code-frame": "^6.22.0", 463 | "builtin-modules": "^1.1.1", 464 | "chalk": "^2.3.0", 465 | "commander": "^2.12.1", 466 | "diff": "^3.2.0", 467 | "glob": "^7.1.1", 468 | "js-yaml": "^3.7.0", 469 | "minimatch": "^3.0.4", 470 | "resolve": "^1.3.2", 471 | "semver": "^5.3.0", 472 | "tslib": "^1.8.0", 473 | "tsutils": "^2.27.2" 474 | } 475 | }, 476 | "tslint-config-airbnb": { 477 | "version": "5.11.0", 478 | "resolved": "https://registry.npmjs.org/tslint-config-airbnb/-/tslint-config-airbnb-5.11.0.tgz", 479 | "integrity": "sha512-o2FhaQtxXi6FQ1v0T2n/rACNos6PhuKRmvemMpWxI+9NJn2OOlJ3+OtEmnCdoF7GPXT3Eyk+Q0q4P96flrPl3w==", 480 | "dev": true, 481 | "requires": { 482 | "tslint-consistent-codestyle": "^1.13.3", 483 | "tslint-eslint-rules": "^5.4.0", 484 | "tslint-microsoft-contrib": "~5.2.0" 485 | } 486 | }, 487 | "tslint-consistent-codestyle": { 488 | "version": "1.13.3", 489 | "resolved": "https://registry.npmjs.org/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.13.3.tgz", 490 | "integrity": "sha512-+ocXSNGHqUCUyTJsPhS7xqcC3qf6FyP4vd1jEaXaWaJ5NNN36gKZhqNt3nAWH/YgSV0tYaapjSWMbJQJmn/5MQ==", 491 | "dev": true, 492 | "requires": { 493 | "@fimbul/bifrost": "^0.11.0", 494 | "tslib": "^1.7.1", 495 | "tsutils": "^2.27.0" 496 | } 497 | }, 498 | "tslint-eslint-rules": { 499 | "version": "5.4.0", 500 | "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", 501 | "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", 502 | "dev": true, 503 | "requires": { 504 | "doctrine": "0.7.2", 505 | "tslib": "1.9.0", 506 | "tsutils": "^3.0.0" 507 | }, 508 | "dependencies": { 509 | "tslib": { 510 | "version": "1.9.0", 511 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", 512 | "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", 513 | "dev": true 514 | }, 515 | "tsutils": { 516 | "version": "3.2.0", 517 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.2.0.tgz", 518 | "integrity": "sha512-CvWEadl8VwlxOq6F3hfNbGrrRVSAjN2EPCEBgcbCUVDUxmwkV5254OGKsITNxDz8IGDQPAw7YJMtBHniHu2tbA==", 519 | "dev": true, 520 | "requires": { 521 | "tslib": "^1.8.1" 522 | } 523 | } 524 | } 525 | }, 526 | "tslint-microsoft-contrib": { 527 | "version": "5.2.1", 528 | "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz", 529 | "integrity": "sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==", 530 | "dev": true, 531 | "requires": { 532 | "tsutils": "^2.27.2 <2.29.0" 533 | }, 534 | "dependencies": { 535 | "tsutils": { 536 | "version": "2.28.0", 537 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", 538 | "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", 539 | "dev": true, 540 | "requires": { 541 | "tslib": "^1.8.1" 542 | } 543 | } 544 | } 545 | }, 546 | "tsutils": { 547 | "version": "2.29.0", 548 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 549 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 550 | "dev": true, 551 | "requires": { 552 | "tslib": "^1.8.1" 553 | } 554 | }, 555 | "typescript": { 556 | "version": "3.1.1", 557 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.1.tgz", 558 | "integrity": "sha512-Veu0w4dTc/9wlWNf2jeRInNodKlcdLgemvPsrNpfu5Pq39sgfFjvIIgTsvUHCoLBnMhPoUA+tFxsXjU6VexVRQ==" 559 | }, 560 | "uuid": { 561 | "version": "3.3.2", 562 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 563 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 564 | }, 565 | "webcrypto-core": { 566 | "version": "0.1.24", 567 | "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-0.1.24.tgz", 568 | "integrity": "sha512-Vj94XeM9RG/VzXV0iiLjQ+VccQQIlGwVTyLbqvwSldSWfEMRIOkA+NWB0XglROTGmhEIMUxVl6NDSP5E0HHJeA==", 569 | "requires": { 570 | "tslib": "^1.7.1" 571 | } 572 | }, 573 | "wrappy": { 574 | "version": "1.0.2", 575 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 576 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 577 | "dev": true 578 | } 579 | } 580 | } 581 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "uonet-sdk", 3 | "version": "1.0.0", 4 | "description": "Nieoficjalne SDK do e-dziennika UONET+", 5 | "main": "build/index.js", 6 | "types": "build/index.d.ts", 7 | "scripts": { 8 | "watch": "tsc --watch", 9 | "build": "tsc", 10 | "prepare": "npm run build" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/sential/uonet-sdk.git" 15 | }, 16 | "author": "sential", 17 | "license": "MIT", 18 | "bugs": { 19 | "url": "https://github.com/sential/uonet-sdk/issues" 20 | }, 21 | "homepage": "https://github.com/sential/uonet-sdk#readme", 22 | "devDependencies": { 23 | "tslint": "5.11.0", 24 | "tslint-config-airbnb": "5.11.0" 25 | }, 26 | "dependencies": { 27 | "@types/node": "10.12.0", 28 | "@types/node-forge": "0.7.6", 29 | "@types/uuid": "3.4.4", 30 | "axios": "0.18.0", 31 | "date-fns": "2.0.0-alpha.24", 32 | "node-forge": "0.7.6", 33 | "node-webcrypto-ossl": "1.0.38", 34 | "typescript": "3.1.1", 35 | "uuid": "3.3.2" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/api.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import { v1 as uuidv1 } from 'uuid'; 3 | 4 | import { Account, UONETPupil, UONETLesson, Lesson } from './models'; 5 | import { getRestApiURL, getRequest } from './utils/requests'; 6 | import { APP_VERSION } from './constants'; 7 | import { getUnixTime } from 'date-fns'; 8 | 9 | export class UONET { 10 | public accounts: Account[] = []; 11 | 12 | public async request(accountId: number, body: any, method: string) { 13 | try { 14 | const account = this.accounts.find(x => x.id === accountId); 15 | 16 | if (!account) { 17 | throw new Error("Couldn't find the account with given ID."); 18 | } 19 | 20 | const url = `${account.baseURL}/mobile-api/Uczen.v3.Uczen/${method}`; 21 | const req = await getRequest( 22 | { 23 | body, 24 | url, 25 | }, 26 | { 27 | key: account.certificate.key, 28 | pfx: account.certificate.pfx, 29 | }, 30 | ); 31 | 32 | const res = await axios(req); 33 | 34 | return res.data; 35 | } catch (e) { 36 | throw e; 37 | } 38 | } 39 | 40 | public async getTimetable(accountId: number, from: string, to: string) { 41 | try { 42 | const account = this.accounts.find(x => x.id === accountId); 43 | let data: UONETLesson[] = (await this.request( 44 | accountId, 45 | { 46 | IdOkresKlasyfikacyjny: account.periodId, 47 | IdUczen: account.id, 48 | IdOddzial: account.branchId, 49 | DataPoczatkowa: from, 50 | DataKoncowa: to, 51 | }, 52 | 'PlanLekcjiZeZmianami', 53 | )).Data; 54 | const dictionary = (await this.request(accountId, {}, 'Slowniki')).Data; 55 | 56 | data = data.sort((a, b) => { 57 | return a.NumerLekcji - b.NumerLekcji; 58 | }); 59 | 60 | const timetable: Lesson[] = data.map(item => { 61 | const teacher = dictionary.Nauczyciele.find( 62 | (x: any) => x.Id === item.IdPracownik, 63 | ); 64 | 65 | const hour = dictionary.PoryLekcji.find( 66 | (x: any) => x.Id === item.IdPoraLekcji, 67 | ); 68 | 69 | const start = new Date(`${item.DzienTekst} ${hour.PoczatekTekst}:00`); 70 | const end = new Date(`${item.DzienTekst} ${hour.KoniecTekst}:00`); 71 | 72 | const lesson: Lesson = { 73 | name: item.PrzedmiotNazwa, 74 | order: item.NumerLekcji, 75 | room: item.Sala, 76 | teacher: { 77 | firstName: teacher.Imie, 78 | lastName: teacher.Nazwisko, 79 | }, 80 | date: { 81 | start, 82 | end, 83 | }, 84 | note: item.AdnotacjaOZmianie, 85 | isForPupil: item.PlanUcznia, 86 | }; 87 | 88 | return lesson; 89 | }); 90 | 91 | return timetable; 92 | } catch (e) { 93 | throw e; 94 | } 95 | } 96 | 97 | public async login(pin: string, token: string, symbol: string) { 98 | try { 99 | const code = token.substring(0, 3); 100 | const url = await getRestApiURL(code); 101 | 102 | const req = await getRequest({ 103 | body: { 104 | PIN: parseInt(pin, 10), 105 | TokenKey: token, 106 | DeviceId: uuidv1(), 107 | DeviceName: 'uonet-api#uonet-api', 108 | DeviceNameUser: '', 109 | DeviceDescription: '', 110 | DeviceSystemType: 'Android', 111 | DeviceSystemVersion: '7.1.0', 112 | AppVersion: APP_VERSION, 113 | }, 114 | headers: { 115 | RequestMobileType: 'RegisterDevice', 116 | }, 117 | url: `${url}/${symbol}/mobile-api/Uczen.v3.UczenStart/Certyfikat`, 118 | }); 119 | 120 | const cert = await axios(req); 121 | 122 | if (cert.data.IsError) { 123 | console.log(req.data); 124 | throw new Error('UONET+ certificate obtaining failed'); 125 | } 126 | 127 | const { CertyfikatPfx, CertyfikatKlucz } = cert.data.TokenCert; 128 | 129 | const pupilList = await axios( 130 | await getRequest( 131 | { 132 | url: `${url}/${symbol}/mobile-api/Uczen.v3.UczenStart/ListaUczniow`, 133 | }, 134 | { 135 | key: CertyfikatKlucz, 136 | pfx: CertyfikatPfx, 137 | }, 138 | ), 139 | ); 140 | 141 | pupilList.data.Data.forEach((pupil: UONETPupil) => { 142 | const account: Account = { 143 | baseURL: `${url}/${symbol}/${pupil.JednostkaSprawozdawczaSymbol}`, 144 | id: pupil.Id, 145 | certificate: { 146 | key: CertyfikatKlucz, 147 | pfx: CertyfikatPfx, 148 | }, 149 | branchId: pupil.IdOddzial, 150 | periodId: pupil.IdOkresKlasyfikacyjny, 151 | }; 152 | 153 | this.accounts.push(account); 154 | }); 155 | } catch (err) { 156 | throw err; 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /src/constants/index.ts: -------------------------------------------------------------------------------- 1 | export const APP_VERSION = '18.4.1.388'; 2 | export const APP_NAME = 'VULCAN-Android-ModulUcznia'; 3 | export const PASSWORD = 'CE75EA598C7743AD9B0B7328DED85B06'; 4 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { UONET } from './api'; 2 | 3 | export { UONET }; 4 | -------------------------------------------------------------------------------- /src/models/account.ts: -------------------------------------------------------------------------------- 1 | import { Certificate } from '.'; 2 | 3 | export interface Account { 4 | id: number; 5 | branchId: number; 6 | periodId: number; 7 | baseURL: string; 8 | certificate: Certificate; 9 | } 10 | -------------------------------------------------------------------------------- /src/models/certificate.ts: -------------------------------------------------------------------------------- 1 | export interface Certificate { 2 | key: string; 3 | pfx: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/models/index.ts: -------------------------------------------------------------------------------- 1 | export * from './account'; 2 | export * from './certificate'; 3 | export * from './pupil'; 4 | export * from './request-base-data'; 5 | export * from './lesson'; 6 | -------------------------------------------------------------------------------- /src/models/lesson.ts: -------------------------------------------------------------------------------- 1 | export interface UONETLesson { 2 | Dzien: number; 3 | DzienTekst: string; 4 | NumerLekcji: number; 5 | IdPoraLekcji: number; 6 | IdPrzedmiot: number; 7 | PrzedmiotNazwa: string; 8 | PodzialSkrot: string; 9 | Sala: string; 10 | IdPracownik: number; 11 | IdPracownikWspomagajacy: number; 12 | IdPracownikOld: number; 13 | IdPracownikWspomagajacyOld: number; 14 | IdPlanLekcji: number; 15 | AdnotacjaOZmianie: string; 16 | PrzekreslonaNazwa: boolean; 17 | PogrubionaNazwa: boolean; 18 | PlanUcznia: boolean; 19 | } 20 | 21 | export interface Lesson { 22 | date: { 23 | start: Date; 24 | end: Date; 25 | }; 26 | order: number; 27 | name: string; 28 | room: string; 29 | teacher: { 30 | firstName: string; 31 | lastName: string; 32 | }; 33 | note: string; 34 | isForPupil: boolean; 35 | } 36 | -------------------------------------------------------------------------------- /src/models/pupil.ts: -------------------------------------------------------------------------------- 1 | export interface UONETPupil { 2 | JednostkaSprawozdawczaSymbol: string; 3 | Id: number; 4 | IdOddzial: number; 5 | IdOkresKlasyfikacyjny: number; 6 | } 7 | -------------------------------------------------------------------------------- /src/models/request-base-data.ts: -------------------------------------------------------------------------------- 1 | export interface RequestBaseData { 2 | body?: any; 3 | headers?: any; 4 | url: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/utils/encryption.ts: -------------------------------------------------------------------------------- 1 | import forge from 'node-forge'; 2 | 3 | // tslint:disable-next-line 4 | const Crypto = require("node-webcrypto-ossl"); 5 | 6 | const crypto = new Crypto(); 7 | 8 | export function signContent( 9 | content: string, 10 | certificate: string, 11 | password: string, 12 | ) { 13 | const p12Der = forge.util.decode64(certificate); 14 | const p12Asn1 = forge.asn1.fromDer(p12Der); 15 | const pkcs12 = forge.pkcs12.pkcs12FromAsn1(p12Asn1, false, password); 16 | 17 | return importCryptoKeyPkcs8(loadPrivateKey(pkcs12), true).then( 18 | (cryptoKey: any) => 19 | crypto.subtle 20 | .sign('RSASSA-PKCS1-v1_5', cryptoKey, stringToArrayBuffer(content)) 21 | .then((signature: ArrayBuffer) => { 22 | return forge.util.encode64(arrayBufferToString(signature)); 23 | }), 24 | ); 25 | } 26 | 27 | function arrayBufferToString(buffer: ArrayBuffer) { 28 | let binary = ''; 29 | const bytes = new Uint8Array(buffer); 30 | const len = bytes.byteLength; 31 | for (let i = 0; i < len; i += 1) { 32 | binary += String.fromCharCode(bytes[i]); 33 | } 34 | return binary; 35 | } 36 | 37 | function privateKeyToPkcs8(privateKey: ArrayBuffer) { 38 | // @ts-ignore 39 | const rsaPrivateKey = forge.pki.privateKeyToAsn1(privateKey); 40 | // @ts-ignore 41 | const privateKeyInfo = forge.pki.wrapRsaPrivateKey(rsaPrivateKey); 42 | const privateKeyInfoDer = forge.asn1.toDer(privateKeyInfo).getBytes(); 43 | return stringToArrayBuffer(privateKeyInfoDer); 44 | } 45 | 46 | function stringToArrayBuffer(data: string) { 47 | const arrBuff = new ArrayBuffer(data.length); 48 | const writer = new Uint8Array(arrBuff); 49 | for (let i = 0, len = data.length; i < len; i += 1) { 50 | writer[i] = data.charCodeAt(i); 51 | } 52 | 53 | return arrBuff; 54 | } 55 | 56 | function loadPrivateKey(pkcs12: forge.pkcs12.Pkcs12Pfx) { 57 | // load keypair and cert chain from safe content(s) 58 | for (let sci = 0; sci < pkcs12.safeContents.length; sci += 1) { 59 | const safeContents = pkcs12.safeContents[sci]; 60 | 61 | for (let sbi = 0; sbi < safeContents.safeBags.length; sbi += 1) { 62 | const safeBag = safeContents.safeBags[sbi]; 63 | 64 | // this bag has a private key 65 | if (safeBag.type === forge.pki.oids.keyBag) { 66 | // Found plain private key 67 | return safeBag.key; 68 | } 69 | if (safeBag.type === forge.pki.oids.pkcs8ShroudedKeyBag) { 70 | // found encrypted private key 71 | return safeBag.key; 72 | } 73 | if (safeBag.type === forge.pki.oids.certBag) { 74 | // this bag has a certificate... 75 | } 76 | } 77 | } 78 | } 79 | 80 | function importCryptoKeyPkcs8(privateKey: ArrayBuffer, extractable: boolean) { 81 | const privateKeyInfoDerBuff = privateKeyToPkcs8(privateKey); 82 | 83 | // Import the webcrypto key 84 | return crypto.subtle.importKey( 85 | 'pkcs8', 86 | privateKeyInfoDerBuff, 87 | { 88 | name: 'RSASSA-PKCS1-v1_5', 89 | hash: { 90 | name: 'SHA-1', 91 | }, 92 | }, 93 | extractable, 94 | ['sign'], 95 | ); 96 | } 97 | -------------------------------------------------------------------------------- /src/utils/requests.ts: -------------------------------------------------------------------------------- 1 | import { v4 as uuidv4 } from 'uuid'; 2 | import axios from 'axios'; 3 | 4 | import { RequestBaseData, Certificate } from '../models'; 5 | import { APP_VERSION, PASSWORD, APP_NAME } from '../constants'; 6 | import { getTimestamp } from './time'; 7 | import { signContent } from './encryption'; 8 | 9 | export const getRestApiURL = async (code: string) => { 10 | try { 11 | const urlList = await axios.get( 12 | 'https://komponenty.vulcan.net.pl/UonetPlusMobile/RoutingRules.txt', 13 | ); 14 | const urls = urlList.data.split(/\r\n/).map((e: string) => e.split(',')); 15 | const url = urls.filter( 16 | (e: string[]) => e[0] === code.substring(0, 3), 17 | )[0][1]; 18 | 19 | return url; 20 | } catch (err) { 21 | throw err; 22 | } 23 | }; 24 | 25 | export const getRequest = async ( 26 | data: RequestBaseData, 27 | certificate: Certificate = null, 28 | ) => { 29 | try { 30 | const requestBase = { 31 | data: { 32 | ...data.body, 33 | RemoteMobileTimeKey: getTimestamp(), 34 | TimeKey: getTimestamp() - 1, 35 | RequestId: uuidv4(), 36 | RemoteMobileAppVersion: APP_VERSION, 37 | RemoteMobileAppName: APP_NAME, 38 | }, 39 | headers: { 40 | ...data.headers, 41 | 'User-Agent': 'MobileUserAgent', 42 | 'Content-Type': 'application/json; charset=UTF-8', 43 | }, 44 | url: data.url, 45 | method: 'POST', 46 | }; 47 | 48 | if (certificate) { 49 | requestBase.headers.RequestCertificateKey = certificate.key; 50 | 51 | requestBase.headers.RequestSignatureValue = await signContent( 52 | JSON.stringify(requestBase.data), 53 | certificate.pfx, 54 | PASSWORD, 55 | ); 56 | } 57 | 58 | return requestBase; 59 | } catch (e) { 60 | throw e; 61 | } 62 | }; 63 | -------------------------------------------------------------------------------- /src/utils/time.ts: -------------------------------------------------------------------------------- 1 | import { getUnixTime } from 'date-fns'; 2 | 3 | export const getTimestamp = () => getUnixTime(new Date()); 4 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./build/", 4 | 5 | "noImplicitAny": true, 6 | 7 | "module": "commonjs", 8 | "target": "esnext", 9 | "declaration": true, 10 | "esModuleInterop": true, 11 | "moduleResolution": "node", 12 | 13 | "baseUrl": "./" 14 | }, 15 | "exclude": ["node_modules", "build"], 16 | "include": ["src/**/*"] 17 | } 18 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint-config-airbnb", 3 | "rules": { 4 | "import-name": ["off"], 5 | "ter-arrow-parens": ["off"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@fimbul/bifrost@^0.11.0": 6 | version "0.11.0" 7 | resolved "https://registry.yarnpkg.com/@fimbul/bifrost/-/bifrost-0.11.0.tgz#83cacc21464198b12e3cc1c2204ae6c6d7afd158" 8 | dependencies: 9 | "@fimbul/ymir" "^0.11.0" 10 | get-caller-file "^1.0.2" 11 | tslib "^1.8.1" 12 | tsutils "^2.24.0" 13 | 14 | "@fimbul/ymir@^0.11.0": 15 | version "0.11.0" 16 | resolved "https://registry.yarnpkg.com/@fimbul/ymir/-/ymir-0.11.0.tgz#892a01997f1f80c7e4e437cf5ca51c95994c136f" 17 | dependencies: 18 | inversify "^4.10.0" 19 | reflect-metadata "^0.1.12" 20 | tslib "^1.8.1" 21 | 22 | "@types/node-forge@0.7.6": 23 | version "0.7.6" 24 | resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-0.7.6.tgz#7d8c894f3ecdc61c82e76d60f9f66e766d1e48a9" 25 | dependencies: 26 | "@types/node" "*" 27 | 28 | "@types/node@*", "@types/node@10.12.0": 29 | version "10.12.0" 30 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.0.tgz#ea6dcbddbc5b584c83f06c60e82736d8fbb0c235" 31 | 32 | "@types/uuid@3.4.4": 33 | version "3.4.4" 34 | resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.4.tgz#7af69360fa65ef0decb41fd150bf4ca5c0cefdf5" 35 | dependencies: 36 | "@types/node" "*" 37 | 38 | ansi-regex@^2.0.0: 39 | version "2.1.1" 40 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 41 | 42 | ansi-styles@^2.2.1: 43 | version "2.2.1" 44 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 45 | 46 | ansi-styles@^3.2.1: 47 | version "3.2.1" 48 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 49 | dependencies: 50 | color-convert "^1.9.0" 51 | 52 | argparse@^1.0.7: 53 | version "1.0.10" 54 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 55 | dependencies: 56 | sprintf-js "~1.0.2" 57 | 58 | axios@0.18.0: 59 | version "0.18.0" 60 | resolved "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" 61 | dependencies: 62 | follow-redirects "^1.3.0" 63 | is-buffer "^1.1.5" 64 | 65 | babel-code-frame@^6.22.0: 66 | version "6.26.0" 67 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 68 | dependencies: 69 | chalk "^1.1.3" 70 | esutils "^2.0.2" 71 | js-tokens "^3.0.2" 72 | 73 | balanced-match@^1.0.0: 74 | version "1.0.0" 75 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 76 | 77 | brace-expansion@^1.1.7: 78 | version "1.1.11" 79 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 80 | dependencies: 81 | balanced-match "^1.0.0" 82 | concat-map "0.0.1" 83 | 84 | builtin-modules@^1.1.1: 85 | version "1.1.1" 86 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 87 | 88 | chalk@^1.1.3: 89 | version "1.1.3" 90 | resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 91 | dependencies: 92 | ansi-styles "^2.2.1" 93 | escape-string-regexp "^1.0.2" 94 | has-ansi "^2.0.0" 95 | strip-ansi "^3.0.0" 96 | supports-color "^2.0.0" 97 | 98 | chalk@^2.3.0: 99 | version "2.4.1" 100 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 101 | dependencies: 102 | ansi-styles "^3.2.1" 103 | escape-string-regexp "^1.0.5" 104 | supports-color "^5.3.0" 105 | 106 | color-convert@^1.9.0: 107 | version "1.9.3" 108 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 109 | dependencies: 110 | color-name "1.1.3" 111 | 112 | color-name@1.1.3: 113 | version "1.1.3" 114 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 115 | 116 | commander@^2.12.1: 117 | version "2.19.0" 118 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" 119 | 120 | concat-map@0.0.1: 121 | version "0.0.1" 122 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 123 | 124 | date-fns@2.0.0-alpha.24: 125 | version "2.0.0-alpha.24" 126 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.0.0-alpha.24.tgz#2988c137c72275af29d7d21cc53eb52b3a8c2586" 127 | 128 | debug@=3.1.0: 129 | version "3.1.0" 130 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 131 | dependencies: 132 | ms "2.0.0" 133 | 134 | diff@^3.2.0: 135 | version "3.5.0" 136 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 137 | 138 | doctrine@0.7.2: 139 | version "0.7.2" 140 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" 141 | dependencies: 142 | esutils "^1.1.6" 143 | isarray "0.0.1" 144 | 145 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 146 | version "1.0.5" 147 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 148 | 149 | esprima@^4.0.0: 150 | version "4.0.1" 151 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 152 | 153 | esutils@^1.1.6: 154 | version "1.1.6" 155 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" 156 | 157 | esutils@^2.0.2: 158 | version "2.0.2" 159 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 160 | 161 | follow-redirects@^1.3.0: 162 | version "1.5.9" 163 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.9.tgz#c9ed9d748b814a39535716e531b9196a845d89c6" 164 | dependencies: 165 | debug "=3.1.0" 166 | 167 | fs.realpath@^1.0.0: 168 | version "1.0.0" 169 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 170 | 171 | get-caller-file@^1.0.2: 172 | version "1.0.3" 173 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" 174 | 175 | glob@^7.1.1: 176 | version "7.1.3" 177 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 178 | dependencies: 179 | fs.realpath "^1.0.0" 180 | inflight "^1.0.4" 181 | inherits "2" 182 | minimatch "^3.0.4" 183 | once "^1.3.0" 184 | path-is-absolute "^1.0.0" 185 | 186 | has-ansi@^2.0.0: 187 | version "2.0.0" 188 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 189 | dependencies: 190 | ansi-regex "^2.0.0" 191 | 192 | has-flag@^3.0.0: 193 | version "3.0.0" 194 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 195 | 196 | inflight@^1.0.4: 197 | version "1.0.6" 198 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 199 | dependencies: 200 | once "^1.3.0" 201 | wrappy "1" 202 | 203 | inherits@2: 204 | version "2.0.3" 205 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 206 | 207 | inversify@^4.10.0: 208 | version "4.14.0" 209 | resolved "https://registry.yarnpkg.com/inversify/-/inversify-4.14.0.tgz#393c1f86ee92aef0592eb0e493623b9d88dfb376" 210 | 211 | is-buffer@^1.1.5: 212 | version "1.1.6" 213 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 214 | 215 | isarray@0.0.1: 216 | version "0.0.1" 217 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 218 | 219 | js-tokens@^3.0.2: 220 | version "3.0.2" 221 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 222 | 223 | js-yaml@^3.7.0: 224 | version "3.13.1" 225 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 226 | dependencies: 227 | argparse "^1.0.7" 228 | esprima "^4.0.0" 229 | 230 | minimatch@^3.0.4: 231 | version "3.0.4" 232 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 233 | dependencies: 234 | brace-expansion "^1.1.7" 235 | 236 | minimist@0.0.8: 237 | version "0.0.8" 238 | resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 239 | 240 | mkdirp@^0.5.1: 241 | version "0.5.1" 242 | resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 243 | dependencies: 244 | minimist "0.0.8" 245 | 246 | ms@2.0.0: 247 | version "2.0.0" 248 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 249 | 250 | nan@^2.10.0: 251 | version "2.11.1" 252 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" 253 | 254 | node-forge@0.7.6: 255 | version "0.7.6" 256 | resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" 257 | 258 | node-webcrypto-ossl@1.0.38: 259 | version "1.0.38" 260 | resolved "https://registry.yarnpkg.com/node-webcrypto-ossl/-/node-webcrypto-ossl-1.0.38.tgz#5b281e020ee90879b995fb2c9232db1eea0fda63" 261 | dependencies: 262 | mkdirp "^0.5.1" 263 | nan "^2.10.0" 264 | tslib "^1.9.0" 265 | webcrypto-core "^0.1.22" 266 | 267 | once@^1.3.0: 268 | version "1.4.0" 269 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 270 | dependencies: 271 | wrappy "1" 272 | 273 | path-is-absolute@^1.0.0: 274 | version "1.0.1" 275 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 276 | 277 | path-parse@^1.0.5: 278 | version "1.0.6" 279 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 280 | 281 | reflect-metadata@^0.1.12: 282 | version "0.1.12" 283 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" 284 | 285 | resolve@^1.3.2: 286 | version "1.8.1" 287 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 288 | dependencies: 289 | path-parse "^1.0.5" 290 | 291 | semver@^5.3.0: 292 | version "5.6.0" 293 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 294 | 295 | sprintf-js@~1.0.2: 296 | version "1.0.3" 297 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 298 | 299 | strip-ansi@^3.0.0: 300 | version "3.0.1" 301 | resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 302 | dependencies: 303 | ansi-regex "^2.0.0" 304 | 305 | supports-color@^2.0.0: 306 | version "2.0.0" 307 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 308 | 309 | supports-color@^5.3.0: 310 | version "5.5.0" 311 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 312 | dependencies: 313 | has-flag "^3.0.0" 314 | 315 | tslib@1.9.0: 316 | version "1.9.0" 317 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" 318 | 319 | tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: 320 | version "1.9.3" 321 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 322 | 323 | tslint-config-airbnb@5.11.0: 324 | version "5.11.0" 325 | resolved "https://registry.yarnpkg.com/tslint-config-airbnb/-/tslint-config-airbnb-5.11.0.tgz#4477fa64e2d8b4282b43666d6a34925c766cc949" 326 | dependencies: 327 | tslint-consistent-codestyle "^1.13.3" 328 | tslint-eslint-rules "^5.4.0" 329 | tslint-microsoft-contrib "~5.2.0" 330 | 331 | tslint-consistent-codestyle@^1.13.3: 332 | version "1.13.3" 333 | resolved "https://registry.yarnpkg.com/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.13.3.tgz#763e8575accc19f17b7d0369ead382bdbf78fd5b" 334 | dependencies: 335 | "@fimbul/bifrost" "^0.11.0" 336 | tslib "^1.7.1" 337 | tsutils "^2.27.0" 338 | 339 | tslint-eslint-rules@^5.4.0: 340 | version "5.4.0" 341 | resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5" 342 | dependencies: 343 | doctrine "0.7.2" 344 | tslib "1.9.0" 345 | tsutils "^3.0.0" 346 | 347 | tslint-microsoft-contrib@~5.2.0: 348 | version "5.2.1" 349 | resolved "https://registry.yarnpkg.com/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz#a6286839f800e2591d041ea2800c77487844ad81" 350 | dependencies: 351 | tsutils "^2.27.2 <2.29.0" 352 | 353 | tslint@5.11.0: 354 | version "5.11.0" 355 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" 356 | dependencies: 357 | babel-code-frame "^6.22.0" 358 | builtin-modules "^1.1.1" 359 | chalk "^2.3.0" 360 | commander "^2.12.1" 361 | diff "^3.2.0" 362 | glob "^7.1.1" 363 | js-yaml "^3.7.0" 364 | minimatch "^3.0.4" 365 | resolve "^1.3.2" 366 | semver "^5.3.0" 367 | tslib "^1.8.0" 368 | tsutils "^2.27.2" 369 | 370 | tsutils@^2.24.0, tsutils@^2.27.0, tsutils@^2.27.2: 371 | version "2.29.0" 372 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 373 | dependencies: 374 | tslib "^1.8.1" 375 | 376 | "tsutils@^2.27.2 <2.29.0": 377 | version "2.28.0" 378 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.28.0.tgz#6bd71e160828f9d019b6f4e844742228f85169a1" 379 | dependencies: 380 | tslib "^1.8.1" 381 | 382 | tsutils@^3.0.0: 383 | version "3.1.0" 384 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.1.0.tgz#9136fdbc347799941db4eb326af4dcb81454820e" 385 | dependencies: 386 | tslib "^1.8.1" 387 | 388 | typescript@3.1.1: 389 | version "3.1.1" 390 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.1.tgz#3362ba9dd1e482ebb2355b02dfe8bcd19a2c7c96" 391 | 392 | uuid@3.3.2: 393 | version "3.3.2" 394 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 395 | 396 | webcrypto-core@^0.1.22: 397 | version "0.1.24" 398 | resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-0.1.24.tgz#c16d9c80331928c808a949eed0e60f39c42e9aab" 399 | dependencies: 400 | tslib "^1.7.1" 401 | 402 | wrappy@1: 403 | version "1.0.2" 404 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 405 | --------------------------------------------------------------------------------