@mytmpvpn/mytmpvpn-common 2.3.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ export declare class MyTmpVpnError extends Error {
2
+ constructor(msg: string);
3
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MyTmpVpnError = void 0;
4
+ class MyTmpVpnError extends Error {
5
+ constructor(msg) {
6
+ super(msg); // 'Error' breaks prototype chain here
7
+ // See: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget
8
+ Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain
9
+ }
10
+ }
11
+ exports.MyTmpVpnError = MyTmpVpnError;
@@ -1,2 +1,3 @@
1
1
  export * as utils from './utils';
2
2
  export * as models from './models';
3
+ export * as errors from './errors';
package/dist/src/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.models = exports.utils = void 0;
3
+ exports.errors = exports.models = exports.utils = void 0;
4
4
  exports.utils = require("./utils");
5
5
  exports.models = require("./models");
6
+ exports.errors = require("./errors");
@@ -20,4 +20,5 @@ interface getUserVpnFromParams {
20
20
  }
21
21
  declare function newUserVpn({ userId, region, version, ...rest }: newUserVpnParams): UserVpn;
22
22
  declare function getUserVpnFrom({ userId, vpnId, version, ...rest }: getUserVpnFromParams): UserVpn;
23
- export { type UserVpn, newUserVpn, getUserVpnFrom };
23
+ declare function jsonToUserVpn(json: any): UserVpn;
24
+ export { type UserVpn, newUserVpn, getUserVpnFrom, jsonToUserVpn };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getUserVpnFrom = exports.newUserVpn = void 0;
3
+ exports.jsonToUserVpn = exports.getUserVpnFrom = exports.newUserVpn = void 0;
4
4
  const vpn = require("./vpn");
5
5
  const INITIAL_VERSION = 0;
6
6
  function newUserVpn({ userId, region, version = INITIAL_VERSION, ...rest }) {
@@ -19,3 +19,18 @@ function getUserVpnFrom({ userId, vpnId, version = INITIAL_VERSION, ...rest }) {
19
19
  };
20
20
  }
21
21
  exports.getUserVpnFrom = getUserVpnFrom;
22
+ function jsonToUserVpn(json) {
23
+ const parsed = JSON.parse(json, (key, value) => {
24
+ if (key === 'createdAt') {
25
+ return new Date(value);
26
+ }
27
+ return value;
28
+ });
29
+ const result = {
30
+ userId: parsed.userId,
31
+ version: parsed.version,
32
+ vpn: parsed.vpn
33
+ };
34
+ return parsed;
35
+ }
36
+ exports.jsonToUserVpn = jsonToUserVpn;
@@ -12,10 +12,12 @@ declare function rank(state: VpnState): number;
12
12
  declare enum VpnType {
13
13
  WireGuard = "wireguard"
14
14
  }
15
+ declare const MIN_DELETE_AFTER: number;
16
+ declare const MAX_DELETE_AFTER: number;
15
17
  interface VpnConfig {
16
18
  type: VpnType;
17
19
  maxPeanuts: number;
18
- terminationDate?: Date;
20
+ deleteAfter?: number;
19
21
  }
20
22
  interface VpnMetrics {
21
23
  duration: number;
@@ -30,7 +32,8 @@ interface Vpn {
30
32
  state: VpnState;
31
33
  }
32
34
  declare function getVpnConfigTypes(): VpnType[];
35
+ declare function throwIfNotValidDeleteAfter(deleteAfter: number | undefined): void;
33
36
  declare function newVpn(region: string, config: VpnConfig, state: VpnState): Vpn;
34
37
  declare function getVpnFrom(vpnId: string, state: VpnState, config: VpnConfig): Vpn;
35
38
  declare function vpnIdToWgFileName(vpnId: string): string;
36
- export { VpnState, type VpnMetrics, VpnType, type VpnConfig, type Vpn, rank, newVpn, getVpnFrom, getVpnConfigTypes, vpnIdToWgFileName };
39
+ export { VpnState, type VpnMetrics, VpnType, type VpnConfig, type Vpn, rank, newVpn, getVpnFrom, getVpnConfigTypes, vpnIdToWgFileName, MIN_DELETE_AFTER, MAX_DELETE_AFTER, throwIfNotValidDeleteAfter };
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.vpnIdToWgFileName = exports.getVpnConfigTypes = exports.getVpnFrom = exports.newVpn = exports.rank = exports.VpnType = exports.VpnState = void 0;
3
+ exports.throwIfNotValidDeleteAfter = exports.MAX_DELETE_AFTER = exports.MIN_DELETE_AFTER = exports.vpnIdToWgFileName = exports.getVpnConfigTypes = exports.getVpnFrom = exports.newVpn = exports.rank = exports.VpnType = exports.VpnState = void 0;
4
+ const errors_1 = require("../errors");
4
5
  var VpnState;
5
6
  (function (VpnState) {
6
7
  VpnState["Failed"] = "Failed";
@@ -23,6 +24,10 @@ var VpnType;
23
24
  VpnType["WireGuard"] = "wireguard";
24
25
  })(VpnType || (VpnType = {}));
25
26
  exports.VpnType = VpnType;
27
+ const MIN_DELETE_AFTER = 5 * 60; // Minimum is 5 minutes
28
+ exports.MIN_DELETE_AFTER = MIN_DELETE_AFTER;
29
+ const MAX_DELETE_AFTER = 24 * 60 * 60; // Maximum is 24 hours
30
+ exports.MAX_DELETE_AFTER = MAX_DELETE_AFTER;
26
31
  function getVpnConfigTypes() {
27
32
  return Object.values(VpnType).filter((item) => {
28
33
  return isNaN(Number(item));
@@ -32,27 +37,37 @@ exports.getVpnConfigTypes = getVpnConfigTypes;
32
37
  function throwIfNotValidVpnId(vpnId) {
33
38
  // e.g: YYYYMMDDHHmmssmss@az-test-7
34
39
  if (!/\d{4}[01]\d[0-3]\d[0-2]\d[0-5]\d[0-5]\d\d{3}@[a-z]{2}-[a-z]+-\d/.test(vpnId)) {
35
- throw new Error(`Incorrect vpnId: \'${vpnId}\'`);
40
+ throw new errors_1.MyTmpVpnError(`Incorrect vpnId: \'${vpnId}\'`);
36
41
  }
37
42
  }
38
- function throwIfNotValidTerminationDate(terminationDate) {
39
- // Make sure the given date is not in the past
40
- if (terminationDate.getTime() < new Date().getTime()) {
41
- throw new Error(`TerminationDate must be in the future: \'${terminationDate}\'`);
43
+ function throwIfNotValidDeleteAfter(deleteAfter) {
44
+ if (deleteAfter === undefined) {
45
+ return;
46
+ }
47
+ if (isNaN(deleteAfter)) {
48
+ return;
49
+ }
50
+ if (!isFinite(deleteAfter)) {
51
+ throw new errors_1.MyTmpVpnError(`deleteAfter must be finite: ${deleteAfter}`);
52
+ }
53
+ if (deleteAfter < MIN_DELETE_AFTER) {
54
+ throw new errors_1.MyTmpVpnError(`deleteAfter must be greater than ${MIN_DELETE_AFTER}: ${deleteAfter}`);
55
+ }
56
+ if (deleteAfter > MAX_DELETE_AFTER) {
57
+ throw new errors_1.MyTmpVpnError(`deleteAfter must be lesser than ${MAX_DELETE_AFTER}: ${deleteAfter}`);
42
58
  }
43
59
  }
60
+ exports.throwIfNotValidDeleteAfter = throwIfNotValidDeleteAfter;
44
61
  function newVpn(region, config, state) {
45
62
  // e.g: ap-northeast-3
46
63
  if (!/[a-z]{2}-[a-z]+-[1-9]+/.test(region)) {
47
- throw new Error(`Incorrect region: \'${region}\'`);
64
+ throw new errors_1.MyTmpVpnError(`Incorrect region: \'${region}\'`);
48
65
  }
49
66
  const createdAt = new Date();
50
67
  const vpnId = `${dateToId(createdAt)}@${region}`;
51
68
  // Assert we will be able to deserialize later on...
52
69
  throwIfNotValidVpnId(vpnId);
53
- if (config.terminationDate) {
54
- throwIfNotValidTerminationDate(config.terminationDate);
55
- }
70
+ throwIfNotValidDeleteAfter(config.deleteAfter);
56
71
  return {
57
72
  vpnId,
58
73
  createdAt,
@@ -64,9 +79,10 @@ function newVpn(region, config, state) {
64
79
  exports.newVpn = newVpn;
65
80
  function getVpnFrom(vpnId, state, config) {
66
81
  throwIfNotValidVpnId(vpnId);
82
+ throwIfNotValidDeleteAfter(config.deleteAfter);
67
83
  const tokens = vpnId.split('@');
68
84
  if (tokens.length !== 2) {
69
- throw new Error(`Incorrect vpnId: ${vpnId}`);
85
+ throw new errors_1.MyTmpVpnError(`Incorrect vpnId: ${vpnId}`);
70
86
  }
71
87
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
72
88
  const createdAt = idToDate(tokens[0]);
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const uservpn_1 = require("../src/models/uservpn");
4
+ const errors_1 = require("../src/errors");
3
5
  const vpn_1 = require("../src/models/vpn");
4
6
  describe('Testing VpnState', () => {
5
7
  it('should check that all VpnState are ordered properly', async () => {
@@ -14,11 +16,11 @@ describe('Testing VpnState', () => {
14
16
  describe('Testing Vpn constructors', () => {
15
17
  it('Should shout when regions is empty', async () => {
16
18
  expect(() => (0, vpn_1.newVpn)('', { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard }, vpn_1.VpnState.Created))
17
- .toThrow(new Error("Incorrect region: \'\'"));
19
+ .toThrow(new errors_1.MyTmpVpnError("Incorrect region: \'\'"));
18
20
  });
19
21
  it('Should shout when regions is bad format', async () => {
20
22
  expect(() => (0, vpn_1.newVpn)('foo', { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard }, vpn_1.VpnState.Created))
21
- .toThrow(new Error("Incorrect region: \'foo\'"));
23
+ .toThrow(new errors_1.MyTmpVpnError("Incorrect region: \'foo\'"));
22
24
  });
23
25
  it('Should create vpn with all mandatory fields set', async () => {
24
26
  const vpn = (0, vpn_1.newVpn)('az-test-7', { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard }, vpn_1.VpnState.Created);
@@ -29,56 +31,109 @@ describe('Testing Vpn constructors', () => {
29
31
  expect(vpn.vpnId).toBeDefined();
30
32
  });
31
33
  it('Should create vpn with optional fields set', async () => {
32
- const terminationDate = new Date(new Date().getTime() + 3600 * 1000);
34
+ const deleteAfter = vpn_1.MIN_DELETE_AFTER;
33
35
  const vpn = (0, vpn_1.newVpn)('az-test-7', {
34
36
  maxPeanuts: -1,
35
37
  type: vpn_1.VpnType.WireGuard,
36
- terminationDate
38
+ deleteAfter: deleteAfter
37
39
  }, vpn_1.VpnState.Created);
38
40
  expect(vpn.createdAt).toBeDefined();
39
41
  expect(vpn.region).toEqual('az-test-7');
40
42
  expect(vpn.state).toEqual(vpn_1.VpnState.Created);
41
- expect(vpn.config).toEqual({ maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, terminationDate });
43
+ expect(vpn.config).toEqual({ maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, deleteAfter: deleteAfter });
44
+ expect(vpn.vpnId).toBeDefined();
45
+ });
46
+ it('Should create vpn with deleteAfter set to NaN', async () => {
47
+ const deleteAfter = Number.NaN;
48
+ const vpn = (0, vpn_1.newVpn)('az-test-7', {
49
+ maxPeanuts: -1,
50
+ type: vpn_1.VpnType.WireGuard,
51
+ deleteAfter: deleteAfter
52
+ }, vpn_1.VpnState.Created);
53
+ expect(vpn.createdAt).toBeDefined();
54
+ expect(vpn.region).toEqual('az-test-7');
55
+ expect(vpn.state).toEqual(vpn_1.VpnState.Created);
56
+ expect(vpn.config).toEqual({ maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, deleteAfter: deleteAfter });
42
57
  expect(vpn.vpnId).toBeDefined();
43
58
  });
44
59
  it('Should deserialize a vpn with all mandatory fields set', async () => {
45
- const terminationDate = new Date(new Date().getTime() + 3600 * 1000);
46
- const vpn = (0, vpn_1.getVpnFrom)('20030902012345678@az-test-7', vpn_1.VpnState.Created, { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, terminationDate });
60
+ const deleteAfter = vpn_1.MIN_DELETE_AFTER;
61
+ const vpn = (0, vpn_1.getVpnFrom)('20030902012345678@az-test-7', vpn_1.VpnState.Created, { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, deleteAfter: deleteAfter });
47
62
  expect(vpn.createdAt).toEqual(new Date('2003-09-02T01:23:45.678Z'));
48
63
  expect(vpn.region).toEqual('az-test-7');
49
64
  expect(vpn.state).toEqual(vpn_1.VpnState.Created);
50
- expect(vpn.config).toEqual({ maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, terminationDate });
65
+ expect(vpn.config).toEqual({ maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, deleteAfter: deleteAfter });
51
66
  expect(vpn.vpnId).toBeDefined();
52
67
  });
68
+ it('Should deserialize a vpn with deleteAfter set to NaN', async () => {
69
+ const deleteAfter = Number.NaN;
70
+ const vpn = (0, vpn_1.getVpnFrom)('20030902012345678@az-test-7', vpn_1.VpnState.Created, { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, deleteAfter: deleteAfter });
71
+ expect(vpn.createdAt).toEqual(new Date('2003-09-02T01:23:45.678Z'));
72
+ expect(vpn.region).toEqual('az-test-7');
73
+ expect(vpn.state).toEqual(vpn_1.VpnState.Created);
74
+ expect(vpn.config).toEqual({ maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, deleteAfter: deleteAfter });
75
+ expect(vpn.vpnId).toBeDefined();
76
+ });
77
+ it('Should deserialize a json vpn with all fields set', async () => {
78
+ const originalVpn = (0, uservpn_1.newUserVpn)({
79
+ userId: 'myId',
80
+ region: 'az-test-7',
81
+ version: 1,
82
+ config: {
83
+ maxPeanuts: -1,
84
+ type: vpn_1.VpnType.WireGuard,
85
+ deleteAfter: vpn_1.MIN_DELETE_AFTER
86
+ },
87
+ state: vpn_1.VpnState.Created,
88
+ });
89
+ const json = JSON.stringify(originalVpn);
90
+ const userVpn = (0, uservpn_1.jsonToUserVpn)(json);
91
+ expect(userVpn).toEqual(originalVpn);
92
+ });
53
93
  it('Should shout when vpnId is empty', async () => {
54
94
  expect(() => (0, vpn_1.getVpnFrom)('', vpn_1.VpnState.Created, { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard }))
55
- .toThrow(new Error("Incorrect vpnId: \'\'"));
95
+ .toThrow(new errors_1.MyTmpVpnError("Incorrect vpnId: \'\'"));
56
96
  });
57
97
  it('Should shout when vpnId has bad format', async () => {
58
98
  expect(() => (0, vpn_1.getVpnFrom)('foo', vpn_1.VpnState.Created, { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard }))
59
- .toThrow(new Error("Incorrect vpnId: \'foo\'"));
99
+ .toThrow(new errors_1.MyTmpVpnError("Incorrect vpnId: \'foo\'"));
60
100
  });
61
101
  it('Should shout when vpnId does not hold a region in good format', async () => {
62
102
  expect(() => (0, vpn_1.getVpnFrom)('20030902012345678@test', vpn_1.VpnState.Created, { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard }))
63
- .toThrow(new Error("Incorrect vpnId: \'20030902012345678@test\'"));
103
+ .toThrow(new errors_1.MyTmpVpnError("Incorrect vpnId: \'20030902012345678@test\'"));
104
+ });
105
+ it('Should shout when deleteAfter is lower than MIN', async () => {
106
+ const wrongDeleteAfter = vpn_1.MIN_DELETE_AFTER - 1;
107
+ expect(() => (0, vpn_1.newVpn)('az-test-7', { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, deleteAfter: wrongDeleteAfter }, vpn_1.VpnState.Created))
108
+ .toThrow(new errors_1.MyTmpVpnError(`deleteAfter must be greater than ${vpn_1.MIN_DELETE_AFTER}: ${wrongDeleteAfter}`));
109
+ });
110
+ it('Should shout when deleteAfter is greater than MAX', async () => {
111
+ const wrongDeleteAfter = vpn_1.MAX_DELETE_AFTER + 1;
112
+ expect(() => (0, vpn_1.newVpn)('az-test-7', { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, deleteAfter: wrongDeleteAfter }, vpn_1.VpnState.Created))
113
+ .toThrow(new errors_1.MyTmpVpnError(`deleteAfter must be lesser than ${vpn_1.MAX_DELETE_AFTER}: ${wrongDeleteAfter}`));
114
+ });
115
+ it('Should shout when deleteAfter is positive infinity', async () => {
116
+ const wrongdeleteAfter = Number.POSITIVE_INFINITY;
117
+ expect(() => (0, vpn_1.newVpn)('az-test-7', { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, deleteAfter: wrongdeleteAfter }, vpn_1.VpnState.Created))
118
+ .toThrow(new errors_1.MyTmpVpnError(`deleteAfter must be finite: ${wrongdeleteAfter}`));
64
119
  });
65
- it('Should shout when termination is in the past', async () => {
66
- const wrongTerminationDate = new Date(new Date().getTime() - 3600 * 1000);
67
- expect(() => (0, vpn_1.newVpn)('az-test-7', { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, terminationDate: wrongTerminationDate }, vpn_1.VpnState.Created))
68
- .toThrow(new Error(`TerminationDate must be in the future: \'${wrongTerminationDate}\'`));
120
+ it('Should shout when deleteAfter is negative infinity', async () => {
121
+ const wrongdeleteAfter = Number.NEGATIVE_INFINITY;
122
+ expect(() => (0, vpn_1.newVpn)('az-test-7', { maxPeanuts: -1, type: vpn_1.VpnType.WireGuard, deleteAfter: wrongdeleteAfter }, vpn_1.VpnState.Created))
123
+ .toThrow(new errors_1.MyTmpVpnError(`deleteAfter must be finite: ${wrongdeleteAfter}`));
69
124
  });
70
125
  });
71
126
  describe('Testing vpnId to Wireguard file name functions ', () => {
72
127
  it('Should shout when vpnId is empty', async () => {
73
128
  expect(() => (0, vpn_1.vpnIdToWgFileName)(''))
74
- .toThrow(new Error("Incorrect vpnId: \'\'"));
129
+ .toThrow(new errors_1.MyTmpVpnError("Incorrect vpnId: \'\'"));
75
130
  });
76
131
  it('Should shout when vpnId is bad format', async () => {
77
132
  expect(() => (0, vpn_1.vpnIdToWgFileName)('foo'))
78
- .toThrow(new Error("Incorrect vpnId: \'foo\'"));
133
+ .toThrow(new errors_1.MyTmpVpnError("Incorrect vpnId: \'foo\'"));
79
134
  });
80
135
  it('Should shout when region has bad format', async () => {
81
136
  expect(() => (0, vpn_1.vpnIdToWgFileName)('20030902012345678@test'))
82
- .toThrow(new Error("Incorrect vpnId: \'20030902012345678@test\'"));
137
+ .toThrow(new errors_1.MyTmpVpnError("Incorrect vpnId: \'20030902012345678@test\'"));
83
138
  });
84
139
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mytmpvpn/mytmpvpn-common",
3
- "version": "2.3.0",
3
+ "version": "3.1.0",
4
4
  "description": "Common library for all MyTmpVpn related projects",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [