@polyguard/sdk 1.4.2 → 1.5.1

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 (116) hide show
  1. package/LICENSE +200 -0
  2. package/README.md +328 -0
  3. package/dist/sdk.esm.js +16 -4
  4. package/dist/sdk.js +16 -4
  5. package/dist/server.esm.js +83 -0
  6. package/package.json +14 -3
  7. package/dist/sdk.global.js +0 -11256
  8. package/scripts/regenerate-client.sh +0 -59
  9. package/src/PolyguardClient.js +0 -25
  10. package/src/PolyguardWebsocketClientImpl.js +0 -183
  11. package/src/__tests__/PolyguardClient.test.js +0 -65
  12. package/src/__tests__/PolyguardWebsocketClientImpl.test.js +0 -574
  13. package/src/__tests__/helpers/fixtures.js +0 -27
  14. package/src/__tests__/helpers/mockWebSocket.js +0 -66
  15. package/src/__tests__/sidebar.test.js +0 -289
  16. package/src/browser.js +0 -9
  17. package/src/generated/.babelrc +0 -33
  18. package/src/generated/.openapi-generator/FILES +0 -63
  19. package/src/generated/.openapi-generator/VERSION +0 -1
  20. package/src/generated/.openapi-generator-ignore +0 -23
  21. package/src/generated/.travis.yml +0 -5
  22. package/src/generated/README.md +0 -211
  23. package/src/generated/docs/ApiControllersPslStirCallRequest.md +0 -18
  24. package/src/generated/docs/ApiModelsApiCallModelsCallRequest.md +0 -12
  25. package/src/generated/docs/AppId.md +0 -8
  26. package/src/generated/docs/AppleApi.md +0 -88
  27. package/src/generated/docs/AuthApi.md +0 -1464
  28. package/src/generated/docs/BlockingApi.md +0 -208
  29. package/src/generated/docs/CallsApi.md +0 -140
  30. package/src/generated/docs/Certainty.md +0 -8
  31. package/src/generated/docs/CreateLinkRequest.md +0 -12
  32. package/src/generated/docs/DefaultApi.md +0 -128
  33. package/src/generated/docs/HTTPValidationError.md +0 -9
  34. package/src/generated/docs/InviteRequestModel.md +0 -10
  35. package/src/generated/docs/JWTRequest.md +0 -11
  36. package/src/generated/docs/LinksApi.md +0 -162
  37. package/src/generated/docs/NumberVerification.md +0 -10
  38. package/src/generated/docs/SdkApi.md +0 -54
  39. package/src/generated/docs/SecureLinksApi.md +0 -614
  40. package/src/generated/docs/StartAttestationRequest.md +0 -9
  41. package/src/generated/docs/StartMeetingRequest.md +0 -9
  42. package/src/generated/docs/StirApi.md +0 -52
  43. package/src/generated/docs/TwilioApi.md +0 -138
  44. package/src/generated/docs/UsersApi.md +0 -362
  45. package/src/generated/docs/ValidationError.md +0 -11
  46. package/src/generated/docs/ValidationErrorLocInner.md +0 -8
  47. package/src/generated/docs/VeriffApi.md +0 -188
  48. package/src/generated/docs/VeriffSessionRequest.md +0 -10
  49. package/src/generated/docs/VerifyRequest.md +0 -10
  50. package/src/generated/docs/WellKnownApi.md +0 -128
  51. package/src/generated/docs/ZoomApi.md +0 -848
  52. package/src/generated/git_push.sh +0 -57
  53. package/src/generated/mocha.opts +0 -1
  54. package/src/generated/package.json +0 -46
  55. package/src/generated/src/ApiClient.js +0 -677
  56. package/src/generated/src/api/AppleApi.js +0 -109
  57. package/src/generated/src/api/AuthApi.js +0 -1512
  58. package/src/generated/src/api/BlockingApi.js +0 -217
  59. package/src/generated/src/api/CallsApi.js +0 -164
  60. package/src/generated/src/api/DefaultApi.js +0 -145
  61. package/src/generated/src/api/LinksApi.js +0 -195
  62. package/src/generated/src/api/SdkApi.js +0 -81
  63. package/src/generated/src/api/SecureLinksApi.js +0 -670
  64. package/src/generated/src/api/StirApi.js +0 -80
  65. package/src/generated/src/api/TwilioApi.js +0 -158
  66. package/src/generated/src/api/UsersApi.js +0 -375
  67. package/src/generated/src/api/VeriffApi.js +0 -209
  68. package/src/generated/src/api/WellKnownApi.js +0 -145
  69. package/src/generated/src/api/ZoomApi.js +0 -823
  70. package/src/generated/src/index.js +0 -244
  71. package/src/generated/src/model/ApiControllersPslStirCallRequest.js +0 -211
  72. package/src/generated/src/model/ApiModelsApiCallModelsCallRequest.js +0 -119
  73. package/src/generated/src/model/CreateLinkRequest.js +0 -131
  74. package/src/generated/src/model/HTTPValidationError.js +0 -94
  75. package/src/generated/src/model/InviteRequestModel.js +0 -109
  76. package/src/generated/src/model/JWTRequest.js +0 -113
  77. package/src/generated/src/model/NumberVerification.js +0 -107
  78. package/src/generated/src/model/StartAttestationRequest.js +0 -95
  79. package/src/generated/src/model/StartMeetingRequest.js +0 -95
  80. package/src/generated/src/model/ValidationError.js +0 -130
  81. package/src/generated/src/model/VeriffSessionRequest.js +0 -107
  82. package/src/generated/src/model/VerifyRequest.js +0 -109
  83. package/src/generated/test/api/AppleApi.spec.js +0 -73
  84. package/src/generated/test/api/AuthApi.spec.js +0 -353
  85. package/src/generated/test/api/BlockingApi.spec.js +0 -103
  86. package/src/generated/test/api/CallsApi.spec.js +0 -83
  87. package/src/generated/test/api/DefaultApi.spec.js +0 -73
  88. package/src/generated/test/api/LinksApi.spec.js +0 -83
  89. package/src/generated/test/api/SdkApi.spec.js +0 -63
  90. package/src/generated/test/api/SecureLinksApi.spec.js +0 -143
  91. package/src/generated/test/api/StirApi.spec.js +0 -63
  92. package/src/generated/test/api/TwilioApi.spec.js +0 -83
  93. package/src/generated/test/api/UsersApi.spec.js +0 -133
  94. package/src/generated/test/api/VeriffApi.spec.js +0 -93
  95. package/src/generated/test/api/WellKnownApi.spec.js +0 -83
  96. package/src/generated/test/api/ZoomApi.spec.js +0 -213
  97. package/src/generated/test/model/ApiControllersPslStirCallRequest.spec.js +0 -119
  98. package/src/generated/test/model/ApiModelsApiCallModelsCallRequest.spec.js +0 -83
  99. package/src/generated/test/model/AppId.spec.js +0 -59
  100. package/src/generated/test/model/Certainty.spec.js +0 -59
  101. package/src/generated/test/model/CreateLinkRequest.spec.js +0 -83
  102. package/src/generated/test/model/HTTPValidationError.spec.js +0 -65
  103. package/src/generated/test/model/InviteRequestModel.spec.js +0 -71
  104. package/src/generated/test/model/JWTRequest.spec.js +0 -77
  105. package/src/generated/test/model/NumberVerification.spec.js +0 -71
  106. package/src/generated/test/model/StartAttestationRequest.spec.js +0 -65
  107. package/src/generated/test/model/StartMeetingRequest.spec.js +0 -65
  108. package/src/generated/test/model/ValidationError.spec.js +0 -77
  109. package/src/generated/test/model/ValidationErrorLocInner.spec.js +0 -59
  110. package/src/generated/test/model/VeriffSessionRequest.spec.js +0 -71
  111. package/src/generated/test/model/VerifyRequest.spec.js +0 -71
  112. package/src/index.js +0 -16
  113. package/src/messageHandler.js +0 -121
  114. package/src/ticketService.js +0 -24
  115. package/src/ui.js +0 -88
  116. package/vitest.config.js +0 -10
