@lightspeed/online-payments-sdk 0.1.1 → 0.1.3

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,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FrameMessenger = void 0;
4
+ var createFrameMessenger = function (hostWindow, contentIframe, contentOrigin) {
5
+ var publishMessage = function (eventType, payload) {
6
+ if (contentIframe.contentWindow) {
7
+ contentIframe.contentWindow.postMessage({ type: eventType, payload: payload }, contentOrigin);
8
+ return {
9
+ success: true,
10
+ };
11
+ }
12
+ else {
13
+ return {
14
+ success: false,
15
+ message: 'Failed to send event',
16
+ };
17
+ }
18
+ };
19
+ // if the events are not getting received its because you changed window to hostWindow
20
+ var awaitMessage = function (eventType) {
21
+ return new Promise(function (resolve) {
22
+ var handler = function (event) {
23
+ if (event.origin === contentOrigin) {
24
+ if (validateEventTypeAndPayload(eventType, event.data)) {
25
+ hostWindow.removeEventListener('message', handler);
26
+ resolve(event.data);
27
+ }
28
+ }
29
+ };
30
+ hostWindow.addEventListener('message', handler);
31
+ });
32
+ };
33
+ return {
34
+ publishMessage: publishMessage,
35
+ awaitMessage: awaitMessage,
36
+ };
37
+ };
38
+ function validateEventTypeAndPayload(eventType, event) {
39
+ var _a, _b, _c, _d;
40
+ var e = event;
41
+ if (e.type !== eventType) {
42
+ return false;
43
+ }
44
+ switch (eventType) {
45
+ case 'READY':
46
+ return true;
47
+ case 'COMPLETE': {
48
+ var completeEvent = e;
49
+ return ((_b = (_a = completeEvent === null || completeEvent === void 0 ? void 0 : completeEvent.payload) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.paymentId) !== undefined;
50
+ }
51
+ case 'ERROR': {
52
+ var errorEvent = e;
53
+ return ((_d = (_c = errorEvent.payload) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.code) !== undefined;
54
+ }
55
+ default:
56
+ return false;
57
+ }
58
+ }
59
+ exports.FrameMessenger = { createFrameMessenger: createFrameMessenger };
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.mountLightspeedPayments = void 0;
40
+ var frameMessenger_1 = require("./frameMessenger");
41
+ var getContentHostname = function () {
42
+ var _a, _b;
43
+ return ((_b = (_a = process.env.OVERRIDE_IFRAME_CONTENT_HOSTNAME) !== null && _a !== void 0 ? _a : process.env.IFRAME_CONTENT_HOSTNAME) !== null && _b !== void 0 ? _b : '');
44
+ };
45
+ function createOnlinePaymentsInterface(messenger) {
46
+ var _this = this;
47
+ return {
48
+ collectPaymentMethod: function (paymentSessionId) { return __awaiter(_this, void 0, void 0, function () {
49
+ var responseListeners, response;
50
+ return __generator(this, function (_a) {
51
+ switch (_a.label) {
52
+ case 0:
53
+ responseListeners = Promise.race([
54
+ messenger.awaitMessage('COMPLETE'),
55
+ messenger.awaitMessage('ERROR'),
56
+ ]);
57
+ messenger.publishMessage('SET_PAYMENT_SESSION_V1', { paymentSessionId: paymentSessionId });
58
+ return [4 /*yield*/, responseListeners];
59
+ case 1:
60
+ response = _a.sent();
61
+ if (response.type === 'COMPLETE') {
62
+ return [2 /*return*/, {
63
+ success: true,
64
+ paymentId: response.payload.data.paymentId,
65
+ }];
66
+ }
67
+ throw Error(response.payload.data.message);
68
+ }
69
+ });
70
+ }); },
71
+ };
72
+ }
73
+ function mountLightspeedPayments(mountPoint) {
74
+ return __awaiter(this, void 0, void 0, function () {
75
+ var contentHostname, lspIframe, messenger, ready;
76
+ return __generator(this, function (_a) {
77
+ contentHostname = getContentHostname();
78
+ lspIframe = window.document.createElement('iframe');
79
+ lspIframe.height = '800px';
80
+ lspIframe.width = '700px';
81
+ lspIframe.src = contentHostname;
82
+ if (!mountPoint) {
83
+ throw Error('HtmlElement to mount checkout to is required. Received undefined');
84
+ }
85
+ messenger = frameMessenger_1.FrameMessenger.createFrameMessenger(window, lspIframe, contentHostname);
86
+ ready = messenger.awaitMessage('READY');
87
+ mountPoint.appendChild(lspIframe);
88
+ // Only return the messenger once it is verified that the content within the iframe is listening
89
+ return [2 /*return*/, ready.then(function () { return createOnlinePaymentsInterface(messenger); })];
90
+ });
91
+ });
92
+ }
93
+ exports.mountLightspeedPayments = mountLightspeedPayments;
@@ -0,0 +1,41 @@
1
+ type PublishableMessagePayloadMapping = {
2
+ SET_PAYMENT_SESSION_V1: {
3
+ paymentSessionId: string;
4
+ };
5
+ };
6
+ type PublishableMessage = keyof PublishableMessagePayloadMapping;
7
+ type MessageEventData<K extends AwaitableMessage, T> = {
8
+ type: K;
9
+ payload: T;
10
+ };
11
+ export type AwaitableMessagePayloadMap = {
12
+ READY: MessageEventData<'READY', undefined>;
13
+ ERROR: MessageEventData<'ERROR', {
14
+ version: string;
15
+ data: {
16
+ code: string;
17
+ message: string;
18
+ };
19
+ }>;
20
+ COMPLETE: MessageEventData<'COMPLETE', {
21
+ version: string;
22
+ data: {
23
+ paymentId: string;
24
+ };
25
+ }>;
26
+ };
27
+ export type AwaitableMessage = keyof AwaitableMessagePayloadMap;
28
+ type PublishMessageResult = {
29
+ success: true;
30
+ } | {
31
+ success: false;
32
+ message: string;
33
+ };
34
+ export type FrameMessenger = {
35
+ awaitMessage<T extends AwaitableMessage>(eventType: T): Promise<AwaitableMessagePayloadMap[T]>;
36
+ publishMessage<T extends PublishableMessage>(eventType: T, payload: PublishableMessagePayloadMapping[T]): PublishMessageResult;
37
+ };
38
+ export declare const FrameMessenger: {
39
+ createFrameMessenger: (hostWindow: Window, contentIframe: HTMLIFrameElement, contentOrigin: string) => FrameMessenger;
40
+ };
41
+ export {};
@@ -0,0 +1,56 @@
1
+ var createFrameMessenger = function (hostWindow, contentIframe, contentOrigin) {
2
+ var publishMessage = function (eventType, payload) {
3
+ if (contentIframe.contentWindow) {
4
+ contentIframe.contentWindow.postMessage({ type: eventType, payload: payload }, contentOrigin);
5
+ return {
6
+ success: true,
7
+ };
8
+ }
9
+ else {
10
+ return {
11
+ success: false,
12
+ message: 'Failed to send event',
13
+ };
14
+ }
15
+ };
16
+ // if the events are not getting received its because you changed window to hostWindow
17
+ var awaitMessage = function (eventType) {
18
+ return new Promise(function (resolve) {
19
+ var handler = function (event) {
20
+ if (event.origin === contentOrigin) {
21
+ if (validateEventTypeAndPayload(eventType, event.data)) {
22
+ hostWindow.removeEventListener('message', handler);
23
+ resolve(event.data);
24
+ }
25
+ }
26
+ };
27
+ hostWindow.addEventListener('message', handler);
28
+ });
29
+ };
30
+ return {
31
+ publishMessage: publishMessage,
32
+ awaitMessage: awaitMessage,
33
+ };
34
+ };
35
+ function validateEventTypeAndPayload(eventType, event) {
36
+ var _a, _b, _c, _d;
37
+ var e = event;
38
+ if (e.type !== eventType) {
39
+ return false;
40
+ }
41
+ switch (eventType) {
42
+ case 'READY':
43
+ return true;
44
+ case 'COMPLETE': {
45
+ var completeEvent = e;
46
+ return ((_b = (_a = completeEvent === null || completeEvent === void 0 ? void 0 : completeEvent.payload) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.paymentId) !== undefined;
47
+ }
48
+ case 'ERROR': {
49
+ var errorEvent = e;
50
+ return ((_d = (_c = errorEvent.payload) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.code) !== undefined;
51
+ }
52
+ default:
53
+ return false;
54
+ }
55
+ }
56
+ export var FrameMessenger = { createFrameMessenger: createFrameMessenger };
@@ -0,0 +1,11 @@
1
+ export type Configuration = {
2
+ payment_session: string;
3
+ };
4
+ export type CollectPaymentMethodResponse = {
5
+ success: true;
6
+ paymentId: string;
7
+ };
8
+ export type OnlinePaymentsInterface = {
9
+ collectPaymentMethod(paymentSessionId: string): Promise<CollectPaymentMethodResponse>;
10
+ };
11
+ export declare function mountLightspeedPayments(mountPoint: HTMLElement): Promise<OnlinePaymentsInterface>;
package/dist/index.js ADDED
@@ -0,0 +1,89 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { FrameMessenger } from './frameMessenger';
38
+ var getContentHostname = function () {
39
+ var _a, _b;
40
+ return ((_b = (_a = process.env.OVERRIDE_IFRAME_CONTENT_HOSTNAME) !== null && _a !== void 0 ? _a : process.env.IFRAME_CONTENT_HOSTNAME) !== null && _b !== void 0 ? _b : '');
41
+ };
42
+ function createOnlinePaymentsInterface(messenger) {
43
+ var _this = this;
44
+ return {
45
+ collectPaymentMethod: function (paymentSessionId) { return __awaiter(_this, void 0, void 0, function () {
46
+ var responseListeners, response;
47
+ return __generator(this, function (_a) {
48
+ switch (_a.label) {
49
+ case 0:
50
+ responseListeners = Promise.race([
51
+ messenger.awaitMessage('COMPLETE'),
52
+ messenger.awaitMessage('ERROR'),
53
+ ]);
54
+ messenger.publishMessage('SET_PAYMENT_SESSION_V1', { paymentSessionId: paymentSessionId });
55
+ return [4 /*yield*/, responseListeners];
56
+ case 1:
57
+ response = _a.sent();
58
+ if (response.type === 'COMPLETE') {
59
+ return [2 /*return*/, {
60
+ success: true,
61
+ paymentId: response.payload.data.paymentId,
62
+ }];
63
+ }
64
+ throw Error(response.payload.data.message);
65
+ }
66
+ });
67
+ }); },
68
+ };
69
+ }
70
+ export function mountLightspeedPayments(mountPoint) {
71
+ return __awaiter(this, void 0, void 0, function () {
72
+ var contentHostname, lspIframe, messenger, ready;
73
+ return __generator(this, function (_a) {
74
+ contentHostname = getContentHostname();
75
+ lspIframe = window.document.createElement('iframe');
76
+ lspIframe.height = '800px';
77
+ lspIframe.width = '700px';
78
+ lspIframe.src = contentHostname;
79
+ if (!mountPoint) {
80
+ throw Error('HtmlElement to mount checkout to is required. Received undefined');
81
+ }
82
+ messenger = FrameMessenger.createFrameMessenger(window, lspIframe, contentHostname);
83
+ ready = messenger.awaitMessage('READY');
84
+ mountPoint.appendChild(lspIframe);
85
+ // Only return the messenger once it is verified that the content within the iframe is listening
86
+ return [2 /*return*/, ready.then(function () { return createOnlinePaymentsInterface(messenger); })];
87
+ });
88
+ });
89
+ }
package/package.json CHANGED
@@ -1,8 +1,7 @@
1
1
  {
2
2
  "name": "@lightspeed/online-payments-sdk",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Process online-payments with Lightspeed Payments",
5
- "type": "module",
6
5
  "author": "Lightspeed Commerce Inc.",
7
6
  "license": "SEE LICENSE IN LICENSE.md",
8
7
  "main": "dist/cjs/index.js",