@leapdev/app-platform 0.1.0-beta.4 → 0.1.0-beta.5

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.
Files changed (142) hide show
  1. package/package.json +15 -15
  2. package/src/index.d.ts +25 -0
  3. package/src/index.js +42 -0
  4. package/src/index.js.map +1 -0
  5. package/src/lib/app-platform.d.ts +37 -0
  6. package/src/lib/app-platform.js +231 -0
  7. package/src/lib/app-platform.js.map +1 -0
  8. package/src/lib/environment/environment.d.ts +37 -0
  9. package/src/lib/environment/environment.dictionary.d.ts +4 -0
  10. package/src/lib/environment/environment.dictionary.js +30 -0
  11. package/src/lib/environment/environment.dictionary.js.map +1 -0
  12. package/src/lib/environment/environment.js +17 -0
  13. package/src/lib/environment/environment.js.map +1 -0
  14. package/src/lib/environment/{index.ts → index.d.ts} +2 -2
  15. package/src/lib/environment/index.js +9 -0
  16. package/src/lib/environment/index.js.map +1 -0
  17. package/src/lib/environment/leap/env.dev.au.config.d.ts +32 -0
  18. package/src/lib/environment/leap/env.dev.au.config.js +36 -0
  19. package/src/lib/environment/leap/env.dev.au.config.js.map +1 -0
  20. package/src/lib/environment/leap/env.live.au.config.d.ts +32 -0
  21. package/src/lib/environment/leap/env.live.au.config.js +36 -0
  22. package/src/lib/environment/leap/env.live.au.config.js.map +1 -0
  23. package/src/lib/environment/leap/env.live.ca.config.d.ts +32 -0
  24. package/src/lib/environment/leap/env.live.ca.config.js +36 -0
  25. package/src/lib/environment/leap/env.live.ca.config.js.map +1 -0
  26. package/src/lib/environment/leap/env.live.nz.config.d.ts +32 -0
  27. package/src/lib/environment/leap/env.live.nz.config.js +36 -0
  28. package/src/lib/environment/leap/env.live.nz.config.js.map +1 -0
  29. package/src/lib/environment/leap/env.live.uk.config.d.ts +32 -0
  30. package/src/lib/environment/leap/env.live.uk.config.js +36 -0
  31. package/src/lib/environment/leap/env.live.uk.config.js.map +1 -0
  32. package/src/lib/environment/leap/env.live.us.config.d.ts +32 -0
  33. package/src/lib/environment/leap/env.live.us.config.js +36 -0
  34. package/src/lib/environment/leap/env.live.us.config.js.map +1 -0
  35. package/src/lib/environment/leap/env.liveb.au.config.d.ts +32 -0
  36. package/src/lib/environment/leap/env.liveb.au.config.js +36 -0
  37. package/src/lib/environment/leap/env.liveb.au.config.js.map +1 -0
  38. package/src/lib/environment/leap/env.test.au.config.d.ts +32 -0
  39. package/src/lib/environment/leap/env.test.au.config.js +36 -0
  40. package/src/lib/environment/leap/env.test.au.config.js.map +1 -0
  41. package/src/lib/environment/leap/env.test.ca.config.d.ts +32 -0
  42. package/src/lib/environment/leap/env.test.ca.config.js +36 -0
  43. package/src/lib/environment/leap/env.test.ca.config.js.map +1 -0
  44. package/src/lib/environment/leap/env.test.nz.config.d.ts +32 -0
  45. package/src/lib/environment/leap/env.test.nz.config.js +36 -0
  46. package/src/lib/environment/leap/env.test.nz.config.js.map +1 -0
  47. package/src/lib/environment/leap/env.test.uk.config.d.ts +32 -0
  48. package/src/lib/environment/leap/env.test.uk.config.js +36 -0
  49. package/src/lib/environment/leap/env.test.uk.config.js.map +1 -0
  50. package/src/lib/environment/leap/env.test.us.config.d.ts +32 -0
  51. package/src/lib/environment/leap/env.test.us.config.js +36 -0
  52. package/src/lib/environment/leap/env.test.us.config.js.map +1 -0
  53. package/src/lib/functions/helpers.d.ts +5 -0
  54. package/src/lib/functions/helpers.js +95 -0
  55. package/src/lib/functions/helpers.js.map +1 -0
  56. package/src/lib/functions/xml.d.ts +2 -0
  57. package/src/lib/functions/xml.js +41 -0
  58. package/src/lib/functions/xml.js.map +1 -0
  59. package/src/lib/models/calc-api.model.d.ts +57 -0
  60. package/src/lib/models/calc-api.model.js +39 -0
  61. package/src/lib/models/calc-api.model.js.map +1 -0
  62. package/src/lib/models/constants/index.d.ts +28 -0
  63. package/src/lib/models/constants/index.js +32 -0
  64. package/src/lib/models/constants/index.js.map +1 -0
  65. package/src/lib/models/{index.ts → index.d.ts} +1 -1
  66. package/src/lib/models/index.js +5 -0
  67. package/src/lib/models/index.js.map +1 -0
  68. package/src/lib/models/leap-events.model.d.ts +56 -0
  69. package/src/lib/models/leap-events.model.js +71 -0
  70. package/src/lib/models/leap-events.model.js.map +1 -0
  71. package/src/lib/models/leap.model.d.ts +65 -0
  72. package/src/lib/models/leap.model.js +29 -0
  73. package/src/lib/models/leap.model.js.map +1 -0
  74. package/src/lib/models/signalr.model.d.ts +21 -0
  75. package/src/lib/models/signalr.model.js +3 -0
  76. package/src/lib/models/signalr.model.js.map +1 -0
  77. package/src/lib/services/auth/auth.service.d.ts +13 -0
  78. package/src/lib/services/auth/auth.service.js +185 -0
  79. package/src/lib/services/auth/auth.service.js.map +1 -0
  80. package/src/lib/services/calc-api/calc-api-service.interface.d.ts +4 -0
  81. package/src/lib/services/calc-api/calc-api-service.interface.js +3 -0
  82. package/src/lib/services/calc-api/calc-api-service.interface.js.map +1 -0
  83. package/src/lib/services/calc-api/calc-word.service.d.ts +10 -0
  84. package/src/lib/services/calc-api/calc-word.service.js +63 -0
  85. package/src/lib/services/calc-api/calc-word.service.js.map +1 -0
  86. package/src/lib/services/calc-api/promise-helper.function.d.ts +2 -0
  87. package/src/lib/services/calc-api/promise-helper.function.js +32 -0
  88. package/src/lib/services/calc-api/promise-helper.function.js.map +1 -0
  89. package/src/lib/services/custom-xml-part.service.d.ts +5 -0
  90. package/src/lib/services/custom-xml-part.service.js +269 -0
  91. package/src/lib/services/custom-xml-part.service.js.map +1 -0
  92. package/src/lib/services/document/document.service.d.ts +16 -0
  93. package/src/lib/services/document/document.service.js +32 -0
  94. package/src/lib/services/document/document.service.js.map +1 -0
  95. package/src/lib/services/{index.ts → index.d.ts} +5 -10
  96. package/src/lib/services/index.js +9 -0
  97. package/src/lib/services/index.js.map +1 -0
  98. package/src/lib/services/leap-events.service.d.ts +26 -0
  99. package/src/lib/services/leap-events.service.js +357 -0
  100. package/src/lib/services/leap-events.service.js.map +1 -0
  101. package/src/lib/services/logger/logger.service.d.ts +10 -0
  102. package/src/lib/services/logger/logger.service.js +39 -0
  103. package/src/lib/services/logger/logger.service.js.map +1 -0
  104. package/src/lib/services/signalr/signalr.service.d.ts +9 -0
  105. package/src/lib/services/signalr/signalr.service.js +93 -0
  106. package/src/lib/services/signalr/signalr.service.js.map +1 -0
  107. package/.eslintrc.json +0 -25
  108. package/project.json +0 -27
  109. package/src/index.ts +0 -44
  110. package/src/lib/app-platform.ts +0 -270
  111. package/src/lib/environment/environment.dictionary.ts +0 -28
  112. package/src/lib/environment/environment.ts +0 -44
  113. package/src/lib/environment/leap/env.dev.au.config.ts +0 -33
  114. package/src/lib/environment/leap/env.live.au.config.ts +0 -32
  115. package/src/lib/environment/leap/env.live.ca.config.ts +0 -32
  116. package/src/lib/environment/leap/env.live.nz.config.ts +0 -32
  117. package/src/lib/environment/leap/env.live.uk.config.ts +0 -32
  118. package/src/lib/environment/leap/env.live.us.config.ts +0 -32
  119. package/src/lib/environment/leap/env.liveb.au.config.ts +0 -32
  120. package/src/lib/environment/leap/env.test.au.config.ts +0 -33
  121. package/src/lib/environment/leap/env.test.ca.config.ts +0 -33
  122. package/src/lib/environment/leap/env.test.nz.config.ts +0 -33
  123. package/src/lib/environment/leap/env.test.uk.config.ts +0 -33
  124. package/src/lib/environment/leap/env.test.us.config.ts +0 -33
  125. package/src/lib/functions/helpers.ts +0 -100
  126. package/src/lib/functions/xml.ts +0 -41
  127. package/src/lib/models/calc-api.model.ts +0 -74
  128. package/src/lib/models/constants/index.ts +0 -29
  129. package/src/lib/models/leap-events.model.ts +0 -79
  130. package/src/lib/models/leap.model.ts +0 -78
  131. package/src/lib/models/signalr.model.ts +0 -22
  132. package/src/lib/services/auth/auth.service.ts +0 -219
  133. package/src/lib/services/calc-api/calc-api-service.interface.ts +0 -12
  134. package/src/lib/services/calc-api/calc-word.service.ts +0 -117
  135. package/src/lib/services/calc-api/promise-helper.function.ts +0 -26
  136. package/src/lib/services/custom-xml-part.service.ts +0 -340
  137. package/src/lib/services/document/document.service.ts +0 -33
  138. package/src/lib/services/leap-events.service.ts +0 -489
  139. package/src/lib/services/logger/logger.service.ts +0 -42
  140. package/src/lib/services/signalr/signalr.service.ts +0 -88
  141. package/tsconfig.json +0 -20
  142. package/tsconfig.lib.json +0 -12