@@ -1,59 +0,0 @@
1
- #!/bin/bash
2
-
3
- # Navigate to the script's directory
4
- cd "$(dirname "$0")/.."
5
-
6
- # Step 1: Download the OpenAPI specification
7
- echo "Downloading OpenAPI specification..."
8
- curl -o openapi.json https://api.actual.video/openapi.json
9
-
10
- # Check if curl was successful
11
- if [ $? -ne 0 ]; then
12
- echo "Failed to download OpenAPI specification. Aborting."
13
- exit 1
14
- fi
15
-
16
- # Step 2: Run the OpenAPI generator using Docker
17
- echo "Generating client from OpenAPI specification..."
18
- docker run --rm -v "${PWD}:/local" openapitools/openapi-generator-cli generate \
19
- -i /local/openapi.json \
20
- -g javascript \
21
- -o /local/src/generated \
22
- --skip-validate-spec \
23
- --additional-properties=legacyDiscriminatorBehavior=false
24
-
25
- # Check if generation was successful
26
- if [ $? -ne 0 ]; then
27
- echo "Client generation failed. Aborting."
28
- rm openapi.json # Clean up downloaded spec
29
- exit 1
30
- fi
31
-
32
- # Step 3: Remove problematic model files
33
- echo "Removing problematic model files..."
34
- rm -f src/generated/src/model/Certainty.js
35
- rm -f src/generated/src/model/ValidationErrorLocInner.js
36
- rm -f src/generated/src/model/AppId.js
37
-
38
- # Step 4: Comment out invalid import statements in generated code
39
- echo "Patching generated files..."
40
- find src/generated -type f -name "*.js" -print0 | xargs -0 sed -i.bak "s/import Certainty from '.\/model\/Certainty';/\/\/ import Certainty from '.\/model\/Certainty';/"
41
- find src/generated -type f -name "*.js" -print0 | xargs -0 sed -i.bak "s/import ValidationErrorLocInner from '.\/model\/ValidationErrorLocInner';/\/\/ import ValidationErrorLocInner from '.\/model\/ValidationErrorLocInner';/"
42
- find src/generated -type f -name "*.js" -print0 | xargs -0 sed -i.bak "s/import AppId from '.\/model\/AppId';/\/\/ import AppId from '.\/model\/AppId';/"
43
- find src/generated -type f -name "*.js" -print0 | xargs -0 sed -i.bak "s/import Certainty from '.\/Certainty';/\/\/ import Certainty from '.\/Certainty';/"
44
- find src/generated -type f -name "*.js" -print0 | xargs -0 sed -i.bak "s/import ValidationErrorLocInner from '.\/ValidationErrorLocInner';/\/\/ import ValidationErrorLocInner from '.\/ValidationErrorLocInner';/"
45
- find src/generated -type f -name "*.js" -print0 | xargs -0 sed -i.bak "s/import AppId from '.\/AppId';/\/\/ import AppId from '.\/AppId';/"
46
-
47
- # Also comment out the exports of the removed models
48
- find src/generated -type f -name "*.js" -print0 | xargs -0 sed -i.bak "s/ Certainty,/\/\/ Certainty,/"
49
- find src/generated -type f -name "*.js" -print0 | xargs -0 sed -i.bak "s/ ValidationErrorLocInner,/\/\/ ValidationErrorLocInner,/"
50
- find src/generated -type f -name "*.js" -print0 | xargs -0 sed -i.bak "s/ AppId,/\/\/ AppId,/"
51
-
52
- # Remove backup files created by sed
53
- find src/generated -type f -name "*.js.bak" -delete
54
-
55
- # Step 5: Clean up the downloaded specification file
56
- echo "Cleaning up..."
57
- rm openapi.json
58
-
59
- echo "Client regeneration complete."
@@ -1,25 +0,0 @@
1
- import { PolyguardWebsocketClientImpl } from './PolyguardWebsocketClientImpl';
2
-
3
- export class PolyguardClient {
4
- constructor(params = {}) {
5
- // Choose implementation based on integrationType
6
- let impl;
7
- switch (params.integrationType) {
8
- case 'websocket':
9
- default:
10
- impl = new PolyguardWebsocketClientImpl(params);
11
- break;
12
- }
13
- this._impl = impl;
14
- // Copy API services and properties from impl to this
15
- for (const key in impl) {
16
- if (Object.prototype.hasOwnProperty.call(impl, key)) {
17
- this[key] = impl[key];
18
- }
19
- }
20
- }
21
-
22
- async verify(...args) {
23
- return this._impl.verify(...args);
24
- }
25
- }
@@ -1,183 +0,0 @@
1
- import ReconnectingWebSocket from 'reconnecting-websocket';
2
- import * as PolyguardApi from './generated/src';
3
- import { buildModal, showSpinner } from './ui.js';
4
- import { fetchTicket } from './ticketService.js';
5
- import { handleWebSocketMessage } from './messageHandler.js';
6
-
7
- // Implementation class for websocket integration
8
- export class PolyguardWebsocketClientImpl {
9
- constructor(params = {}) {
10
- this.apiClient = new PolyguardApi.ApiClient();
11
- const { apiKey, baseUrl, appId, apiServer, requiredProofs = ['Full Name'], scanType = 'single', redirectUrl, callbackUrl, cookieName, link_uuid, sidebarUrl } = params;
12
- this.sidebarUrl = sidebarUrl;
13
- if (baseUrl) {
14
- this.apiClient.basePath = baseUrl;
15
- }
16
- if (apiKey) {
17
- if (this.apiClient.authentications['bearerAuth']) {
18
- this.apiClient.authentications['bearerAuth'].apiKey = apiKey;
19
- }
20
- }
21
- // Instantiate all API services
22
- for (const key in PolyguardApi) {
23
- if (key.endsWith('Api')) {
24
- const apiName = key.charAt(0).toLowerCase() + key.slice(1);
25
- this[apiName] = new PolyguardApi[key](this.apiClient);
26
- }
27
- }
28
- // Polyguard auth params
29
- this.integrationType = 'websocket';
30
- this.appId = appId;
31
- this.apiServer = apiServer;
32
- this.requiredProofs = requiredProofs;
33
- this.scanType = scanType;
34
- this.redirectUrl = redirectUrl;
35
- this.callbackUrl = callbackUrl;
36
- this.cookieName = cookieName;
37
- this.link_uuid = link_uuid;
38
- }
39
-
40
- buildModal() {
41
- return buildModal();
42
- }
43
-
44
- async verify(target = null, rawJwt = false) {
45
- let modal = null;
46
- let qrDiv = null;
47
- let isTargetMode = false;
48
-
49
- if (target) {
50
- isTargetMode = true;
51
- qrDiv = document.getElementById(target);
52
- if (!qrDiv) {
53
- throw new Error(`Target element with ID '${target}' not found`);
54
- }
55
- } else {
56
- modal = buildModal();
57
- }
58
-
59
- if (!isTargetMode) {
60
- document.body.appendChild(modal);
61
- qrDiv = modal.querySelector('#polyguard-qr');
62
- }
63
-
64
- if (qrDiv) {
65
- showSpinner(qrDiv);
66
- }
67
-
68
- function cleanup() {
69
- if (isTargetMode) {
70
- if (qrDiv) {
71
- qrDiv.innerHTML = '';
72
- }
73
- } else if (modal && modal.parentNode) {
74
- modal.parentNode.removeChild(modal);
75
- }
76
- }
77
-
78
- return new Promise(async (resolve, reject) => {
79
- let ws = null;
80
- let closed = false;
81
-
82
- function returnError(msg, score = "OFFLINE") {
83
- if (isTargetMode) {
84
- console.error('Polyguard Error:', msg);
85
- cleanup();
86
- resolve({presence: { score: score, msg: msg }});
87
- } else {
88
- const errDiv = modal.querySelector('#polyguard-error');
89
- if (errDiv) {
90
- errDiv.textContent = msg;
91
- errDiv.style.display = 'block';
92
- }
93
- setTimeout(() => {
94
- cleanup();
95
- resolve({presence: { score: score, msg: msg }});
96
- }, 1250);
97
- }
98
- }
99
- function clearError() {
100
- if (!isTargetMode) {
101
- const errDiv = modal.querySelector('#polyguard-error');
102
- if (errDiv) errDiv.style.display = 'none';
103
- }
104
- }
105
- function handleClose() {
106
- closed = true;
107
- if (ws) ws.close();
108
- cleanup();
109
- reject(new Error('User cancelled'));
110
- }
111
-
112
- if (!isTargetMode) {
113
- modal.querySelector('#polyguard-modal-close').onclick = handleClose;
114
- modal.querySelector('#polyguard-modal-cancel').onclick = handleClose;
115
- }
116
-
117
- try {
118
- clearError();
119
- const wsProtocol = window.location.protocol === 'https:' ? 'wss' : 'ws';
120
-
121
- const newTicket = await fetchTicket({
122
- apiServer: this.apiServer,
123
- appId: this.appId,
124
- link_uuid: this.link_uuid,
125
- requiredProofs: this.requiredProofs,
126
- scanType: this.scanType,
127
- });
128
-
129
- const wsUrl = `${wsProtocol}://${this.apiServer}/v2/realtime/${newTicket}`;
130
- const options = {
131
- maxRetries: 10,
132
- minTimeout: 1000,
133
- maxTimeout: 10000,
134
- reconnectionDelay: 1000,
135
- reconnectionDelayGrowFactor: 1.5,
136
- };
137
- ws = new ReconnectingWebSocket(wsUrl, [], options);
138
-
139
- const markClosed = () => { closed = true; };
140
- const ctx = { ws, qrDiv, isTargetMode, modal, cleanup, markClosed, returnError, clearError, resolve, rawJwt, sidebarUrl: this.sidebarUrl, link_uuid: this.link_uuid };
141
- ws.addEventListener('message', (event) => handleWebSocketMessage(event, ctx));
142
-
143
- ws.addEventListener('error', () => {
144
- console.error('WebSocket error');
145
- returnError('WebSocket error');
146
- });
147
- ws.addEventListener('close', () => {
148
- if (!closed) cleanup();
149
- });
150
- } catch (err) {
151
- returnError(err.message === 'Failed to get ticket' || err.message === 'No ticket returned from server'
152
- ? err.message
153
- : 'Failed to connect to WebSocket');
154
- }
155
- });
156
- }
157
-
158
- /**
159
- * Wrapper around verify that checks received proof values against expected values.
160
- * @param {Object} expectedProofs - An object mapping proof names to expected values.
161
- * @param {string} target - Optional ID of target element to render QR code in.
162
- * @returns {Promise<boolean>} - Resolves to true if all expected proofs match, false otherwise or if cancelled.
163
- */
164
- async require(expectedProofs = {}, target = null) {
165
- try {
166
- const jwt = await this.verify(target);
167
- if (!jwt) return false;
168
- // Decode JWT (without verifying signature)
169
- const payload = JSON.parse(atob(jwt.split('.')[1]));
170
- console.dir(payload);
171
- // Check each expected proof
172
- for (const [proof, expectedValue] of Object.entries(expectedProofs)) {
173
- if (payload[proof] !== expectedValue) {
174
- return false;
175
- }
176
- }
177
- return true;
178
- } catch (err) {
179
- // If modal is cancelled or error occurs, return false
180
- return false;
181
- }
182
- }
183
- }
@@ -1,65 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { DEFAULT_PARAMS } from './helpers/fixtures.js';
3
-
4
- // Mock the WebSocket impl so the facade tests never touch real internals
5
- vi.mock('../PolyguardWebsocketClientImpl', () => {
6
- class FakeImpl {
7
- constructor(params = {}) {
8
- this.appId = params.appId;
9
- this.apiServer = params.apiServer;
10
- this.integrationType = 'websocket';
11
- this.blockingApi = { fake: true };
12
- this.callsApi = { fake: true };
13
- }
14
- async verify(...args) {
15
- return { args, result: 'fake-jwt' };
16
- }
17
- }
18
- return { PolyguardWebsocketClientImpl: FakeImpl };
19
- });
20
-
21
- // Import after mock is set up
22
- const { PolyguardClient } = await import('../PolyguardClient.js');
23
-
24
- describe('PolyguardClient', () => {
25
- beforeEach(() => {
26
- vi.clearAllMocks();
27
- });
28
-
29
- it('defaults to websocket implementation', () => {
30
- const client = new PolyguardClient(DEFAULT_PARAMS);
31
- expect(client._impl).toBeDefined();
32
- expect(client._impl.integrationType).toBe('websocket');
33
- });
34
-
35
- it('explicit integrationType websocket works the same', () => {
36
- const client = new PolyguardClient({ ...DEFAULT_PARAMS, integrationType: 'websocket' });
37
- expect(client._impl.integrationType).toBe('websocket');
38
- });
39
-
40
- it('copies properties from impl to facade', () => {
41
- const client = new PolyguardClient(DEFAULT_PARAMS);
42
- expect(client.appId).toBe(DEFAULT_PARAMS.appId);
43
- expect(client.apiServer).toBe(DEFAULT_PARAMS.apiServer);
44
- expect(client.integrationType).toBe('websocket');
45
- expect(client.blockingApi).toEqual({ fake: true });
46
- expect(client.callsApi).toEqual({ fake: true });
47
- });
48
-
49
- it('verify() delegates to _impl.verify() with all args forwarded', async () => {
50
- const client = new PolyguardClient(DEFAULT_PARAMS);
51
- const spy = vi.spyOn(client._impl, 'verify');
52
- await client.verify('my-target', true);
53
- expect(spy).toHaveBeenCalledWith('my-target', true);
54
- });
55
-
56
- it('verify() returns the impl result', async () => {
57
- const client = new PolyguardClient(DEFAULT_PARAMS);
58
- const result = await client.verify('t', false);
59
- expect(result).toEqual({ args: ['t', false], result: 'fake-jwt' });
60
- });
61
-
62
- it('constructor with no params does not throw', () => {
63
- expect(() => new PolyguardClient()).not.toThrow();
64
- });
65
- });