@greenpay_prod/3ds-sdk 0.1.4-qa.0 → 0.2.1-qa.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.
package/dist/index.d.mts CHANGED
@@ -1,6 +1,8 @@
1
+ type GreenPay3DSEnvironment = 'prod' | 'sbx';
1
2
  interface GreenPay3DSConfig {
2
- teamId: string;
3
- appId: string;
3
+ environment?: GreenPay3DSEnvironment;
4
+ teamId?: string;
5
+ appId?: string;
4
6
  apiUrl?: string;
5
7
  }
6
8
  interface OrderData {
@@ -45,9 +47,9 @@ declare class GreenPay3DS {
45
47
  private teamId;
46
48
  private appId;
47
49
  private apiUrl?;
48
- constructor(config: GreenPay3DSConfig);
50
+ constructor(config?: GreenPay3DSConfig);
49
51
  authenticate(sessionId: string, callbacks?: ThreeDSCallbacks): Promise<void>;
50
52
  processPayment(orderData: OrderData, callbacks?: ThreeDSPaymentCallbacks): Promise<ThreeDSResult>;
51
53
  }
52
54
 
53
- export { GreenPay3DS, type GreenPay3DSConfig, GreenPay3DSError, type OrderData, type ThreeDSCallbacks, type ThreeDSPaymentCallbacks, type ThreeDSResult, type ThreeDSSession };
55
+ export { GreenPay3DS, type GreenPay3DSConfig, type GreenPay3DSEnvironment, GreenPay3DSError, type OrderData, type ThreeDSCallbacks, type ThreeDSPaymentCallbacks, type ThreeDSResult, type ThreeDSSession };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
+ type GreenPay3DSEnvironment = 'prod' | 'sbx';
1
2
  interface GreenPay3DSConfig {
2
- teamId: string;
3
- appId: string;
3
+ environment?: GreenPay3DSEnvironment;
4
+ teamId?: string;
5
+ appId?: string;
4
6
  apiUrl?: string;
5
7
  }
6
8
  interface OrderData {
@@ -45,9 +47,9 @@ declare class GreenPay3DS {
45
47
  private teamId;
46
48
  private appId;
47
49
  private apiUrl?;
48
- constructor(config: GreenPay3DSConfig);
50
+ constructor(config?: GreenPay3DSConfig);
49
51
  authenticate(sessionId: string, callbacks?: ThreeDSCallbacks): Promise<void>;
50
52
  processPayment(orderData: OrderData, callbacks?: ThreeDSPaymentCallbacks): Promise<ThreeDSResult>;
51
53
  }
52
54
 
53
- export { GreenPay3DS, type GreenPay3DSConfig, GreenPay3DSError, type OrderData, type ThreeDSCallbacks, type ThreeDSPaymentCallbacks, type ThreeDSResult, type ThreeDSSession };
55
+ export { GreenPay3DS, type GreenPay3DSConfig, type GreenPay3DSEnvironment, GreenPay3DSError, type OrderData, type ThreeDSCallbacks, type ThreeDSPaymentCallbacks, type ThreeDSResult, type ThreeDSSession };
package/dist/index.js CHANGED
@@ -77,6 +77,20 @@ async function retrieveSession(apiUrl, sessionId, cardData, sessionToken) {
77
77
  return body;
78
78
  }
79
79
 
80
+ // src/environments.ts
81
+ var ENVIRONMENTS = {
82
+ prod: {
83
+ teamId: "team_115ea2493762",
84
+ appId: "app_86bb433bb19f",
85
+ apiUrl: "https://checkoutv2.greenpay.me"
86
+ },
87
+ sbx: {
88
+ teamId: "team_115ea2493762",
89
+ appId: "app_910ecf6fb931",
90
+ apiUrl: "https://checkoutv2.greenpaysbx.me"
91
+ }
92
+ };
93
+
80
94
  // src/GreenPay3DS.ts
81
95
  var GreenPay3DSError = class extends Error {
82
96
  constructor(message, code) {
@@ -86,16 +100,23 @@ var GreenPay3DSError = class extends Error {
86
100
  }
87
101
  };
88
102
  var GreenPay3DS = class {
89
- constructor(config) {
90
- if (!config.teamId || !config.appId) {
103
+ constructor(config = {}) {
104
+ const defaults = config.environment !== void 0 ? ENVIRONMENTS[config.environment] : void 0;
105
+ if (config.environment !== void 0 && !defaults) {
106
+ throw new GreenPay3DSError(
107
+ `Unknown environment "${config.environment}" (expected "prod" or "sbx")`,
108
+ "INVALID_CONFIG"
109
+ );
110
+ }
111
+ this.teamId = config.teamId ?? defaults?.teamId ?? "";
112
+ this.appId = config.appId ?? defaults?.appId ?? "";
113
+ this.apiUrl = config.apiUrl ?? defaults?.apiUrl;
114
+ if (!this.teamId || !this.appId) {
91
115
  throw new GreenPay3DSError(
92
- "teamId and appId are required",
116
+ 'Set environment ("prod" or "sbx"), or pass teamId and appId explicitly',
93
117
  "INVALID_CONFIG"
94
118
  );
95
119
  }
96
- this.teamId = config.teamId;
97
- this.appId = config.appId;
98
- this.apiUrl = config.apiUrl;
99
120
  }
100
121
  async authenticate(sessionId, callbacks) {
101
122
  if (!sessionId) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/api.ts","../src/GreenPay3DS.ts"],"sourcesContent":["export { GreenPay3DS, GreenPay3DSError } from './GreenPay3DS'\nexport type {\n GreenPay3DSConfig,\n ThreeDSCallbacks,\n ThreeDSPaymentCallbacks,\n OrderData,\n ThreeDSSession,\n ThreeDSResult,\n} from './types'\n","import type { ThreeDSSession, ThreeDSResult } from './types'\nimport { GreenPay3DSError } from './GreenPay3DS'\n\nexport async function createSession(\n apiUrl: string,\n cardData: { ed: string; session: string },\n sessionToken: string,\n terminalId?: string\n): Promise<ThreeDSSession> {\n const requestBody: Record<string, unknown> = { cardData }\n if (terminalId !== undefined && terminalId !== '') {\n requestBody.terminalId = terminalId\n }\n\n const response = await fetch(`${apiUrl}/3ds/create-session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'session-token': sessionToken,\n },\n body: JSON.stringify(requestBody),\n })\n\n const json = await response.json()\n\n if (!response.ok || json.statusCode !== 200) {\n throw new GreenPay3DSError(\n json?.result?.error?.message ||\n json?.message ||\n 'Failed to create 3DS session',\n 'CREATE_SESSION_FAILED'\n )\n }\n\n return json.data\n}\n\nexport async function retrieveSession(\n apiUrl: string,\n sessionId: string,\n cardData: { ed: string; session: string },\n sessionToken: string\n): Promise<ThreeDSResult> {\n const response = await fetch(`${apiUrl}/3ds/retrieve-session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'session-token': sessionToken,\n },\n body: JSON.stringify({ sessionId, cardData }),\n })\n\n const body = await response.json()\n\n if (!response.ok || body.statusCode !== 200) {\n throw new GreenPay3DSError(\n body?.result?.error?.message || body?.message || 'Failed to retrieve 3DS session',\n 'RETRIEVE_SESSION_FAILED'\n )\n }\n\n return body\n}\n","import type {\n GreenPay3DSConfig,\n ThreeDSCallbacks,\n ThreeDSPaymentCallbacks,\n OrderData,\n ThreeDSResult,\n} from './types'\nimport { createSession, retrieveSession } from './api'\n\nexport class GreenPay3DSError extends Error {\n code: string\n\n constructor(message: string, code: string) {\n super(message)\n this.name = 'GreenPay3DSError'\n this.code = code\n }\n}\n\nexport class GreenPay3DS {\n private teamId: string\n private appId: string\n private apiUrl?: string\n\n constructor(config: GreenPay3DSConfig) {\n if (!config.teamId || !config.appId) {\n throw new GreenPay3DSError(\n 'teamId and appId are required',\n 'INVALID_CONFIG'\n )\n }\n this.teamId = config.teamId\n this.appId = config.appId\n this.apiUrl = config.apiUrl\n }\n\n async authenticate(\n sessionId: string,\n callbacks?: ThreeDSCallbacks\n ): Promise<void> {\n if (!sessionId) {\n throw new GreenPay3DSError('sessionId is required', 'INVALID_SESSION')\n }\n\n callbacks?.onStatusChange?.('Loading 3DS authentication...')\n\n const { loadEvervault } = await import('@evervault/js')\n const ev = await loadEvervault(this.teamId, this.appId)\n\n callbacks?.onStatusChange?.('Initializing 3DS challenge...')\n\n return new Promise<void>((resolve, reject) => {\n const threeDSecure = ev.ui.threeDSecure(sessionId)\n\n threeDSecure.on('ready', () => {\n callbacks?.onReady?.()\n callbacks?.onStatusChange?.(\n 'Challenge ready. If frictionless it will complete automatically, otherwise complete the verification prompt.'\n )\n })\n\n threeDSecure.on('success', () => {\n callbacks?.onSuccess?.()\n callbacks?.onStatusChange?.('Authentication successful')\n resolve()\n })\n\n threeDSecure.on('failure', () => {\n const msg = '3DS authentication was rejected by the issuer'\n callbacks?.onFailure?.(msg)\n callbacks?.onStatusChange?.('Authentication failed')\n reject(new GreenPay3DSError(msg, 'AUTHENTICATION_FAILED'))\n })\n\n threeDSecure.on('error', (err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err)\n callbacks?.onError?.(err instanceof Error ? err : msg)\n callbacks?.onStatusChange?.('Authentication error')\n reject(new GreenPay3DSError(msg, 'AUTHENTICATION_ERROR'))\n })\n\n threeDSecure.mount()\n })\n }\n\n async processPayment(\n orderData: OrderData,\n callbacks?: ThreeDSPaymentCallbacks\n ): Promise<ThreeDSResult> {\n if (!this.apiUrl) {\n throw new GreenPay3DSError(\n 'apiUrl is required in config for processPayment',\n 'INVALID_CONFIG'\n )\n }\n\n const { cardData, sessionToken, terminalId } = orderData\n if (!cardData?.ed || !cardData?.session || !sessionToken) {\n throw new GreenPay3DSError(\n 'cardData.ed, cardData.session, and sessionToken are required',\n 'INVALID_ORDER_DATA'\n )\n }\n\n callbacks?.onStatusChange?.('Creating 3DS session...')\n const session = await createSession(\n this.apiUrl,\n cardData,\n sessionToken,\n terminalId\n )\n\n callbacks?.onStatusChange?.('Starting 3DS authentication...')\n await this.authenticate(session.id, {\n onReady: callbacks?.onReady,\n onFailure: callbacks?.onFailure,\n onError: callbacks?.onError,\n onStatusChange: callbacks?.onStatusChange,\n })\n\n callbacks?.onStatusChange?.('Retrieving authentication result...')\n const result = await retrieveSession(\n this.apiUrl,\n session.id,\n cardData,\n sessionToken\n )\n\n callbacks?.onSuccess?.(result)\n callbacks?.onStatusChange?.('3DS authentication complete')\n return result\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/api.ts","../src/environments.ts","../src/GreenPay3DS.ts"],"sourcesContent":["export { GreenPay3DS, GreenPay3DSError } from './GreenPay3DS'\nexport type {\n GreenPay3DSConfig,\n GreenPay3DSEnvironment,\n ThreeDSCallbacks,\n ThreeDSPaymentCallbacks,\n OrderData,\n ThreeDSSession,\n ThreeDSResult,\n} from './types'\n","import type { ThreeDSSession, ThreeDSResult } from './types'\nimport { GreenPay3DSError } from './GreenPay3DS'\n\nexport async function createSession(\n apiUrl: string,\n cardData: { ed: string; session: string },\n sessionToken: string,\n terminalId?: string\n): Promise<ThreeDSSession> {\n const requestBody: Record<string, unknown> = { cardData }\n if (terminalId !== undefined && terminalId !== '') {\n requestBody.terminalId = terminalId\n }\n\n const response = await fetch(`${apiUrl}/3ds/create-session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'session-token': sessionToken,\n },\n body: JSON.stringify(requestBody),\n })\n\n const json = await response.json()\n\n if (!response.ok || json.statusCode !== 200) {\n throw new GreenPay3DSError(\n json?.result?.error?.message ||\n json?.message ||\n 'Failed to create 3DS session',\n 'CREATE_SESSION_FAILED'\n )\n }\n\n return json.data\n}\n\nexport async function retrieveSession(\n apiUrl: string,\n sessionId: string,\n cardData: { ed: string; session: string },\n sessionToken: string\n): Promise<ThreeDSResult> {\n const response = await fetch(`${apiUrl}/3ds/retrieve-session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'session-token': sessionToken,\n },\n body: JSON.stringify({ sessionId, cardData }),\n })\n\n const body = await response.json()\n\n if (!response.ok || body.statusCode !== 200) {\n throw new GreenPay3DSError(\n body?.result?.error?.message || body?.message || 'Failed to retrieve 3DS session',\n 'RETRIEVE_SESSION_FAILED'\n )\n }\n\n return body\n}\n","import type { GreenPay3DSEnvironment } from './types'\n\nexport interface EnvironmentConfig {\n teamId: string\n appId: string\n apiUrl: string\n}\n\nexport const ENVIRONMENTS: Record<GreenPay3DSEnvironment, EnvironmentConfig> = {\n prod: {\n teamId: 'team_115ea2493762',\n appId: 'app_86bb433bb19f',\n apiUrl: 'https://checkoutv2.greenpay.me',\n },\n sbx: {\n teamId: 'team_115ea2493762',\n appId: 'app_910ecf6fb931',\n apiUrl: 'https://checkoutv2.greenpaysbx.me',\n },\n}\n","import type {\n GreenPay3DSConfig,\n ThreeDSCallbacks,\n ThreeDSPaymentCallbacks,\n OrderData,\n ThreeDSResult,\n} from './types'\nimport { createSession, retrieveSession } from './api'\nimport { ENVIRONMENTS } from './environments'\n\nexport class GreenPay3DSError extends Error {\n code: string\n\n constructor(message: string, code: string) {\n super(message)\n this.name = 'GreenPay3DSError'\n this.code = code\n }\n}\n\nexport class GreenPay3DS {\n private teamId: string\n private appId: string\n private apiUrl?: string\n\n constructor(config: GreenPay3DSConfig = {}) {\n const defaults =\n config.environment !== undefined\n ? ENVIRONMENTS[config.environment]\n : undefined\n\n if (config.environment !== undefined && !defaults) {\n throw new GreenPay3DSError(\n `Unknown environment \"${config.environment}\" (expected \"prod\" or \"sbx\")`,\n 'INVALID_CONFIG'\n )\n }\n\n this.teamId = config.teamId ?? defaults?.teamId ?? ''\n this.appId = config.appId ?? defaults?.appId ?? ''\n this.apiUrl = config.apiUrl ?? defaults?.apiUrl\n\n if (!this.teamId || !this.appId) {\n throw new GreenPay3DSError(\n 'Set environment (\"prod\" or \"sbx\"), or pass teamId and appId explicitly',\n 'INVALID_CONFIG'\n )\n }\n }\n\n async authenticate(\n sessionId: string,\n callbacks?: ThreeDSCallbacks\n ): Promise<void> {\n if (!sessionId) {\n throw new GreenPay3DSError('sessionId is required', 'INVALID_SESSION')\n }\n\n callbacks?.onStatusChange?.('Loading 3DS authentication...')\n\n const { loadEvervault } = await import('@evervault/js')\n const ev = await loadEvervault(this.teamId, this.appId)\n\n callbacks?.onStatusChange?.('Initializing 3DS challenge...')\n\n return new Promise<void>((resolve, reject) => {\n const threeDSecure = ev.ui.threeDSecure(sessionId)\n\n threeDSecure.on('ready', () => {\n callbacks?.onReady?.()\n callbacks?.onStatusChange?.(\n 'Challenge ready. If frictionless it will complete automatically, otherwise complete the verification prompt.'\n )\n })\n\n threeDSecure.on('success', () => {\n callbacks?.onSuccess?.()\n callbacks?.onStatusChange?.('Authentication successful')\n resolve()\n })\n\n threeDSecure.on('failure', () => {\n const msg = '3DS authentication was rejected by the issuer'\n callbacks?.onFailure?.(msg)\n callbacks?.onStatusChange?.('Authentication failed')\n reject(new GreenPay3DSError(msg, 'AUTHENTICATION_FAILED'))\n })\n\n threeDSecure.on('error', (err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err)\n callbacks?.onError?.(err instanceof Error ? err : msg)\n callbacks?.onStatusChange?.('Authentication error')\n reject(new GreenPay3DSError(msg, 'AUTHENTICATION_ERROR'))\n })\n\n threeDSecure.mount()\n })\n }\n\n async processPayment(\n orderData: OrderData,\n callbacks?: ThreeDSPaymentCallbacks\n ): Promise<ThreeDSResult> {\n if (!this.apiUrl) {\n throw new GreenPay3DSError(\n 'apiUrl is required in config for processPayment',\n 'INVALID_CONFIG'\n )\n }\n\n const { cardData, sessionToken, terminalId } = orderData\n if (!cardData?.ed || !cardData?.session || !sessionToken) {\n throw new GreenPay3DSError(\n 'cardData.ed, cardData.session, and sessionToken are required',\n 'INVALID_ORDER_DATA'\n )\n }\n\n callbacks?.onStatusChange?.('Creating 3DS session...')\n const session = await createSession(\n this.apiUrl,\n cardData,\n sessionToken,\n terminalId\n )\n\n callbacks?.onStatusChange?.('Starting 3DS authentication...')\n await this.authenticate(session.id, {\n onReady: callbacks?.onReady,\n onFailure: callbacks?.onFailure,\n onError: callbacks?.onError,\n onStatusChange: callbacks?.onStatusChange,\n })\n\n callbacks?.onStatusChange?.('Retrieving authentication result...')\n const result = await retrieveSession(\n this.apiUrl,\n session.id,\n cardData,\n sessionToken\n )\n\n callbacks?.onSuccess?.(result)\n callbacks?.onStatusChange?.('3DS authentication complete')\n return result\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -40,6 +40,20 @@ async function retrieveSession(apiUrl, sessionId, cardData, sessionToken) {
40
40
  return body;
41
41
  }
42
42
 
43
+ // src/environments.ts
44
+ var ENVIRONMENTS = {
45
+ prod: {
46
+ teamId: "team_115ea2493762",
47
+ appId: "app_86bb433bb19f",
48
+ apiUrl: "https://checkoutv2.greenpay.me"
49
+ },
50
+ sbx: {
51
+ teamId: "team_115ea2493762",
52
+ appId: "app_910ecf6fb931",
53
+ apiUrl: "https://checkoutv2.greenpaysbx.me"
54
+ }
55
+ };
56
+
43
57
  // src/GreenPay3DS.ts
44
58
  var GreenPay3DSError = class extends Error {
45
59
  constructor(message, code) {
@@ -49,16 +63,23 @@ var GreenPay3DSError = class extends Error {
49
63
  }
50
64
  };
51
65
  var GreenPay3DS = class {
52
- constructor(config) {
53
- if (!config.teamId || !config.appId) {
66
+ constructor(config = {}) {
67
+ const defaults = config.environment !== void 0 ? ENVIRONMENTS[config.environment] : void 0;
68
+ if (config.environment !== void 0 && !defaults) {
69
+ throw new GreenPay3DSError(
70
+ `Unknown environment "${config.environment}" (expected "prod" or "sbx")`,
71
+ "INVALID_CONFIG"
72
+ );
73
+ }
74
+ this.teamId = config.teamId ?? defaults?.teamId ?? "";
75
+ this.appId = config.appId ?? defaults?.appId ?? "";
76
+ this.apiUrl = config.apiUrl ?? defaults?.apiUrl;
77
+ if (!this.teamId || !this.appId) {
54
78
  throw new GreenPay3DSError(
55
- "teamId and appId are required",
79
+ 'Set environment ("prod" or "sbx"), or pass teamId and appId explicitly',
56
80
  "INVALID_CONFIG"
57
81
  );
58
82
  }
59
- this.teamId = config.teamId;
60
- this.appId = config.appId;
61
- this.apiUrl = config.apiUrl;
62
83
  }
63
84
  async authenticate(sessionId, callbacks) {
64
85
  if (!sessionId) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api.ts","../src/GreenPay3DS.ts"],"sourcesContent":["import type { ThreeDSSession, ThreeDSResult } from './types'\nimport { GreenPay3DSError } from './GreenPay3DS'\n\nexport async function createSession(\n apiUrl: string,\n cardData: { ed: string; session: string },\n sessionToken: string,\n terminalId?: string\n): Promise<ThreeDSSession> {\n const requestBody: Record<string, unknown> = { cardData }\n if (terminalId !== undefined && terminalId !== '') {\n requestBody.terminalId = terminalId\n }\n\n const response = await fetch(`${apiUrl}/3ds/create-session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'session-token': sessionToken,\n },\n body: JSON.stringify(requestBody),\n })\n\n const json = await response.json()\n\n if (!response.ok || json.statusCode !== 200) {\n throw new GreenPay3DSError(\n json?.result?.error?.message ||\n json?.message ||\n 'Failed to create 3DS session',\n 'CREATE_SESSION_FAILED'\n )\n }\n\n return json.data\n}\n\nexport async function retrieveSession(\n apiUrl: string,\n sessionId: string,\n cardData: { ed: string; session: string },\n sessionToken: string\n): Promise<ThreeDSResult> {\n const response = await fetch(`${apiUrl}/3ds/retrieve-session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'session-token': sessionToken,\n },\n body: JSON.stringify({ sessionId, cardData }),\n })\n\n const body = await response.json()\n\n if (!response.ok || body.statusCode !== 200) {\n throw new GreenPay3DSError(\n body?.result?.error?.message || body?.message || 'Failed to retrieve 3DS session',\n 'RETRIEVE_SESSION_FAILED'\n )\n }\n\n return body\n}\n","import type {\n GreenPay3DSConfig,\n ThreeDSCallbacks,\n ThreeDSPaymentCallbacks,\n OrderData,\n ThreeDSResult,\n} from './types'\nimport { createSession, retrieveSession } from './api'\n\nexport class GreenPay3DSError extends Error {\n code: string\n\n constructor(message: string, code: string) {\n super(message)\n this.name = 'GreenPay3DSError'\n this.code = code\n }\n}\n\nexport class GreenPay3DS {\n private teamId: string\n private appId: string\n private apiUrl?: string\n\n constructor(config: GreenPay3DSConfig) {\n if (!config.teamId || !config.appId) {\n throw new GreenPay3DSError(\n 'teamId and appId are required',\n 'INVALID_CONFIG'\n )\n }\n this.teamId = config.teamId\n this.appId = config.appId\n this.apiUrl = config.apiUrl\n }\n\n async authenticate(\n sessionId: string,\n callbacks?: ThreeDSCallbacks\n ): Promise<void> {\n if (!sessionId) {\n throw new GreenPay3DSError('sessionId is required', 'INVALID_SESSION')\n }\n\n callbacks?.onStatusChange?.('Loading 3DS authentication...')\n\n const { loadEvervault } = await import('@evervault/js')\n const ev = await loadEvervault(this.teamId, this.appId)\n\n callbacks?.onStatusChange?.('Initializing 3DS challenge...')\n\n return new Promise<void>((resolve, reject) => {\n const threeDSecure = ev.ui.threeDSecure(sessionId)\n\n threeDSecure.on('ready', () => {\n callbacks?.onReady?.()\n callbacks?.onStatusChange?.(\n 'Challenge ready. If frictionless it will complete automatically, otherwise complete the verification prompt.'\n )\n })\n\n threeDSecure.on('success', () => {\n callbacks?.onSuccess?.()\n callbacks?.onStatusChange?.('Authentication successful')\n resolve()\n })\n\n threeDSecure.on('failure', () => {\n const msg = '3DS authentication was rejected by the issuer'\n callbacks?.onFailure?.(msg)\n callbacks?.onStatusChange?.('Authentication failed')\n reject(new GreenPay3DSError(msg, 'AUTHENTICATION_FAILED'))\n })\n\n threeDSecure.on('error', (err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err)\n callbacks?.onError?.(err instanceof Error ? err : msg)\n callbacks?.onStatusChange?.('Authentication error')\n reject(new GreenPay3DSError(msg, 'AUTHENTICATION_ERROR'))\n })\n\n threeDSecure.mount()\n })\n }\n\n async processPayment(\n orderData: OrderData,\n callbacks?: ThreeDSPaymentCallbacks\n ): Promise<ThreeDSResult> {\n if (!this.apiUrl) {\n throw new GreenPay3DSError(\n 'apiUrl is required in config for processPayment',\n 'INVALID_CONFIG'\n )\n }\n\n const { cardData, sessionToken, terminalId } = orderData\n if (!cardData?.ed || !cardData?.session || !sessionToken) {\n throw new GreenPay3DSError(\n 'cardData.ed, cardData.session, and sessionToken are required',\n 'INVALID_ORDER_DATA'\n )\n }\n\n callbacks?.onStatusChange?.('Creating 3DS session...')\n const session = await createSession(\n this.apiUrl,\n cardData,\n sessionToken,\n terminalId\n )\n\n callbacks?.onStatusChange?.('Starting 3DS authentication...')\n await this.authenticate(session.id, {\n onReady: callbacks?.onReady,\n onFailure: callbacks?.onFailure,\n onError: callbacks?.onError,\n onStatusChange: callbacks?.onStatusChange,\n })\n\n callbacks?.onStatusChange?.('Retrieving authentication result...')\n const result = await retrieveSession(\n this.apiUrl,\n session.id,\n cardData,\n sessionToken\n )\n\n callbacks?.onSuccess?.(result)\n callbacks?.onStatusChange?.('3DS authentication complete')\n return result\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/api.ts","../src/environments.ts","../src/GreenPay3DS.ts"],"sourcesContent":["import type { ThreeDSSession, ThreeDSResult } from './types'\nimport { GreenPay3DSError } from './GreenPay3DS'\n\nexport async function createSession(\n apiUrl: string,\n cardData: { ed: string; session: string },\n sessionToken: string,\n terminalId?: string\n): Promise<ThreeDSSession> {\n const requestBody: Record<string, unknown> = { cardData }\n if (terminalId !== undefined && terminalId !== '') {\n requestBody.terminalId = terminalId\n }\n\n const response = await fetch(`${apiUrl}/3ds/create-session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'session-token': sessionToken,\n },\n body: JSON.stringify(requestBody),\n })\n\n const json = await response.json()\n\n if (!response.ok || json.statusCode !== 200) {\n throw new GreenPay3DSError(\n json?.result?.error?.message ||\n json?.message ||\n 'Failed to create 3DS session',\n 'CREATE_SESSION_FAILED'\n )\n }\n\n return json.data\n}\n\nexport async function retrieveSession(\n apiUrl: string,\n sessionId: string,\n cardData: { ed: string; session: string },\n sessionToken: string\n): Promise<ThreeDSResult> {\n const response = await fetch(`${apiUrl}/3ds/retrieve-session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'session-token': sessionToken,\n },\n body: JSON.stringify({ sessionId, cardData }),\n })\n\n const body = await response.json()\n\n if (!response.ok || body.statusCode !== 200) {\n throw new GreenPay3DSError(\n body?.result?.error?.message || body?.message || 'Failed to retrieve 3DS session',\n 'RETRIEVE_SESSION_FAILED'\n )\n }\n\n return body\n}\n","import type { GreenPay3DSEnvironment } from './types'\n\nexport interface EnvironmentConfig {\n teamId: string\n appId: string\n apiUrl: string\n}\n\nexport const ENVIRONMENTS: Record<GreenPay3DSEnvironment, EnvironmentConfig> = {\n prod: {\n teamId: 'team_115ea2493762',\n appId: 'app_86bb433bb19f',\n apiUrl: 'https://checkoutv2.greenpay.me',\n },\n sbx: {\n teamId: 'team_115ea2493762',\n appId: 'app_910ecf6fb931',\n apiUrl: 'https://checkoutv2.greenpaysbx.me',\n },\n}\n","import type {\n GreenPay3DSConfig,\n ThreeDSCallbacks,\n ThreeDSPaymentCallbacks,\n OrderData,\n ThreeDSResult,\n} from './types'\nimport { createSession, retrieveSession } from './api'\nimport { ENVIRONMENTS } from './environments'\n\nexport class GreenPay3DSError extends Error {\n code: string\n\n constructor(message: string, code: string) {\n super(message)\n this.name = 'GreenPay3DSError'\n this.code = code\n }\n}\n\nexport class GreenPay3DS {\n private teamId: string\n private appId: string\n private apiUrl?: string\n\n constructor(config: GreenPay3DSConfig = {}) {\n const defaults =\n config.environment !== undefined\n ? ENVIRONMENTS[config.environment]\n : undefined\n\n if (config.environment !== undefined && !defaults) {\n throw new GreenPay3DSError(\n `Unknown environment \"${config.environment}\" (expected \"prod\" or \"sbx\")`,\n 'INVALID_CONFIG'\n )\n }\n\n this.teamId = config.teamId ?? defaults?.teamId ?? ''\n this.appId = config.appId ?? defaults?.appId ?? ''\n this.apiUrl = config.apiUrl ?? defaults?.apiUrl\n\n if (!this.teamId || !this.appId) {\n throw new GreenPay3DSError(\n 'Set environment (\"prod\" or \"sbx\"), or pass teamId and appId explicitly',\n 'INVALID_CONFIG'\n )\n }\n }\n\n async authenticate(\n sessionId: string,\n callbacks?: ThreeDSCallbacks\n ): Promise<void> {\n if (!sessionId) {\n throw new GreenPay3DSError('sessionId is required', 'INVALID_SESSION')\n }\n\n callbacks?.onStatusChange?.('Loading 3DS authentication...')\n\n const { loadEvervault } = await import('@evervault/js')\n const ev = await loadEvervault(this.teamId, this.appId)\n\n callbacks?.onStatusChange?.('Initializing 3DS challenge...')\n\n return new Promise<void>((resolve, reject) => {\n const threeDSecure = ev.ui.threeDSecure(sessionId)\n\n threeDSecure.on('ready', () => {\n callbacks?.onReady?.()\n callbacks?.onStatusChange?.(\n 'Challenge ready. If frictionless it will complete automatically, otherwise complete the verification prompt.'\n )\n })\n\n threeDSecure.on('success', () => {\n callbacks?.onSuccess?.()\n callbacks?.onStatusChange?.('Authentication successful')\n resolve()\n })\n\n threeDSecure.on('failure', () => {\n const msg = '3DS authentication was rejected by the issuer'\n callbacks?.onFailure?.(msg)\n callbacks?.onStatusChange?.('Authentication failed')\n reject(new GreenPay3DSError(msg, 'AUTHENTICATION_FAILED'))\n })\n\n threeDSecure.on('error', (err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err)\n callbacks?.onError?.(err instanceof Error ? err : msg)\n callbacks?.onStatusChange?.('Authentication error')\n reject(new GreenPay3DSError(msg, 'AUTHENTICATION_ERROR'))\n })\n\n threeDSecure.mount()\n })\n }\n\n async processPayment(\n orderData: OrderData,\n callbacks?: ThreeDSPaymentCallbacks\n ): Promise<ThreeDSResult> {\n if (!this.apiUrl) {\n throw new GreenPay3DSError(\n 'apiUrl is required in config for processPayment',\n 'INVALID_CONFIG'\n )\n }\n\n const { cardData, sessionToken, terminalId } = orderData\n if (!cardData?.ed || !cardData?.session || !sessionToken) {\n throw new GreenPay3DSError(\n 'cardData.ed, cardData.session, and sessionToken are required',\n 'INVALID_ORDER_DATA'\n )\n }\n\n callbacks?.onStatusChange?.('Creating 3DS session...')\n const session = await createSession(\n this.apiUrl,\n cardData,\n sessionToken,\n terminalId\n )\n\n callbacks?.onStatusChange?.('Starting 3DS authentication...')\n await this.authenticate(session.id, {\n onReady: callbacks?.onReady,\n onFailure: callbacks?.onFailure,\n onError: callbacks?.onError,\n onStatusChange: callbacks?.onStatusChange,\n })\n\n callbacks?.onStatusChange?.('Retrieving authentication result...')\n const result = await retrieveSession(\n this.apiUrl,\n session.id,\n cardData,\n sessionToken\n )\n\n callbacks?.onSuccess?.(result)\n callbacks?.onStatusChange?.('3DS authentication complete')\n return result\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@greenpay_prod/3ds-sdk",
3
- "version": "0.1.4-qa.0",
3
+ "version": "0.2.1-qa.0",
4
4
  "description": "GreenPay 3D Secure SDK — client-side 3DS authentication",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",