@@ -0,0 +1,21 @@
1
+ export type SignalRMessage<T> = {
2
+ action: string;
3
+ payload: T;
4
+ sessionId: string;
5
+ requestId: string;
6
+ source: string;
7
+ };
8
+ export type SignalRInitData = {
9
+ code: string;
10
+ codeChallenge: string;
11
+ contentModeEnabled: boolean;
12
+ country: string;
13
+ countryCode: number;
14
+ hostType: string;
15
+ hostVersion: string;
16
+ environment: string;
17
+ firmId: string;
18
+ staffId: string;
19
+ userId: string;
20
+ userName: string;
21
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=signalr.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signalr.model.js","sourceRoot":"","sources":["../../../../../../packages/app-platform/src/lib/models/signalr.model.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { LEAPUser } from '../../models/leap.model';
2
+ export declare class AuthService {
3
+ #private;
4
+ constructor(data: {
5
+ code: string;
6
+ codeVerifier: any;
7
+ clientId: string;
8
+ env: string;
9
+ });
10
+ init(): Promise<boolean>;
11
+ getRefreshedAccessToken(force?: boolean): Promise<string>;
12
+ getLEAPUser(): LEAPUser | undefined;
13
+ }
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ var _AuthService_instances, _AuthService_code, _AuthService_codeVerifier, _AuthService_clientId, _AuthService_env, _AuthService_authHost, _AuthService_user, _AuthService_accessToken, _AuthService_refreshToken, _AuthService_exchangeAuthCodeForAccessToken, _AuthService_getUserInfo, _AuthService_exchangeRefreshTokenForAccessToken, _AuthService_xhr, _AuthService_decodeAccessToken;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AuthService = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const constants_1 = require("../../models/constants");
7
+ class AuthService {
8
+ constructor(data) {
9
+ _AuthService_instances.add(this);
10
+ _AuthService_code.set(this, void 0);
11
+ _AuthService_codeVerifier.set(this, void 0);
12
+ _AuthService_clientId.set(this, void 0);
13
+ _AuthService_env.set(this, void 0);
14
+ _AuthService_authHost.set(this, void 0);
15
+ _AuthService_user.set(this, void 0);
16
+ _AuthService_accessToken.set(this, void 0);
17
+ _AuthService_refreshToken.set(this, void 0);
18
+ tslib_1.__classPrivateFieldSet(this, _AuthService_code, data.code, "f");
19
+ tslib_1.__classPrivateFieldSet(this, _AuthService_codeVerifier, data.codeVerifier, "f");
20
+ tslib_1.__classPrivateFieldSet(this, _AuthService_clientId, data.clientId, "f");
21
+ tslib_1.__classPrivateFieldSet(this, _AuthService_env, data.env.toLowerCase(), "f");
22
+ tslib_1.__classPrivateFieldSet(this, _AuthService_authHost, tslib_1.__classPrivateFieldGet(this, _AuthService_env, "f") === 'live'
23
+ ? 'https://auth.leap.services'
24
+ : 'https://auth-test.leap.services', "f");
25
+ }
26
+ init() {
27
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
28
+ try {
29
+ const data = yield tslib_1.__classPrivateFieldGet(this, _AuthService_instances, "m", _AuthService_exchangeAuthCodeForAccessToken).call(this);
30
+ tslib_1.__classPrivateFieldSet(this, _AuthService_accessToken, data.access_token, "f");
31
+ tslib_1.__classPrivateFieldSet(this, _AuthService_refreshToken, data.refresh_token, "f");
32
+ tslib_1.__classPrivateFieldSet(this, _AuthService_user, yield tslib_1.__classPrivateFieldGet(this, _AuthService_instances, "m", _AuthService_getUserInfo).call(this), "f");
33
+ return true;
34
+ }
35
+ catch (e) {
36
+ console.log('[AuthService] unable to init');
37
+ return true;
38
+ }
39
+ });
40
+ }
41
+ getRefreshedAccessToken(force) {
42
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
43
+ if (tslib_1.__classPrivateFieldGet(this, _AuthService_accessToken, "f") === undefined || !tslib_1.__classPrivateFieldGet(this, _AuthService_accessToken, "f")) {
44
+ return '';
45
+ }
46
+ else {
47
+ const decoded = tslib_1.__classPrivateFieldGet(this, _AuthService_instances, "m", _AuthService_decodeAccessToken).call(this, tslib_1.__classPrivateFieldGet(this, _AuthService_accessToken, "f"));
48
+ if (force ||
49
+ (!!decoded &&
50
+ (decoded.exp - constants_1.constants.tokenSecondsBeforeExpire) * 1000 <
51
+ Date.now())) {
52
+ const data = yield tslib_1.__classPrivateFieldGet(this, _AuthService_instances, "m", _AuthService_exchangeRefreshTokenForAccessToken).call(this);
53
+ if (data) {
54
+ tslib_1.__classPrivateFieldSet(this, _AuthService_accessToken, data.access_token, "f");
55
+ tslib_1.__classPrivateFieldSet(this, _AuthService_refreshToken, data.refresh_token, "f");
56
+ }
57
+ return tslib_1.__classPrivateFieldGet(this, _AuthService_accessToken, "f");
58
+ }
59
+ else {
60
+ return tslib_1.__classPrivateFieldGet(this, _AuthService_accessToken, "f");
61
+ }
62
+ }
63
+ });
64
+ }
65
+ getLEAPUser() {
66
+ return tslib_1.__classPrivateFieldGet(this, _AuthService_user, "f");
67
+ }
68
+ }
69
+ exports.AuthService = AuthService;
70
+ _AuthService_code = new WeakMap(), _AuthService_codeVerifier = new WeakMap(), _AuthService_clientId = new WeakMap(), _AuthService_env = new WeakMap(), _AuthService_authHost = new WeakMap(), _AuthService_user = new WeakMap(), _AuthService_accessToken = new WeakMap(), _AuthService_refreshToken = new WeakMap(), _AuthService_instances = new WeakSet(), _AuthService_exchangeAuthCodeForAccessToken = function _AuthService_exchangeAuthCodeForAccessToken() {
71
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
72
+ return new Promise((resolve, reject) => {
73
+ tslib_1.__classPrivateFieldGet(this, _AuthService_instances, "m", _AuthService_xhr).call(this, {
74
+ method: 'POST',
75
+ endpoint: `${tslib_1.__classPrivateFieldGet(this, _AuthService_authHost, "f")}/oauth/token`,
76
+ options: {
77
+ body: {
78
+ grant_type: 'authorization_code',
79
+ code: tslib_1.__classPrivateFieldGet(this, _AuthService_code, "f"),
80
+ code_verifier: tslib_1.__classPrivateFieldGet(this, _AuthService_codeVerifier, "f"),
81
+ client_id: tslib_1.__classPrivateFieldGet(this, _AuthService_clientId, "f"),
82
+ redirect_uri: constants_1.constants.fourdRedirectUrl,
83
+ },
84
+ },
85
+ accessToken: undefined,
86
+ }, (response, status) => {
87
+ if (status === 200) {
88
+ return resolve(response);
89
+ }
90
+ else
91
+ return reject(response);
92
+ });
93
+ });
94
+ });
95
+ }, _AuthService_getUserInfo = function _AuthService_getUserInfo() {
96
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
97
+ return new Promise((resolve, reject) => {
98
+ tslib_1.__classPrivateFieldGet(this, _AuthService_instances, "m", _AuthService_xhr).call(this, {
99
+ method: 'GET',
100
+ endpoint: `${tslib_1.__classPrivateFieldGet(this, _AuthService_authHost, "f")}/api/userinfo`,
101
+ options: {},
102
+ accessToken: tslib_1.__classPrivateFieldGet(this, _AuthService_accessToken, "f"),
103
+ }, (response, status) => {
104
+ if (status === 200) {
105
+ return resolve(response);
106
+ }
107
+ else
108
+ return reject(response);
109
+ });
110
+ });
111
+ });
112
+ }, _AuthService_exchangeRefreshTokenForAccessToken = function _AuthService_exchangeRefreshTokenForAccessToken() {
113
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
114
+ return new Promise((resolve, reject) => {
115
+ if (!tslib_1.__classPrivateFieldGet(this, _AuthService_refreshToken, "f")) {
116
+ resolve(null);
117
+ }
118
+ else {
119
+ tslib_1.__classPrivateFieldGet(this, _AuthService_instances, "m", _AuthService_xhr).call(this, {
120
+ method: 'POST',
121
+ endpoint: `${tslib_1.__classPrivateFieldGet(this, _AuthService_authHost, "f")}/oauth/token`,
122
+ options: {
123
+ body: {
124
+ grant_type: 'refresh_token',
125
+ refresh_token: tslib_1.__classPrivateFieldGet(this, _AuthService_refreshToken, "f"),
126
+ code_verifier: tslib_1.__classPrivateFieldGet(this, _AuthService_codeVerifier, "f"),
127
+ client_id: tslib_1.__classPrivateFieldGet(this, _AuthService_clientId, "f"),
128
+ },
129
+ },
130
+ accessToken: undefined,
131
+ }, (response, status) => {
132
+ if (status === 200) {
133
+ return resolve(response);
134
+ }
135
+ else
136
+ return reject(response);
137
+ });
138
+ }
139
+ });
140
+ });
141
+ }, _AuthService_xhr = function _AuthService_xhr(params, onload) {
142
+ const { method, endpoint, accessToken } = params;
143
+ let { options } = params;
144
+ options = Object.assign({
145
+ contentType: 'application/json',
146
+ accessControlAllowOrigin: '*',
147
+ body: undefined,
148
+ }, options);
149
+ const xhr = new XMLHttpRequest();
150
+ xhr.open(method, endpoint, true);
151
+ xhr.setRequestHeader('Content-type', options.contentType);
152
+ xhr.setRequestHeader('Access-Control-Allow-Origin', options.accessControlAllowOrigin);
153
+ if (accessToken)
154
+ xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
155
+ xhr.onload = () => {
156
+ try {
157
+ let resp;
158
+ if (xhr.response)
159
+ resp = JSON.parse(xhr.response);
160
+ onload(resp, xhr.status);
161
+ }
162
+ catch (e) {
163
+ onload(xhr.response, xhr.status);
164
+ }
165
+ };
166
+ if (options.body)
167
+ options.body = JSON.stringify(options.body);
168
+ xhr.send(options.body);
169
+ }, _AuthService_decodeAccessToken = function _AuthService_decodeAccessToken(accessToken) {
170
+ if (!accessToken) {
171
+ return undefined;
172
+ }
173
+ const payload = accessToken.split('.')[1];
174
+ if (payload) {
175
+ try {
176
+ const result = window.atob(payload);
177
+ return JSON.parse(result);
178
+ }
179
+ catch (e) {
180
+ throw Error('Fail to decode access token.');
181
+ }
182
+ }
183
+ return undefined;
184
+ };
185
+ //# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../../../../../packages/app-platform/src/lib/services/auth/auth.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { EvaluatePathsRequest } from '../../models/calc-api.model';
2
+ export interface ICalcApiService {
3
+ evaluatePaths(request: EvaluatePathsRequest): Promise<Array<any> | null>;
4
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=calc-api-service.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calc-api-service.interface.js","sourceRoot":"","sources":["../../../../../../../packages/app-platform/src/lib/services/calc-api/calc-api-service.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { EvaluatePathsRequest, EvaluatePathsResponse } from '../../models/calc-api.model';
2
+ import { LeapEventsService } from '../leap-events.service';
3
+ import { LoggerService } from '../logger/logger.service';
4
+ import { ICalcApiService } from './calc-api-service.interface';
5
+ export declare class CalcWordService implements ICalcApiService {
6
+ private leapEventsService;
7
+ private loggerService;
8
+ constructor(leapEventsService: LeapEventsService, loggerService: LoggerService);
9
+ evaluatePaths(request: EvaluatePathsRequest): Promise<Array<EvaluatePathsResponse> | null>;
10
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CalcWordService = void 0;
4
+ const leap_events_model_1 = require("../../models/leap-events.model");
5
+ const promise_helper_function_1 = require("./promise-helper.function");
6
+ class CalcWordService {
7
+ constructor(leapEventsService, loggerService) {
8
+ this.leapEventsService = leapEventsService;
9
+ this.loggerService = loggerService;
10
+ }
11
+ evaluatePaths(request) {
12
+ let subscriptionId;
13
+ // Check for empty matterFields - don't bother hitting the Local DocBuilder API in this case
14
+ if (request == null || (request.paths && request.paths.length === 0)) {
15
+ return Promise.resolve(null);
16
+ }
17
+ return new Promise((resolve, reject) => {
18
+ Promise.resolve(() => {
19
+ this.loggerService.log('[CalcApiWordService] (evaluatePaths) Evaluating paths on Local Calc API');
20
+ })
21
+ .then(() => {
22
+ const id = new Date().getTime().toString();
23
+ return this.leapEventsService.addEvent({
24
+ id,
25
+ correlationId: null,
26
+ eventType: leap_events_model_1.LeapEventType.CalcApiRequest,
27
+ action: leap_events_model_1.LeapEventAction.Calc_EvaluatePaths,
28
+ data: request
29
+ });
30
+ })
31
+ .then(event => {
32
+ this.loggerService.log('[CalcApiWordService] LeapEvent EvaluatePaths request sent');
33
+ // Subscribe
34
+ const leapEventResponseHandlerPromise = new Promise((innerResolve, innerReject) => {
35
+ subscriptionId = this.leapEventsService.subscribe(event.id, leap_events_model_1.LeapEventType.CalcApiResponse, leap_events_model_1.LeapEventAction.Calc_EvaluatePathsResponse, (leapEvent) => this.leapEventsService.handleLeapEventResponse(leapEvent, { resolve: innerResolve, reject: innerReject }));
36
+ });
37
+ return (0, promise_helper_function_1.timeout)(leapEventResponseHandlerPromise, 5000);
38
+ })
39
+ .then((result) => {
40
+ // Return result
41
+ resolve(result);
42
+ })
43
+ .catch((error) => {
44
+ this.loggerService.error(`[CalcApiWordService] evaluatePaths() failed: ${error}`);
45
+ reject(error);
46
+ })
47
+ .then(() => {
48
+ // Unsubscribe
49
+ return this.leapEventsService.unsubscribe(subscriptionId);
50
+ })
51
+ .then((unsubscribeSuccess) => {
52
+ if (unsubscribeSuccess === true) {
53
+ this.loggerService.log(`[CalcApiWordService] (evaluatePaths) Successfully unsubscribed ${subscriptionId}`);
54
+ }
55
+ else {
56
+ this.loggerService.warn(`[CalcApiWordService] (evaluatePaths) Failed to unsubscribe from ${subscriptionId}`);
57
+ }
58
+ });
59
+ });
60
+ }
61
+ }
62
+ exports.CalcWordService = CalcWordService;
63
+ //# sourceMappingURL=calc-word.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calc-word.service.js","sourceRoot":"","sources":["../../../../../../../packages/app-platform/src/lib/services/calc-api/calc-word.service.ts"],"names":[],"mappings":";;;AACA,sEAA2F;AAI3F,uEAAoD;AAEpD,MAAa,eAAe;IAE1B,YACU,iBAAoC,EACpC,aAA4B;QAD5B,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,kBAAa,GAAb,aAAa,CAAe;IAClC,CAAC;IAEL,aAAa,CAAC,OAA6B;QACzC,IAAI,cAAsB,CAAC;QAE3B,4FAA4F;QAC5F,IAAI,OAAO,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE;YACpE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC9B;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;gBACnB,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,yEAAyE,CAC1E,CAAC;YACJ,CAAC,CAAC;iBACD,IAAI,CAAC,GAAG,EAAE;gBACT,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;gBAC3C,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;oBACrC,EAAE;oBACF,aAAa,EAAE,IAAI;oBACnB,SAAS,EAAE,iCAAa,CAAC,cAAc;oBACvC,MAAM,EAAE,mCAAe,CAAC,kBAAkB;oBAC1C,IAAI,EAAE,OAAO;iBACd,CAAC,CAAC;YACL,CAAC,CAAC;iBACD,IAAI,CAAC,KAAK,CAAC,EAAE;gBACZ,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;gBAEpF,YAAY;gBACZ,MAAM,+BAA+B,GAAG,IAAI,OAAO,CAA+B,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE;oBAC9G,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAC/C,KAAK,CAAC,EAAE,EACR,iCAAa,CAAC,eAAe,EAC7B,mCAAe,CAAC,0BAA0B,EAC1C,CAAC,SAAoB,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CACtE,SAAS,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,CAC1D,CACF,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,OAAO,IAAA,iCAAO,EAAC,+BAA+B,EAAE,IAAI,CAAC,CAAC;YACxD,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,gBAAgB;gBAChB,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE;gBACpB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,gDAAgD,KAAK,EAAE,CAAC,CAAC;gBAClF,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC;iBACD,IAAI,CAAC,GAAG,EAAE;gBACT,cAAc;gBACd,OAAO,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YAC5D,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,kBAA2B,EAAE,EAAE;gBACpC,IAAI,kBAAkB,KAAK,IAAI,EAAE;oBAC/B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,kEAAkE,cAAc,EAAE,CAAC,CAAC;iBAC5G;qBAAM;oBACL,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mEAAmE,cAAc,EAAE,CAAC,CAAC;iBAC9G;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AArED,0CAqEC"}
@@ -0,0 +1,2 @@
1
+ export declare function sleep(duration: number): Promise<void>;
2
+ export declare function timeout<T>(promise: Promise<T>, duration: number): Promise<T>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.timeout = exports.sleep = void 0;
4
+ /*
5
+ Return a promise that resolves after duration milliseconds
6
+ */
7
+ function sleep(duration) {
8
+ return new Promise(function (resolve) {
9
+ setTimeout(() => {
10
+ resolve();
11
+ }, duration);
12
+ });
13
+ }
14
+ exports.sleep = sleep;
15
+ /*
16
+ Return a promise that rejects after duration milliseconds
17
+ */
18
+ function timeout(promise, duration) {
19
+ if (duration === null || duration <= 0) {
20
+ return promise;
21
+ }
22
+ else {
23
+ const timeoutPromise = new Promise((resolve, reject) => {
24
+ setTimeout(() => {
25
+ reject(`Timed out after ${duration}ms`);
26
+ }, duration);
27
+ });
28
+ return Promise.race([promise, timeoutPromise]);
29
+ }
30
+ }
31
+ exports.timeout = timeout;
32
+ //# sourceMappingURL=promise-helper.function.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promise-helper.function.js","sourceRoot":"","sources":["../../../../../../../packages/app-platform/src/lib/services/calc-api/promise-helper.function.ts"],"names":[],"mappings":";;;AAAA;;EAEE;AACF,SAAgB,KAAK,CAAC,QAAgB;IACpC,OAAO,IAAI,OAAO,CAAO,UAAU,OAAO;QACxC,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,QAAQ,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAND,sBAMC;AAED;;EAEE;AACF,SAAgB,OAAO,CAAI,OAAmB,EAAE,QAAgB;IAC9D,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,IAAI,CAAC,EAAE;QACtC,OAAO,OAAO,CAAC;KAChB;SAAM;QACL,MAAM,cAAc,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxD,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,CAAC,mBAAmB,QAAQ,IAAI,CAAC,CAAC;YAC1C,CAAC,EAAE,QAAQ,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,IAAI,CAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;KACnD;AACH,CAAC;AAXD,0BAWC"}
@@ -0,0 +1,5 @@
1
+ export declare const getDataByNamespace: (namespace: string, retries?: number) => Promise<any>;
2
+ export declare const updateXmlDataByNamespace: (namespace: string, data: string, rootTagName: string) => Promise<void>;
3
+ export declare const addHandlerForCustomXmlPart: (namespace: string, eventType: Office.EventType, handler: any) => Promise<void | null>;
4
+ export declare const getChildNodes: (node: Office.CustomXmlNode, xPath?: string) => Promise<Array<Office.CustomXmlNode>>;
5
+ export declare const getNodeText: (node: Office.CustomXmlNode | null) => Promise<string>;
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ /// <reference types="office-js" />
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.getNodeText = exports.getChildNodes = exports.addHandlerForCustomXmlPart = exports.updateXmlDataByNamespace = exports.getDataByNamespace = void 0;
5
+ const helpers_1 = require("../functions/helpers");
6
+ const xml_1 = require("../functions/xml");
7
+ const retryTimes = 5;
8
+ const getCustomXmlPartsByNamespace = (namespace) => {
9
+ const officeDocument = Office.context.document;
10
+ if (officeDocument) {
11
+ const officeCustomXmlParts = officeDocument.customXmlParts;
12
+ //todo: use this format instead of promisifyAsync
13
+ return new Promise((resolve) => {
14
+ officeCustomXmlParts.getByNamespaceAsync(namespace, (result) => {
15
+ resolve(result.value);
16
+ });
17
+ });
18
+ }
19
+ else {
20
+ return Promise.resolve(null);
21
+ }
22
+ };
23
+ //todo: remove all "any" reference in the project
24
+ const getCustomXmlPartByNamespace = (namespace) => {
25
+ return getCustomXmlPartsByNamespace(namespace)
26
+ .then((customXmlParts) => {
27
+ if (customXmlParts != null) {
28
+ // We have something
29
+ if (Array.isArray(customXmlParts)) {
30
+ if (customXmlParts.length > 0) {
31
+ return customXmlParts[0]; // Happy path
32
+ }
33
+ else {
34
+ return null; // No error, but no matching custom XML part either
35
+ }
36
+ }
37
+ else {
38
+ // We have something, but it's not an array
39
+ return customXmlParts;
40
+ }
41
+ }
42
+ return null; // No error, but no matching custom XML part either
43
+ })
44
+ .catch((error) => {
45
+ console.error(error, `[CustomXmlPartService] (getCustomXmlPartByNamespace) Failed to get custom XML part by namespace`);
46
+ return null;
47
+ });
48
+ };
49
+ const getCustomXmlPartData = (partOrNamespace) => {
50
+ return new Promise((resolve, reject) => {
51
+ return new Promise((innerResolve) => {
52
+ if (typeof partOrNamespace === 'string') {
53
+ innerResolve(getCustomXmlPartByNamespace(partOrNamespace));
54
+ }
55
+ else {
56
+ return innerResolve(partOrNamespace);
57
+ }
58
+ })
59
+ .then((customXmlPart) => {
60
+ if (customXmlPart != null) {
61
+ const getXmlAsync = (0, helpers_1.promisifyAsync)(customXmlPart.getXmlAsync.bind(customXmlPart));
62
+ return getXmlAsync({});
63
+ }
64
+ else {
65
+ return null;
66
+ }
67
+ })
68
+ .then((result) => {
69
+ resolve((0, xml_1.toObj)(result));
70
+ })
71
+ .catch((error) => {
72
+ console.error(error, `[CustomXmlPartService] (getCustomXmlPartData) Failed to get custom XML part data`);
73
+ reject(error);
74
+ });
75
+ });
76
+ };
77
+ const getNodes = (customXmlPart, xPath = '/*') => {
78
+ const getNodes = (0, helpers_1.promisifyAsync)(customXmlPart.getNodesAsync.bind(customXmlPart));
79
+ return getNodes(xPath);
80
+ };
81
+ const setNodeXml = (node, xml) => {
82
+ const setXml = (0, helpers_1.promisifyAsync)(node.setXmlAsync.bind(node));
83
+ return setXml(xml, {});
84
+ };
85
+ const updateCustomXmlPart = (customXmlPart, xml, rootTagName) => {
86
+ rootTagName = rootTagName || '';
87
+ const promises = [];
88
+ // If custom XML part exists, replace it
89
+ return getNodes(customXmlPart)
90
+ .then((nodes) => {
91
+ for (let i = 0; i < nodes.length; i++) {
92
+ const node = nodes[i];
93
+ if (node &&
94
+ node.baseName &&
95
+ node.baseName.toUpperCase() === rootTagName.toUpperCase()) {
96
+ // Case-insensitive match
97
+ const promise = setNodeXml(node, xml)
98
+ .then(() => {
99
+ console.log('[CustomXmlPartService] updateCustomXmlPart succeeded');
100
+ })
101
+ .catch((error) => {
102
+ console.error(error, '[CustomXmlPartService] updateCustomXmlPart failed');
103
+ return Promise.reject(error);
104
+ });
105
+ promises.push(promise);
106
+ }
107
+ else {
108
+ console.log(`Could not find ${rootTagName} in the custom XML part`);
109
+ }
110
+ }
111
+ })
112
+ .then(() => {
113
+ return Promise.all(promises);
114
+ })
115
+ .then(() => {
116
+ return Promise.resolve();
117
+ });
118
+ };
119
+ const addCustomXmlPart = (objOrXml, options) => {
120
+ return new Promise((resolve, reject) => {
121
+ Promise.resolve()
122
+ .then(() => {
123
+ // Setup values
124
+ let obj; //todo: check this obj
125
+ let xml;
126
+ options = options || { rootTagName: '' };
127
+ if (typeof objOrXml === 'string' || objOrXml instanceof String) {
128
+ obj = (0, xml_1.toObj)(objOrXml);
129
+ xml = objOrXml;
130
+ }
131
+ else {
132
+ obj = objOrXml;
133
+ xml = (0, xml_1.toXml)(objOrXml, options.rootTagName, options);
134
+ }
135
+ const officeDocument = Office.context.document;
136
+ const officeCustomXmlParts = officeDocument.customXmlParts;
137
+ const add = (0, helpers_1.promisifyAsync)(officeCustomXmlParts.addAsync.bind(officeCustomXmlParts));
138
+ return add(xml, {});
139
+ })
140
+ .then((customXmlPart) => {
141
+ if (customXmlPart == null) {
142
+ // TODO
143
+ }
144
+ resolve();
145
+ })
146
+ .catch((error) => {
147
+ console.error(error, `[CustomXmlPartService] (addCustomXmlPart) Failed to add custom XML part`);
148
+ reject(error);
149
+ });
150
+ });
151
+ };
152
+ const updateCustomXmlPartData = (partOrNamespace, objOrXml, options) => {
153
+ return new Promise((resolve, reject) => {
154
+ return new Promise((innerResolve) => {
155
+ if (typeof partOrNamespace === 'string' || partOrNamespace instanceof String) {
156
+ innerResolve(getCustomXmlPartByNamespace(partOrNamespace));
157
+ }
158
+ else {
159
+ return innerResolve(partOrNamespace);
160
+ }
161
+ })
162
+ .then((customXmlPart) => {
163
+ // Setup values
164
+ let obj;
165
+ let xml;
166
+ options = options || { rootTagName: '' };
167
+ if (typeof objOrXml === 'string' || objOrXml instanceof String) {
168
+ obj = (0, xml_1.toObj)(objOrXml);
169
+ xml = objOrXml;
170
+ }
171
+ else {
172
+ obj = objOrXml;
173
+ xml = (0, xml_1.toXml)(objOrXml, options.rootTagName, options);
174
+ }
175
+ if (customXmlPart != null) {
176
+ return updateCustomXmlPart(customXmlPart, xml, options.rootTagName);
177
+ }
178
+ else {
179
+ return addCustomXmlPart(xml, options);
180
+ }
181
+ })
182
+ .then(() => {
183
+ resolve(true);
184
+ })
185
+ .catch((error) => {
186
+ console.error(error, `[CustomXmlPartService] (updateCustomXmlPartData) Failed to update ` +
187
+ `${typeof partOrNamespace === 'string' ? partOrNamespace : ''} custom XML part`);
188
+ reject(error);
189
+ });
190
+ });
191
+ };
192
+ const retryUpdateCustomXmlPartData = (namespace, data, options, retries = retryTimes) => {
193
+ const { rootTagName } = options;
194
+ return new Promise((resolve, reject) => {
195
+ console.log(`[CustomXmlPartService] Updating ${namespace} tag ${rootTagName}`);
196
+ updateCustomXmlPartData(namespace, data, options)
197
+ .then(() => {
198
+ resolve();
199
+ })
200
+ .catch((error) => {
201
+ if (retries > 0) {
202
+ console.log(`[CustomXmlPartService] Update ${namespace} tag ${rootTagName} failed - Retrying ${retryTimes - retries + 1}...`);
203
+ setTimeout(() => {
204
+ retryUpdateCustomXmlPartData(namespace, data, options, retries - 1)
205
+ .then(resolve)
206
+ .catch(reject);
207
+ }, 2000);
208
+ }
209
+ else {
210
+ reject(error);
211
+ }
212
+ });
213
+ });
214
+ };
215
+ const getDataByNamespace = (namespace, retries = 6) => {
216
+ return new Promise((resolve, reject) => {
217
+ getCustomXmlPartData(namespace)
218
+ .then((data) => {
219
+ resolve(data);
220
+ })
221
+ .catch((_) => {
222
+ if (retries > 0) {
223
+ console.log(`[CustomXmlPartService] Get data from ${namespace} failed - Retrying ${retryTimes - retries + 1}...`);
224
+ setTimeout(() => {
225
+ (0, exports.getDataByNamespace)(namespace, retries - 1)
226
+ .then(resolve)
227
+ .catch(reject);
228
+ }, 2000);
229
+ }
230
+ else {
231
+ reject(`Unable to get custom XML part using namespace ${namespace}`);
232
+ }
233
+ });
234
+ });
235
+ };
236
+ exports.getDataByNamespace = getDataByNamespace;
237
+ const updateXmlDataByNamespace = (namespace, data, rootTagName) => {
238
+ const options = { rootTagName };
239
+ return retryUpdateCustomXmlPartData(namespace, data, options);
240
+ };
241
+ exports.updateXmlDataByNamespace = updateXmlDataByNamespace;
242
+ const addHandlerForCustomXmlPart = (namespace, eventType, handler) => {
243
+ return getCustomXmlPartByNamespace(namespace).then((customXmlPart) => {
244
+ if (customXmlPart != null) {
245
+ const addHandler = (0, helpers_1.promisifyAsync)(customXmlPart.addHandlerAsync.bind(customXmlPart));
246
+ return addHandler(eventType, handler, {});
247
+ }
248
+ else {
249
+ return null;
250
+ }
251
+ });
252
+ };
253
+ exports.addHandlerForCustomXmlPart = addHandlerForCustomXmlPart;
254
+ const getChildNodes = (node, xPath = '*') => {
255
+ const getNodes = (0, helpers_1.promisifyAsync)(node.getNodesAsync.bind(node));
256
+ return getNodes(xPath);
257
+ };
258
+ exports.getChildNodes = getChildNodes;
259
+ const getNodeText = (node) => {
260
+ if (node) {
261
+ const getText = (0, helpers_1.promisifyAsync)(node.getTextAsync.bind(node));
262
+ return getText({});
263
+ }
264
+ else {
265
+ return Promise.resolve('');
266
+ }
267
+ };
268
+ exports.getNodeText = getNodeText;
269
+ //# sourceMappingURL=custom-xml-part.service.js.map