@nimee/wallet-generator 1.0.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/apple/ApplePassGenerator.d.ts +71 -0
- package/dist/apple/ApplePassGenerator.js +262 -0
- package/dist/apple/ApplePassGenerator.js.map +1 -0
- package/dist/apple/signPassWorker.d.ts +1 -0
- package/dist/apple/signPassWorker.js +44 -0
- package/dist/apple/signPassWorker.js.map +1 -0
- package/dist/apple/template.pass/icon.png +0 -0
- package/dist/apple/template.pass/icon@2x.png +0 -0
- package/dist/apple/template.pass/logo.png +0 -0
- package/dist/apple/template.pass/logo@2x.png +0 -0
- package/dist/apple/template.pass/pass.json +16 -0
- package/dist/apple/template.pass/template.pass/icon.png +0 -0
- package/dist/apple/template.pass/template.pass/icon@2x.png +0 -0
- package/dist/apple/template.pass/template.pass/logo.png +0 -0
- package/dist/apple/template.pass/template.pass/logo@2x.png +0 -0
- package/dist/apple/template.pass/template.pass/pass.json +16 -0
- package/dist/google/GooglePassGenerator.d.ts +31 -0
- package/dist/google/GooglePassGenerator.js +103 -0
- package/dist/google/GooglePassGenerator.js.map +1 -0
- package/dist/google/googleAuth.d.ts +11 -0
- package/dist/google/googleAuth.js +99 -0
- package/dist/google/googleAuth.js.map +1 -0
- package/dist/helpers/colorHelpers.d.ts +9 -0
- package/dist/helpers/colorHelpers.js +32 -0
- package/dist/helpers/colorHelpers.js.map +1 -0
- package/dist/helpers/imageHelpers.d.ts +23 -0
- package/dist/helpers/imageHelpers.js +94 -0
- package/dist/helpers/imageHelpers.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/jest.config.js +18 -0
- package/package.json +38 -0
- package/src/apple/ApplePassGenerator.ts +291 -0
- package/src/apple/signPassWorker.ts +52 -0
- package/src/apple/template.pass/icon.png +0 -0
- package/src/apple/template.pass/icon@2x.png +0 -0
- package/src/apple/template.pass/logo.png +0 -0
- package/src/apple/template.pass/logo@2x.png +0 -0
- package/src/apple/template.pass/pass.json +16 -0
- package/src/google/GooglePassGenerator.ts +104 -0
- package/src/google/googleAuth.ts +134 -0
- package/src/helpers/colorHelpers.ts +34 -0
- package/src/helpers/imageHelpers.ts +87 -0
- package/src/index.ts +5 -0
- package/src/types.ts +66 -0
- package/tests/apple/ApplePassGenerator.test.ts +47 -0
- package/tests/google/GooglePassGenerator.test.ts +47 -0
- package/tests/helpers/colorHelpers.test.ts +30 -0
- package/tests/helpers/imageHelpers.test.ts +19 -0
- package/tsconfig.json +28 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { IWalletPassData, IAppleWalletConfig, IWalletLayoutField } from '../types';
|
|
3
|
+
export interface ApplePassGeneratorOptions {
|
|
4
|
+
/** Allowed image host list passed to downloadImageBuffer. Empty = all https hosts. */
|
|
5
|
+
allowedHosts?: string[];
|
|
6
|
+
/** Worker thread timeout in milliseconds. Defaults to 15 000. */
|
|
7
|
+
workerTimeoutMs?: number;
|
|
8
|
+
}
|
|
9
|
+
interface PassImage {
|
|
10
|
+
name: string;
|
|
11
|
+
buffer: Buffer;
|
|
12
|
+
}
|
|
13
|
+
interface WorkerPayload {
|
|
14
|
+
modelPath: string;
|
|
15
|
+
certificates: {
|
|
16
|
+
signerCert: string;
|
|
17
|
+
signerKey: string;
|
|
18
|
+
wwdr: string;
|
|
19
|
+
};
|
|
20
|
+
passOverrides: Record<string, unknown>;
|
|
21
|
+
images: PassImage[];
|
|
22
|
+
barcodes: {
|
|
23
|
+
message: string;
|
|
24
|
+
format: string;
|
|
25
|
+
messageEncoding: string;
|
|
26
|
+
};
|
|
27
|
+
layoutFields: Array<{
|
|
28
|
+
key: string;
|
|
29
|
+
label: string;
|
|
30
|
+
value: string;
|
|
31
|
+
row: string;
|
|
32
|
+
}>;
|
|
33
|
+
relevantDate: string;
|
|
34
|
+
}
|
|
35
|
+
export declare class ApplePassGenerator {
|
|
36
|
+
private readonly allowedHosts;
|
|
37
|
+
private readonly workerTimeoutMs;
|
|
38
|
+
constructor(options?: ApplePassGeneratorOptions);
|
|
39
|
+
/**
|
|
40
|
+
* Generates a signed Apple Wallet pass buffer.
|
|
41
|
+
*
|
|
42
|
+
* @param data - Caller-assembled pass data (all DB resolution done upstream).
|
|
43
|
+
* @param config - Apple certificates and identifiers.
|
|
44
|
+
* @param defaultLayout - Layout fields to use when data.layout is absent.
|
|
45
|
+
* @returns Signed `.pkpass` buffer ready to stream to the client.
|
|
46
|
+
*/
|
|
47
|
+
generate(data: IWalletPassData, config: IAppleWalletConfig, defaultLayout: IWalletLayoutField[]): Promise<Buffer>;
|
|
48
|
+
/**
|
|
49
|
+
* Returns the absolute path to the `.pass` template directory.
|
|
50
|
+
* Uses `config.templatePath` when provided; otherwise falls back to the
|
|
51
|
+
* bundled template shipped with the library.
|
|
52
|
+
*/
|
|
53
|
+
resolveTemplatePath(config: IAppleWalletConfig): string;
|
|
54
|
+
/**
|
|
55
|
+
* Spawns the `signPassWorker` in a worker thread and returns the signed buffer.
|
|
56
|
+
* Automatically selects the compiled `.js` file in production and falls back to
|
|
57
|
+
* the `.ts` source in development (when ts-node is available).
|
|
58
|
+
*/
|
|
59
|
+
spawnWorker(workerData: WorkerPayload): Promise<Buffer>;
|
|
60
|
+
/**
|
|
61
|
+
* Downloads logo and strip images in parallel, resizes them to Apple specs,
|
|
62
|
+
* and returns a flat list of named buffers ready to pass to the worker.
|
|
63
|
+
*/
|
|
64
|
+
private prepareImages;
|
|
65
|
+
/**
|
|
66
|
+
* Resolves layout fields from pass data (or falls back to `defaultLayout`),
|
|
67
|
+
* filters out hidden rows, and maps each field key to a label/value pair.
|
|
68
|
+
*/
|
|
69
|
+
private resolveLayout;
|
|
70
|
+
}
|
|
71
|
+
export {};
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.ApplePassGenerator = void 0;
|
|
36
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const worker_threads_1 = require("worker_threads");
|
|
39
|
+
const imageHelpers = __importStar(require("../helpers/imageHelpers"));
|
|
40
|
+
// ─── Apple pass image dimensions ─────────────────────────────────────────────
|
|
41
|
+
const LOGO_1X = { w: 160, h: 50 };
|
|
42
|
+
const LOGO_2X = { w: 320, h: 100 };
|
|
43
|
+
const ICON_1X = { w: 29, h: 29 };
|
|
44
|
+
const ICON_2X = { w: 58, h: 58 };
|
|
45
|
+
const STRIP_1X = { w: 375, h: 123 };
|
|
46
|
+
const STRIP_2X = { w: 750, h: 246 };
|
|
47
|
+
// ─── Field resolver ───────────────────────────────────────────────────────────
|
|
48
|
+
/**
|
|
49
|
+
* Maps a layout field key to a label/value pair derived from pass data.
|
|
50
|
+
* Keys are the same ones used in the user-event WalletService.
|
|
51
|
+
*/
|
|
52
|
+
function resolveField(key, data) {
|
|
53
|
+
switch (key) {
|
|
54
|
+
case 'event':
|
|
55
|
+
case 'passTitle':
|
|
56
|
+
return data.passTitle ? { label: 'Event', value: data.passTitle } : undefined;
|
|
57
|
+
case 'holder':
|
|
58
|
+
case 'holderName':
|
|
59
|
+
case 'attendee':
|
|
60
|
+
return data.holderName ? { label: 'Name', value: data.holderName } : undefined;
|
|
61
|
+
case 'date':
|
|
62
|
+
case 'dateDisplay':
|
|
63
|
+
return data.dateDisplay ? { label: 'Date', value: data.dateDisplay } : undefined;
|
|
64
|
+
case 'seat':
|
|
65
|
+
return data.seat ? { label: 'Seat', value: data.seat } : undefined;
|
|
66
|
+
case 'order':
|
|
67
|
+
case 'orderNumber':
|
|
68
|
+
return data.orderNumber ? { label: 'Order', value: data.orderNumber } : undefined;
|
|
69
|
+
case 'subtitle':
|
|
70
|
+
case 'passSubtitle':
|
|
71
|
+
return data.passSubtitle ? { label: 'Ticket', value: data.passSubtitle } : undefined;
|
|
72
|
+
case 'plan_name':
|
|
73
|
+
return data.passTitle ? { label: 'Plan', value: data.passTitle } : undefined;
|
|
74
|
+
case 'member_name':
|
|
75
|
+
return data.holderName ? { label: 'Member', value: data.holderName } : undefined;
|
|
76
|
+
case 'valid_from': {
|
|
77
|
+
const value = data.dateDisplay || (data.startDate ? data.startDate.toLocaleDateString('he-IL') : '') || '';
|
|
78
|
+
return value ? { label: 'Valid From', value } : undefined;
|
|
79
|
+
}
|
|
80
|
+
case 'valid_to': {
|
|
81
|
+
const value = data.endDate ? data.endDate.toLocaleDateString('he-IL') : '';
|
|
82
|
+
return value ? { label: 'Valid To', value } : undefined;
|
|
83
|
+
}
|
|
84
|
+
default:
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// ─── ApplePassGenerator ───────────────────────────────────────────────────────
|
|
89
|
+
class ApplePassGenerator {
|
|
90
|
+
constructor(options = {}) {
|
|
91
|
+
var _a, _b;
|
|
92
|
+
this.allowedHosts = (_a = options.allowedHosts) !== null && _a !== void 0 ? _a : [];
|
|
93
|
+
this.workerTimeoutMs = (_b = options.workerTimeoutMs) !== null && _b !== void 0 ? _b : 15000;
|
|
94
|
+
}
|
|
95
|
+
// ── Public API ─────────────────────────────────────────────────────────────
|
|
96
|
+
/**
|
|
97
|
+
* Generates a signed Apple Wallet pass buffer.
|
|
98
|
+
*
|
|
99
|
+
* @param data - Caller-assembled pass data (all DB resolution done upstream).
|
|
100
|
+
* @param config - Apple certificates and identifiers.
|
|
101
|
+
* @param defaultLayout - Layout fields to use when data.layout is absent.
|
|
102
|
+
* @returns Signed `.pkpass` buffer ready to stream to the client.
|
|
103
|
+
*/
|
|
104
|
+
generate(data, config, defaultLayout) {
|
|
105
|
+
var _a, _b, _c;
|
|
106
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
107
|
+
const images = yield this.prepareImages(data);
|
|
108
|
+
const layoutFields = this.resolveLayout(data, defaultLayout);
|
|
109
|
+
const modelPath = this.resolveTemplatePath(config);
|
|
110
|
+
const passOverrides = Object.assign(Object.assign(Object.assign(Object.assign({ passTypeIdentifier: config.passTypeIdentifier, teamIdentifier: config.teamIdentifier, serialNumber: data.objectId, description: data.passTitle, organizationName: (_a = data.marketplaceName) !== null && _a !== void 0 ? _a : 'Nimi', logoText: (_b = data.marketplaceName) !== null && _b !== void 0 ? _b : 'Nimi' }, (data.backgroundColor && { backgroundColor: data.backgroundColor })), (data.foregroundColor && { foregroundColor: data.foregroundColor })), (data.labelColor && { labelColor: data.labelColor })), (data.isCheckedIn && { voided: true }));
|
|
111
|
+
const workerPayload = {
|
|
112
|
+
modelPath,
|
|
113
|
+
certificates: {
|
|
114
|
+
signerCert: config.cert,
|
|
115
|
+
signerKey: config.key,
|
|
116
|
+
wwdr: config.wwdr,
|
|
117
|
+
},
|
|
118
|
+
passOverrides,
|
|
119
|
+
images,
|
|
120
|
+
barcodes: {
|
|
121
|
+
message: data.qrContent,
|
|
122
|
+
format: 'PKBarcodeFormatQR',
|
|
123
|
+
messageEncoding: 'iso-8859-1',
|
|
124
|
+
},
|
|
125
|
+
layoutFields,
|
|
126
|
+
relevantDate: ((_c = data.startDate) !== null && _c !== void 0 ? _c : new Date()).toISOString(),
|
|
127
|
+
};
|
|
128
|
+
return this.spawnWorker(workerPayload);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
// ── Template path resolution ───────────────────────────────────────────────
|
|
132
|
+
/**
|
|
133
|
+
* Returns the absolute path to the `.pass` template directory.
|
|
134
|
+
* Uses `config.templatePath` when provided; otherwise falls back to the
|
|
135
|
+
* bundled template shipped with the library.
|
|
136
|
+
*/
|
|
137
|
+
resolveTemplatePath(config) {
|
|
138
|
+
var _a;
|
|
139
|
+
return (_a = config.templatePath) !== null && _a !== void 0 ? _a : path.join(__dirname, "template.pass");
|
|
140
|
+
}
|
|
141
|
+
// ── Worker spawn ───────────────────────────────────────────────────────────
|
|
142
|
+
/**
|
|
143
|
+
* Spawns the `signPassWorker` in a worker thread and returns the signed buffer.
|
|
144
|
+
* Automatically selects the compiled `.js` file in production and falls back to
|
|
145
|
+
* the `.ts` source in development (when ts-node is available).
|
|
146
|
+
*/
|
|
147
|
+
spawnWorker(workerData) {
|
|
148
|
+
const jsPath = path.resolve(__dirname, 'signPassWorker.js');
|
|
149
|
+
const tsPath = path.resolve(__dirname, 'signPassWorker.ts');
|
|
150
|
+
const workerPath = require('fs').existsSync(jsPath) ? jsPath : tsPath;
|
|
151
|
+
const { workerTimeoutMs } = this;
|
|
152
|
+
return new Promise((resolve, reject) => {
|
|
153
|
+
const isTs = workerPath.endsWith('.ts');
|
|
154
|
+
const worker = new worker_threads_1.Worker(workerPath, Object.assign(Object.assign({}, (isTs && { execArgv: ['--require', 'ts-node/register'] })), { workerData }));
|
|
155
|
+
const cleanup = () => {
|
|
156
|
+
clearTimeout(timer);
|
|
157
|
+
worker.removeAllListeners();
|
|
158
|
+
};
|
|
159
|
+
const timer = setTimeout(() => {
|
|
160
|
+
cleanup();
|
|
161
|
+
worker.terminate();
|
|
162
|
+
reject(new Error(`[ApplePassGenerator] worker timed out after ${workerTimeoutMs}ms`));
|
|
163
|
+
}, workerTimeoutMs);
|
|
164
|
+
worker.on('message', (msg) => {
|
|
165
|
+
cleanup();
|
|
166
|
+
if (msg === null || msg === void 0 ? void 0 : msg.error) {
|
|
167
|
+
reject(new Error(msg.error));
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
resolve(Buffer.from(msg));
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
worker.on('error', (err) => {
|
|
174
|
+
cleanup();
|
|
175
|
+
reject(err);
|
|
176
|
+
});
|
|
177
|
+
worker.on('exit', (code) => {
|
|
178
|
+
cleanup();
|
|
179
|
+
if (code !== 0) {
|
|
180
|
+
reject(new Error(`[ApplePassGenerator] worker exited with code ${code}`));
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
// ── Private helpers ────────────────────────────────────────────────────────
|
|
186
|
+
/**
|
|
187
|
+
* Downloads logo and strip images in parallel, resizes them to Apple specs,
|
|
188
|
+
* and returns a flat list of named buffers ready to pass to the worker.
|
|
189
|
+
*/
|
|
190
|
+
prepareImages(data) {
|
|
191
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
192
|
+
const imageTimeoutMs = 5000;
|
|
193
|
+
const [rawLogo, rawStrip] = yield Promise.all([
|
|
194
|
+
data.logoUrl
|
|
195
|
+
? imageHelpers.downloadImageBuffer(data.logoUrl, this.allowedHosts, imageTimeoutMs)
|
|
196
|
+
: Promise.resolve(undefined),
|
|
197
|
+
data.stripImageUrl
|
|
198
|
+
? imageHelpers.downloadImageBuffer(data.stripImageUrl, this.allowedHosts, imageTimeoutMs)
|
|
199
|
+
: Promise.resolve(undefined),
|
|
200
|
+
]);
|
|
201
|
+
// Fall back to bundled template icon when logo download fails or URL absent
|
|
202
|
+
let logoBuffer = rawLogo;
|
|
203
|
+
if (!logoBuffer) {
|
|
204
|
+
const templateIcon = path.join(__dirname, 'template.pass', 'icon.png');
|
|
205
|
+
try {
|
|
206
|
+
logoBuffer = yield fs.promises.readFile(templateIcon);
|
|
207
|
+
}
|
|
208
|
+
catch (_a) {
|
|
209
|
+
// No fallback available — pass will use whatever is baked into the template
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const images = [];
|
|
213
|
+
if (logoBuffer) {
|
|
214
|
+
const [logo1x, logo2x, icon1x, icon2x] = yield Promise.all([
|
|
215
|
+
imageHelpers.resizeImageBuffer(logoBuffer, LOGO_1X.w, LOGO_1X.h),
|
|
216
|
+
imageHelpers.resizeImageBuffer(logoBuffer, LOGO_2X.w, LOGO_2X.h),
|
|
217
|
+
imageHelpers.resizeImageBuffer(logoBuffer, ICON_1X.w, ICON_1X.h),
|
|
218
|
+
imageHelpers.resizeImageBuffer(logoBuffer, ICON_2X.w, ICON_2X.h),
|
|
219
|
+
]);
|
|
220
|
+
if (logo1x)
|
|
221
|
+
images.push({ name: 'logo.png', buffer: logo1x });
|
|
222
|
+
if (logo2x)
|
|
223
|
+
images.push({ name: 'logo@2x.png', buffer: logo2x });
|
|
224
|
+
if (icon1x)
|
|
225
|
+
images.push({ name: 'icon.png', buffer: icon1x });
|
|
226
|
+
if (icon2x)
|
|
227
|
+
images.push({ name: 'icon@2x.png', buffer: icon2x });
|
|
228
|
+
}
|
|
229
|
+
if (rawStrip) {
|
|
230
|
+
const [strip1x, strip2x] = yield Promise.all([
|
|
231
|
+
imageHelpers.resizeImageBuffer(rawStrip, STRIP_1X.w, STRIP_1X.h),
|
|
232
|
+
imageHelpers.resizeImageBuffer(rawStrip, STRIP_2X.w, STRIP_2X.h),
|
|
233
|
+
]);
|
|
234
|
+
if (strip1x)
|
|
235
|
+
images.push({ name: 'strip.png', buffer: strip1x });
|
|
236
|
+
if (strip2x)
|
|
237
|
+
images.push({ name: 'strip@2x.png', buffer: strip2x });
|
|
238
|
+
}
|
|
239
|
+
return images;
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Resolves layout fields from pass data (or falls back to `defaultLayout`),
|
|
244
|
+
* filters out hidden rows, and maps each field key to a label/value pair.
|
|
245
|
+
*/
|
|
246
|
+
resolveLayout(data, defaultLayout) {
|
|
247
|
+
var _a, _b;
|
|
248
|
+
const fields = ((_b = (_a = data.layout) === null || _a === void 0 ? void 0 : _a.fields) !== null && _b !== void 0 ? _b : defaultLayout)
|
|
249
|
+
.filter((f) => f.row !== 'hidden')
|
|
250
|
+
.sort((a, b) => a.position - b.position);
|
|
251
|
+
const result = [];
|
|
252
|
+
for (const f of fields) {
|
|
253
|
+
const resolved = resolveField(f.key, data);
|
|
254
|
+
if (!resolved)
|
|
255
|
+
continue;
|
|
256
|
+
result.push({ key: f.key, label: resolved.label, value: resolved.value, row: f.row });
|
|
257
|
+
}
|
|
258
|
+
return result;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
exports.ApplePassGenerator = ApplePassGenerator;
|
|
262
|
+
//# sourceMappingURL=ApplePassGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplePassGenerator.js","sourceRoot":"","sources":["../../src/apple/ApplePassGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const worker_threads_1 = require("worker_threads");
|
|
13
|
+
const passkit_generator_1 = require("passkit-generator");
|
|
14
|
+
function run() {
|
|
15
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
16
|
+
const data = worker_threads_1.workerData;
|
|
17
|
+
const pass = yield passkit_generator_1.PKPass.from({
|
|
18
|
+
model: data.modelPath,
|
|
19
|
+
certificates: data.certificates,
|
|
20
|
+
}, data.passOverrides);
|
|
21
|
+
pass.setRelevantDate(new Date(data.relevantDate));
|
|
22
|
+
for (const img of data.images) {
|
|
23
|
+
pass.addBuffer(img.name, Buffer.from(img.buffer));
|
|
24
|
+
}
|
|
25
|
+
pass.setBarcodes(data.barcodes);
|
|
26
|
+
for (const f of data.layoutFields) {
|
|
27
|
+
const entry = { key: f.key, label: f.label, value: f.value };
|
|
28
|
+
if (f.row === "header")
|
|
29
|
+
pass.headerFields.push(entry);
|
|
30
|
+
if (f.row === "secondary")
|
|
31
|
+
pass.secondaryFields.push(entry);
|
|
32
|
+
if (f.row === "auxiliary")
|
|
33
|
+
pass.auxiliaryFields.push(entry);
|
|
34
|
+
if (f.row === "back")
|
|
35
|
+
pass.backFields.push(entry);
|
|
36
|
+
}
|
|
37
|
+
const buffer = pass.getAsBuffer();
|
|
38
|
+
worker_threads_1.parentPort.postMessage(buffer);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
run().catch((err) => {
|
|
42
|
+
worker_threads_1.parentPort.postMessage({ error: err.message || String(err) });
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=signPassWorker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signPassWorker.js","sourceRoot":"","sources":["../../src/apple/signPassWorker.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,mDAAwD;AACxD,yDAA2C;AAiB3C,SAAe,GAAG;;QAChB,MAAM,IAAI,GAAG,2BAAwB,CAAC;QAEtC,MAAM,IAAI,GAAG,MAAM,0BAAM,CAAC,IAAI,CAC5B;YACE,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,EACD,IAAI,CAAC,aAAa,CACnB,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAElD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAe,CAAC,CAAC;QAEvC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YAC7D,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW;gBAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5D,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW;gBAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5D,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM;gBAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,2BAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;CAAA;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAClB,2BAAW,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC,CAAC,CAAC"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"formatVersion": 1,
|
|
3
|
+
"passTypeIdentifier": "pass.il.co.nimi.event-ticket",
|
|
4
|
+
"teamIdentifier": "PLACEHOLDER",
|
|
5
|
+
"organizationName": "PLACEHOLDER",
|
|
6
|
+
"description": "Event Ticket",
|
|
7
|
+
"foregroundColor": "rgb(255, 255, 255)",
|
|
8
|
+
"backgroundColor": "rgb(60, 65, 76)",
|
|
9
|
+
"labelColor": "rgb(200, 200, 200)",
|
|
10
|
+
"eventTicket": {
|
|
11
|
+
"primaryFields": [],
|
|
12
|
+
"secondaryFields": [],
|
|
13
|
+
"auxiliaryFields": [],
|
|
14
|
+
"backFields": []
|
|
15
|
+
}
|
|
16
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"formatVersion": 1,
|
|
3
|
+
"passTypeIdentifier": "pass.il.co.nimi.event-ticket",
|
|
4
|
+
"teamIdentifier": "PLACEHOLDER",
|
|
5
|
+
"organizationName": "PLACEHOLDER",
|
|
6
|
+
"description": "Event Ticket",
|
|
7
|
+
"foregroundColor": "rgb(255, 255, 255)",
|
|
8
|
+
"backgroundColor": "rgb(60, 65, 76)",
|
|
9
|
+
"labelColor": "rgb(200, 200, 200)",
|
|
10
|
+
"eventTicket": {
|
|
11
|
+
"primaryFields": [],
|
|
12
|
+
"secondaryFields": [],
|
|
13
|
+
"auxiliaryFields": [],
|
|
14
|
+
"backFields": []
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { IGoogleWalletConfig, IWalletPassData } from '../types';
|
|
2
|
+
export declare class GooglePassGenerator {
|
|
3
|
+
/**
|
|
4
|
+
* Builds the full Google Wallet class ID.
|
|
5
|
+
* Uses config.classId if provided; otherwise derives from issuerId + data.classIdSuffix.
|
|
6
|
+
*/
|
|
7
|
+
private buildClassId;
|
|
8
|
+
/**
|
|
9
|
+
* Ensures the Google Wallet EventTicketClass exists (creates or patches).
|
|
10
|
+
* Delegates to the shared googleAuth helper.
|
|
11
|
+
*/
|
|
12
|
+
private ensureClass;
|
|
13
|
+
/**
|
|
14
|
+
* Builds the Google Wallet ticket object payload.
|
|
15
|
+
* Delegates to the shared builder in googleAuth.
|
|
16
|
+
*/
|
|
17
|
+
private buildObject;
|
|
18
|
+
/**
|
|
19
|
+
* Signs the JWT payload with the service account private key using RS256.
|
|
20
|
+
*/
|
|
21
|
+
private signJwt;
|
|
22
|
+
/**
|
|
23
|
+
* Generates a Google Wallet "Add to Wallet" save URL for the given pass data.
|
|
24
|
+
*/
|
|
25
|
+
generateSaveUrl(data: IWalletPassData, config: IGoogleWalletConfig): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* PATCHes the Google Wallet object state (ACTIVE | EXPIRED | INACTIVE).
|
|
28
|
+
* Never throws — swallows all errors and logs a warning instead.
|
|
29
|
+
*/
|
|
30
|
+
updateObjectState(rawObjectId: string, config: IGoogleWalletConfig, state: 'ACTIVE' | 'EXPIRED' | 'INACTIVE'): Promise<void>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.GooglePassGenerator = void 0;
|
|
16
|
+
const axios_1 = __importDefault(require("axios"));
|
|
17
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
18
|
+
const logger_1 = __importDefault(require("@nimee/logger"));
|
|
19
|
+
const googleAuth_1 = require("./googleAuth");
|
|
20
|
+
class GooglePassGenerator {
|
|
21
|
+
/**
|
|
22
|
+
* Builds the full Google Wallet class ID.
|
|
23
|
+
* Uses config.classId if provided; otherwise derives from issuerId + data.classIdSuffix.
|
|
24
|
+
*/
|
|
25
|
+
buildClassId(data, config) {
|
|
26
|
+
if (config.classId) {
|
|
27
|
+
return config.classId;
|
|
28
|
+
}
|
|
29
|
+
const suffix = data.classIdSuffix || data.objectId;
|
|
30
|
+
return `${config.issuerId}.${suffix}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Ensures the Google Wallet EventTicketClass exists (creates or patches).
|
|
34
|
+
* Delegates to the shared googleAuth helper.
|
|
35
|
+
*/
|
|
36
|
+
ensureClass(classId, data, config) {
|
|
37
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
38
|
+
// Pass a config override with the resolved classId so ensureGoogleTicketClass
|
|
39
|
+
// uses exactly the classId we computed instead of recomputing it.
|
|
40
|
+
const configWithClass = Object.assign(Object.assign({}, config), { classId });
|
|
41
|
+
yield (0, googleAuth_1.ensureGoogleTicketClass)(configWithClass, data);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Builds the Google Wallet ticket object payload.
|
|
46
|
+
* Delegates to the shared builder in googleAuth.
|
|
47
|
+
*/
|
|
48
|
+
buildObject(objectId, classId, data) {
|
|
49
|
+
return (0, googleAuth_1.buildGoogleTicketObject)(objectId, classId, data);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Signs the JWT payload with the service account private key using RS256.
|
|
53
|
+
*/
|
|
54
|
+
signJwt(ticketObject, config) {
|
|
55
|
+
const claims = {
|
|
56
|
+
iss: config.serviceAccountEmail,
|
|
57
|
+
aud: 'google',
|
|
58
|
+
origins: [],
|
|
59
|
+
typ: 'savetowallet',
|
|
60
|
+
payload: {
|
|
61
|
+
eventTicketObjects: [ticketObject],
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
return jsonwebtoken_1.default.sign(claims, config.privateKey, { algorithm: 'RS256' });
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Generates a Google Wallet "Add to Wallet" save URL for the given pass data.
|
|
68
|
+
*/
|
|
69
|
+
generateSaveUrl(data, config) {
|
|
70
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
+
const classId = this.buildClassId(data, config);
|
|
72
|
+
yield this.ensureClass(classId, data, config);
|
|
73
|
+
const objectId = `${config.issuerId}.${data.objectId}`.replace(/[^a-zA-Z0-9_.\-]/g, '-');
|
|
74
|
+
const ticketObject = this.buildObject(objectId, classId, data);
|
|
75
|
+
const token = this.signJwt(ticketObject, config);
|
|
76
|
+
logger_1.default.info(`[GooglePassGenerator] save URL generated for objectId=${data.objectId}`);
|
|
77
|
+
return `https://pay.google.com/gp/v/save/${token}`;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* PATCHes the Google Wallet object state (ACTIVE | EXPIRED | INACTIVE).
|
|
82
|
+
* Never throws — swallows all errors and logs a warning instead.
|
|
83
|
+
*/
|
|
84
|
+
updateObjectState(rawObjectId, config, state) {
|
|
85
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
86
|
+
try {
|
|
87
|
+
const accessToken = yield (0, googleAuth_1.getGoogleAccessToken)(config);
|
|
88
|
+
const encodedId = encodeURIComponent(rawObjectId);
|
|
89
|
+
const url = `https://walletobjects.googleapis.com/walletobjects/v1/eventTicketObject/${encodedId}`;
|
|
90
|
+
yield axios_1.default.patch(url, { state }, {
|
|
91
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
92
|
+
timeout: 5000,
|
|
93
|
+
});
|
|
94
|
+
logger_1.default.info(`[GooglePassGenerator] object ${rawObjectId} state updated to ${state}`);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
logger_1.default.warn(`[GooglePassGenerator] failed to update object state for ${rawObjectId} → ${state}: ${err instanceof Error ? err.message : String(err)}`);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.GooglePassGenerator = GooglePassGenerator;
|
|
103
|
+
//# sourceMappingURL=GooglePassGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GooglePassGenerator.js","sourceRoot":"","sources":["../../src/google/GooglePassGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IGoogleWalletConfig, IWalletPassData } from "../types";
|
|
2
|
+
/** Exchanges service account credentials for a Google OAuth2 access token (cached for ~1 hour). */
|
|
3
|
+
export declare function getGoogleAccessToken(config: IGoogleWalletConfig): Promise<string>;
|
|
4
|
+
/**
|
|
5
|
+
* Ensures the Google Wallet EventTicketClass exists and is up to date.
|
|
6
|
+
* Skipped if successfully synced within the last hour.
|
|
7
|
+
* Attempts to create; if it already exists (409), patches instead.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensureGoogleTicketClass(config: IGoogleWalletConfig, data: IWalletPassData): Promise<void>;
|
|
10
|
+
export declare function buildGoogleTicketObject(objectId: string, classId: string, data: IWalletPassData): object;
|
|
11
|
+
export declare function buildGoogleTicketClass(classId: string, data: IWalletPassData): object;
|