@shdan/submesh 0.1.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.
Files changed (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/dist/contracts.d.ts +191 -0
  4. package/dist/contracts.d.ts.map +1 -0
  5. package/dist/contracts.js +2 -0
  6. package/dist/contracts.js.map +1 -0
  7. package/dist/drizzle/catalog-mapping-repository.d.ts +280 -0
  8. package/dist/drizzle/catalog-mapping-repository.d.ts.map +1 -0
  9. package/dist/drizzle/catalog-mapping-repository.js +62 -0
  10. package/dist/drizzle/catalog-mapping-repository.js.map +1 -0
  11. package/dist/drizzle/ensure-schema.d.ts +3 -0
  12. package/dist/drizzle/ensure-schema.d.ts.map +1 -0
  13. package/dist/drizzle/ensure-schema.js +100 -0
  14. package/dist/drizzle/ensure-schema.js.map +1 -0
  15. package/dist/drizzle/inbound-event-repository.d.ts +960 -0
  16. package/dist/drizzle/inbound-event-repository.d.ts.map +1 -0
  17. package/dist/drizzle/inbound-event-repository.js +148 -0
  18. package/dist/drizzle/inbound-event-repository.js.map +1 -0
  19. package/dist/drizzle/index.d.ts +40 -0
  20. package/dist/drizzle/index.d.ts.map +1 -0
  21. package/dist/drizzle/index.js +57 -0
  22. package/dist/drizzle/index.js.map +1 -0
  23. package/dist/drizzle/migrate.d.ts +11 -0
  24. package/dist/drizzle/migrate.d.ts.map +1 -0
  25. package/dist/drizzle/migrate.js +22 -0
  26. package/dist/drizzle/migrate.js.map +1 -0
  27. package/dist/drizzle/plan-repository.d.ts +497 -0
  28. package/dist/drizzle/plan-repository.d.ts.map +1 -0
  29. package/dist/drizzle/plan-repository.js +70 -0
  30. package/dist/drizzle/plan-repository.js.map +1 -0
  31. package/dist/drizzle/plugin-installation-repository.d.ts +26 -0
  32. package/dist/drizzle/plugin-installation-repository.d.ts.map +1 -0
  33. package/dist/drizzle/plugin-installation-repository.js +71 -0
  34. package/dist/drizzle/plugin-installation-repository.js.map +1 -0
  35. package/dist/drizzle/repository-set.d.ts +4 -0
  36. package/dist/drizzle/repository-set.d.ts.map +1 -0
  37. package/dist/drizzle/repository-set.js +19 -0
  38. package/dist/drizzle/repository-set.js.map +1 -0
  39. package/dist/drizzle/schema.d.ts +2370 -0
  40. package/dist/drizzle/schema.d.ts.map +1 -0
  41. package/dist/drizzle/schema.js +103 -0
  42. package/dist/drizzle/schema.js.map +1 -0
  43. package/dist/drizzle/subject-repository.d.ts +295 -0
  44. package/dist/drizzle/subject-repository.d.ts.map +1 -0
  45. package/dist/drizzle/subject-repository.js +76 -0
  46. package/dist/drizzle/subject-repository.js.map +1 -0
  47. package/dist/drizzle/subscription-repository.d.ts +60 -0
  48. package/dist/drizzle/subscription-repository.d.ts.map +1 -0
  49. package/dist/drizzle/subscription-repository.js +128 -0
  50. package/dist/drizzle/subscription-repository.js.map +1 -0
  51. package/dist/drizzle/summary-repository.d.ts +9 -0
  52. package/dist/drizzle/summary-repository.d.ts.map +1 -0
  53. package/dist/drizzle/summary-repository.js +25 -0
  54. package/dist/drizzle/summary-repository.js.map +1 -0
  55. package/dist/drizzle/types.d.ts +4 -0
  56. package/dist/drizzle/types.d.ts.map +1 -0
  57. package/dist/drizzle/types.js +2 -0
  58. package/dist/drizzle/types.js.map +1 -0
  59. package/dist/errors.d.ts +10 -0
  60. package/dist/errors.d.ts.map +1 -0
  61. package/dist/errors.js +13 -0
  62. package/dist/errors.js.map +1 -0
  63. package/dist/hooks.d.ts +24 -0
  64. package/dist/hooks.d.ts.map +1 -0
  65. package/dist/hooks.js +2 -0
  66. package/dist/hooks.js.map +1 -0
  67. package/dist/index.d.ts +11 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +9 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/logger.d.ts +16 -0
  72. package/dist/logger.d.ts.map +1 -0
  73. package/dist/logger.js +8 -0
  74. package/dist/logger.js.map +1 -0
  75. package/dist/plugins/builtin-plugins.d.ts +3 -0
  76. package/dist/plugins/builtin-plugins.d.ts.map +1 -0
  77. package/dist/plugins/builtin-plugins.js +7 -0
  78. package/dist/plugins/builtin-plugins.js.map +1 -0
  79. package/dist/plugins/hash-payload.d.ts +2 -0
  80. package/dist/plugins/hash-payload.d.ts.map +1 -0
  81. package/dist/plugins/hash-payload.js +5 -0
  82. package/dist/plugins/hash-payload.js.map +1 -0
  83. package/dist/plugins/manual.d.ts +12 -0
  84. package/dist/plugins/manual.d.ts.map +1 -0
  85. package/dist/plugins/manual.js +87 -0
  86. package/dist/plugins/manual.js.map +1 -0
  87. package/dist/plugins/plan-provisioning.d.ts +18 -0
  88. package/dist/plugins/plan-provisioning.d.ts.map +1 -0
  89. package/dist/plugins/plan-provisioning.js +159 -0
  90. package/dist/plugins/plan-provisioning.js.map +1 -0
  91. package/dist/plugins/plugin-registry.d.ts +9 -0
  92. package/dist/plugins/plugin-registry.d.ts.map +1 -0
  93. package/dist/plugins/plugin-registry.js +18 -0
  94. package/dist/plugins/plugin-registry.js.map +1 -0
  95. package/dist/providers/apple/plugin/app-store-plan-sync.d.ts +4 -0
  96. package/dist/providers/apple/plugin/app-store-plan-sync.d.ts.map +1 -0
  97. package/dist/providers/apple/plugin/app-store-plan-sync.js +85 -0
  98. package/dist/providers/apple/plugin/app-store-plan-sync.js.map +1 -0
  99. package/dist/providers/apple/plugin/app-store.d.ts +20 -0
  100. package/dist/providers/apple/plugin/app-store.d.ts.map +1 -0
  101. package/dist/providers/apple/plugin/app-store.js +397 -0
  102. package/dist/providers/apple/plugin/app-store.js.map +1 -0
  103. package/dist/providers/apple/security/app-store-verification.d.ts +4 -0
  104. package/dist/providers/apple/security/app-store-verification.d.ts.map +1 -0
  105. package/dist/providers/apple/security/app-store-verification.js +100 -0
  106. package/dist/providers/apple/security/app-store-verification.js.map +1 -0
  107. package/dist/providers/apple/services/app-store-subscription-verification-service.d.ts +3 -0
  108. package/dist/providers/apple/services/app-store-subscription-verification-service.d.ts.map +1 -0
  109. package/dist/providers/apple/services/app-store-subscription-verification-service.js +155 -0
  110. package/dist/providers/apple/services/app-store-subscription-verification-service.js.map +1 -0
  111. package/dist/providers/google/plugin/play-plan-sync.d.ts +4 -0
  112. package/dist/providers/google/plugin/play-plan-sync.d.ts.map +1 -0
  113. package/dist/providers/google/plugin/play-plan-sync.js +270 -0
  114. package/dist/providers/google/plugin/play-plan-sync.js.map +1 -0
  115. package/dist/providers/google/plugin/play.d.ts +20 -0
  116. package/dist/providers/google/plugin/play.d.ts.map +1 -0
  117. package/dist/providers/google/plugin/play.js +460 -0
  118. package/dist/providers/google/plugin/play.js.map +1 -0
  119. package/dist/providers/google/security/oauth.d.ts +10 -0
  120. package/dist/providers/google/security/oauth.d.ts.map +1 -0
  121. package/dist/providers/google/security/oauth.js +116 -0
  122. package/dist/providers/google/security/oauth.js.map +1 -0
  123. package/dist/providers/google/security/pubsub-verification.d.ts +3 -0
  124. package/dist/providers/google/security/pubsub-verification.d.ts.map +1 -0
  125. package/dist/providers/google/security/pubsub-verification.js +229 -0
  126. package/dist/providers/google/security/pubsub-verification.js.map +1 -0
  127. package/dist/providers/google/services/play-subscription-verification-service.d.ts +3 -0
  128. package/dist/providers/google/services/play-subscription-verification-service.d.ts.map +1 -0
  129. package/dist/providers/google/services/play-subscription-verification-service.js +96 -0
  130. package/dist/providers/google/services/play-subscription-verification-service.js.map +1 -0
  131. package/dist/repositories/catalog-mapping-repository.d.ts +9 -0
  132. package/dist/repositories/catalog-mapping-repository.d.ts.map +1 -0
  133. package/dist/repositories/catalog-mapping-repository.js +2 -0
  134. package/dist/repositories/catalog-mapping-repository.js.map +1 -0
  135. package/dist/repositories/inbound-event-repository.d.ts +23 -0
  136. package/dist/repositories/inbound-event-repository.d.ts.map +1 -0
  137. package/dist/repositories/inbound-event-repository.js +2 -0
  138. package/dist/repositories/inbound-event-repository.js.map +1 -0
  139. package/dist/repositories/index.d.ts +30 -0
  140. package/dist/repositories/index.d.ts.map +1 -0
  141. package/dist/repositories/index.js +2 -0
  142. package/dist/repositories/index.js.map +1 -0
  143. package/dist/repositories/plan-repository.d.ts +10 -0
  144. package/dist/repositories/plan-repository.d.ts.map +1 -0
  145. package/dist/repositories/plan-repository.js +2 -0
  146. package/dist/repositories/plan-repository.js.map +1 -0
  147. package/dist/repositories/plugin-installation-repository.d.ts +13 -0
  148. package/dist/repositories/plugin-installation-repository.d.ts.map +1 -0
  149. package/dist/repositories/plugin-installation-repository.js +2 -0
  150. package/dist/repositories/plugin-installation-repository.js.map +1 -0
  151. package/dist/repositories/subject-repository.d.ts +10 -0
  152. package/dist/repositories/subject-repository.d.ts.map +1 -0
  153. package/dist/repositories/subject-repository.js +2 -0
  154. package/dist/repositories/subject-repository.js.map +1 -0
  155. package/dist/repositories/subscription-repository.d.ts +24 -0
  156. package/dist/repositories/subscription-repository.d.ts.map +1 -0
  157. package/dist/repositories/subscription-repository.js +2 -0
  158. package/dist/repositories/subscription-repository.js.map +1 -0
  159. package/dist/security/jwt.d.ts +22 -0
  160. package/dist/security/jwt.d.ts.map +1 -0
  161. package/dist/security/jwt.js +132 -0
  162. package/dist/security/jwt.js.map +1 -0
  163. package/dist/security/plugin-webhook-verification.d.ts +3 -0
  164. package/dist/security/plugin-webhook-verification.d.ts.map +1 -0
  165. package/dist/security/plugin-webhook-verification.js +44 -0
  166. package/dist/security/plugin-webhook-verification.js.map +1 -0
  167. package/dist/security/relay-signature.d.ts +12 -0
  168. package/dist/security/relay-signature.d.ts.map +1 -0
  169. package/dist/security/relay-signature.js +39 -0
  170. package/dist/security/relay-signature.js.map +1 -0
  171. package/dist/services/canonical-subscription-service.d.ts +4 -0
  172. package/dist/services/canonical-subscription-service.d.ts.map +1 -0
  173. package/dist/services/canonical-subscription-service.js +20 -0
  174. package/dist/services/canonical-subscription-service.js.map +1 -0
  175. package/dist/services/managed-subscription-service.d.ts +5 -0
  176. package/dist/services/managed-subscription-service.d.ts.map +1 -0
  177. package/dist/services/managed-subscription-service.js +24 -0
  178. package/dist/services/managed-subscription-service.js.map +1 -0
  179. package/dist/services/plan-provisioning-service.d.ts +5 -0
  180. package/dist/services/plan-provisioning-service.d.ts.map +1 -0
  181. package/dist/services/plan-provisioning-service.js +100 -0
  182. package/dist/services/plan-provisioning-service.js.map +1 -0
  183. package/dist/services/plan-resolution.d.ts +4 -0
  184. package/dist/services/plan-resolution.d.ts.map +1 -0
  185. package/dist/services/plan-resolution.js +33 -0
  186. package/dist/services/plan-resolution.js.map +1 -0
  187. package/dist/services/plugin-installation-service.d.ts +6 -0
  188. package/dist/services/plugin-installation-service.d.ts.map +1 -0
  189. package/dist/services/plugin-installation-service.js +19 -0
  190. package/dist/services/plugin-installation-service.js.map +1 -0
  191. package/dist/services/provider-subscription-sync-service.d.ts +4 -0
  192. package/dist/services/provider-subscription-sync-service.d.ts.map +1 -0
  193. package/dist/services/provider-subscription-sync-service.js +13 -0
  194. package/dist/services/provider-subscription-sync-service.js.map +1 -0
  195. package/dist/services/subject-resolution.d.ts +4 -0
  196. package/dist/services/subject-resolution.d.ts.map +1 -0
  197. package/dist/services/subject-resolution.js +48 -0
  198. package/dist/services/subject-resolution.js.map +1 -0
  199. package/dist/services/webhook-ingestion-service.d.ts +14 -0
  200. package/dist/services/webhook-ingestion-service.d.ts.map +1 -0
  201. package/dist/services/webhook-ingestion-service.js +149 -0
  202. package/dist/services/webhook-ingestion-service.js.map +1 -0
  203. package/dist/submesh.d.ts +265 -0
  204. package/dist/submesh.d.ts.map +1 -0
  205. package/dist/submesh.js +602 -0
  206. package/dist/submesh.js.map +1 -0
  207. package/dist/utils/canonical.d.ts +7 -0
  208. package/dist/utils/canonical.d.ts.map +1 -0
  209. package/dist/utils/canonical.js +8 -0
  210. package/dist/utils/canonical.js.map +1 -0
  211. package/dist/utils/parse.d.ts +42 -0
  212. package/dist/utils/parse.d.ts.map +1 -0
  213. package/dist/utils/parse.js +74 -0
  214. package/dist/utils/parse.js.map +1 -0
  215. package/dist/utils/records.d.ts +2 -0
  216. package/dist/utils/records.d.ts.map +1 -0
  217. package/dist/utils/records.js +7 -0
  218. package/dist/utils/records.js.map +1 -0
  219. package/dist/utils/time.d.ts +2 -0
  220. package/dist/utils/time.d.ts.map +1 -0
  221. package/dist/utils/time.js +4 -0
  222. package/dist/utils/time.js.map +1 -0
  223. package/dist/utils/validation.d.ts +10 -0
  224. package/dist/utils/validation.d.ts.map +1 -0
  225. package/dist/utils/validation.js +19 -0
  226. package/dist/utils/validation.js.map +1 -0
  227. package/drizzle/0000_cute_the_order.sql +94 -0
  228. package/drizzle/meta/0000_snapshot.json +559 -0
  229. package/drizzle/meta/_journal.json +13 -0
  230. package/package.json +54 -0
@@ -0,0 +1,460 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { deprovisionGooglePlayPlan, provisionGooglePlayPlan } from "./play-plan-sync.js";
3
+ import { verifyGooglePubSubWebhook } from "../security/pubsub-verification.js";
4
+ import { verifyTrustedRelayWebhook } from "../../../security/plugin-webhook-verification.js";
5
+ import { hashPayload } from "../../../plugins/hash-payload.js";
6
+ const googleSubscriptionNotificationMap = {
7
+ 1: {
8
+ eventType: "google-play.subscription.recovered",
9
+ lifecycle: "recovered",
10
+ status: "active",
11
+ },
12
+ 2: {
13
+ eventType: "google-play.subscription.renewed",
14
+ lifecycle: "renewal",
15
+ status: "active",
16
+ },
17
+ 3: {
18
+ eventType: "google-play.subscription.canceled",
19
+ lifecycle: "cancellation",
20
+ status: "active",
21
+ },
22
+ 4: {
23
+ eventType: "google-play.subscription.purchased",
24
+ lifecycle: "purchase",
25
+ status: "active",
26
+ },
27
+ 5: {
28
+ eventType: "google-play.subscription.on_hold",
29
+ lifecycle: "account_hold",
30
+ status: "billing_issue",
31
+ },
32
+ 6: {
33
+ eventType: "google-play.subscription.in_grace_period",
34
+ lifecycle: "grace_period",
35
+ status: "grace_period",
36
+ },
37
+ 7: {
38
+ eventType: "google-play.subscription.restarted",
39
+ lifecycle: "resubscription",
40
+ status: "active",
41
+ },
42
+ 8: {
43
+ eventType: "google-play.subscription.price_change_confirmed",
44
+ lifecycle: "price_change_confirmation",
45
+ status: "active",
46
+ },
47
+ 9: {
48
+ eventType: "google-play.subscription.deferred",
49
+ lifecycle: "deferred",
50
+ status: "active",
51
+ },
52
+ 10: {
53
+ eventType: "google-play.subscription.paused",
54
+ lifecycle: "pause",
55
+ status: "paused",
56
+ },
57
+ 11: {
58
+ eventType: "google-play.subscription.pause_schedule_changed",
59
+ lifecycle: "pause_schedule_changed",
60
+ status: "active",
61
+ },
62
+ 12: {
63
+ eventType: "google-play.subscription.revoked",
64
+ lifecycle: "revoked",
65
+ status: "revoked",
66
+ },
67
+ 13: {
68
+ eventType: "google-play.subscription.expired",
69
+ lifecycle: "expiration",
70
+ status: "expired",
71
+ },
72
+ 17: {
73
+ eventType: "google-play.subscription.items_changed",
74
+ lifecycle: "items_changed",
75
+ status: "active",
76
+ },
77
+ 18: {
78
+ eventType: "google-play.subscription.cancellation_scheduled",
79
+ lifecycle: "cancellation_scheduled",
80
+ status: "active",
81
+ },
82
+ 19: {
83
+ eventType: "google-play.subscription.price_change_updated",
84
+ lifecycle: "price_change_updated",
85
+ status: "active",
86
+ },
87
+ 20: {
88
+ eventType: "google-play.subscription.pending_purchase_canceled",
89
+ lifecycle: "pending_purchase_canceled",
90
+ status: "canceled",
91
+ },
92
+ 22: {
93
+ eventType: "google-play.subscription.price_step_up_consent_updated",
94
+ lifecycle: "price_step_up_consent_updated",
95
+ status: "active",
96
+ },
97
+ };
98
+ const googleOneTimeNotificationMap = {
99
+ 1: {
100
+ eventType: "google-play.one_time_product.purchased",
101
+ lifecycle: "purchase",
102
+ status: "active",
103
+ },
104
+ 2: {
105
+ eventType: "google-play.one_time_product.canceled",
106
+ lifecycle: "pending_purchase_canceled",
107
+ status: "canceled",
108
+ },
109
+ };
110
+ function asObject(value, message) {
111
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
112
+ throw new Error(message);
113
+ }
114
+ return value;
115
+ }
116
+ function getString(value) {
117
+ return typeof value === "string" && value.length > 0 ? value : undefined;
118
+ }
119
+ function getBoolean(value) {
120
+ return typeof value === "boolean" ? value : undefined;
121
+ }
122
+ function getArray(value) {
123
+ if (!Array.isArray(value)) {
124
+ return [];
125
+ }
126
+ return value.filter((entry) => Boolean(entry) && typeof entry === "object");
127
+ }
128
+ function isFutureTimestamp(value) {
129
+ if (!value) {
130
+ return false;
131
+ }
132
+ const time = Date.parse(value);
133
+ return Number.isFinite(time) && time > Date.now();
134
+ }
135
+ function normalizeGoogleSubscriptionState(state, details, currentPeriodEnd, isTrial) {
136
+ if (!state) {
137
+ return isTrial && details.status === "active" ? "trialing" : details.status;
138
+ }
139
+ switch (state) {
140
+ case "SUBSCRIPTION_STATE_ACTIVE":
141
+ return isTrial ? "trialing" : "active";
142
+ case "SUBSCRIPTION_STATE_IN_GRACE_PERIOD":
143
+ return "grace_period";
144
+ case "SUBSCRIPTION_STATE_ON_HOLD":
145
+ return "billing_issue";
146
+ case "SUBSCRIPTION_STATE_PAUSED":
147
+ return "paused";
148
+ case "SUBSCRIPTION_STATE_EXPIRED":
149
+ return "expired";
150
+ case "SUBSCRIPTION_STATE_PENDING":
151
+ case "SUBSCRIPTION_STATE_PENDING_PURCHASE_CANCELED":
152
+ return "canceled";
153
+ case "SUBSCRIPTION_STATE_CANCELED":
154
+ return isFutureTimestamp(currentPeriodEnd) ? "active" : "expired";
155
+ default:
156
+ return details.status;
157
+ }
158
+ }
159
+ function maybeJsonDecodeBase64(value) {
160
+ return asObject(JSON.parse(Buffer.from(value, "base64").toString("utf8")), "Google Play plugin expects base64 data to decode to an object.");
161
+ }
162
+ function parsePayload(body) {
163
+ const record = asObject(body, "Google Play plugin expects a JSON object payload.");
164
+ const message = record.message;
165
+ if (message && typeof message === "object" && !Array.isArray(message)) {
166
+ const messageRecord = message;
167
+ const data = getString(messageRecord.data);
168
+ if (data) {
169
+ return {
170
+ payload: maybeJsonDecodeBase64(data),
171
+ wrapper: record,
172
+ };
173
+ }
174
+ }
175
+ return {
176
+ payload: record,
177
+ };
178
+ }
179
+ function pickGoogleResource(payload) {
180
+ for (const candidateKey of [
181
+ "subscriptionPurchaseV2",
182
+ "subscription",
183
+ "purchase",
184
+ "resource",
185
+ ]) {
186
+ const candidate = payload[candidateKey];
187
+ if (candidate && typeof candidate === "object" && !Array.isArray(candidate)) {
188
+ return candidate;
189
+ }
190
+ }
191
+ return payload;
192
+ }
193
+ function pickGoogleLineItem(payload, resource) {
194
+ return (getArray(resource.lineItems)[0] ??
195
+ getArray(payload.lineItems)[0] ??
196
+ asObject(payload.lineItem ?? {}, "Google Play line item must be an object."));
197
+ }
198
+ function getExternalSubjectId(payload, resource) {
199
+ const accountIdentifiers = asObject(resource.externalAccountIdentifiers ?? payload.externalAccountIdentifiers ?? {}, "Google Play account identifiers must be an object.");
200
+ return (getString(payload.obfuscatedExternalAccountId) ??
201
+ getString(resource.obfuscatedExternalAccountId) ??
202
+ getString(accountIdentifiers.obfuscatedExternalAccountId) ??
203
+ getString(accountIdentifiers.obfuscatedExternalProfileId));
204
+ }
205
+ function buildMetadata(payload, wrapper, extra) {
206
+ return {
207
+ ...payload,
208
+ ...extra,
209
+ pubsub: wrapper
210
+ ? {
211
+ messageId: getString(asObject(wrapper.message ?? {}, "Google Play message must be an object.")
212
+ .messageId),
213
+ publishTime: getString(asObject(wrapper.message ?? {}, "Google Play message must be an object.")
214
+ .publishTime),
215
+ subscription: getString(wrapper.subscription),
216
+ }
217
+ : undefined,
218
+ };
219
+ }
220
+ function requireGoogleExternalProductId(input) {
221
+ const value = input.externalProductId ??
222
+ input.payloadProductId ??
223
+ input.resourceProductId ??
224
+ input.lineItemProductId ??
225
+ input.subscriptionId;
226
+ if (!value) {
227
+ throw new Error("Google Play payload is missing productId/subscriptionId. Provide product identifiers in normalized or RTDN payloads.");
228
+ }
229
+ return value;
230
+ }
231
+ function buildSubscriptionRecord(input) {
232
+ const resource = pickGoogleResource(input.payload);
233
+ const lineItem = pickGoogleLineItem(input.payload, resource);
234
+ const currentPeriodStart = getString(input.payload.startTime) ??
235
+ getString(resource.startTime) ??
236
+ getString(input.payload.purchaseTime) ??
237
+ null;
238
+ const currentPeriodEnd = getString(input.payload.expiryTime) ??
239
+ getString(resource.expiryTime) ??
240
+ getString(lineItem.expiryTime) ??
241
+ null;
242
+ const autoRenewingPlan = asObject(lineItem.autoRenewingPlan ?? input.payload.autoRenewingPlan ?? {}, "Google Play auto renewing plan must be an object.");
243
+ const autoRenewEnabled = getBoolean(autoRenewingPlan.autoRenewEnabled) ??
244
+ getBoolean(input.payload.autoRenewEnabled);
245
+ const offerPhase = asObject(lineItem.offerPhase ?? input.payload.offerPhase ?? {}, "Google Play offer phase must be an object.");
246
+ const isTrial = getBoolean(input.payload.isTrialPeriod) === true ||
247
+ Boolean(offerPhase.freeTrial && typeof offerPhase.freeTrial === "object");
248
+ const explicitStatus = getString(input.payload.status);
249
+ const subscriptionState = getString(input.payload.subscriptionState) ?? getString(resource.subscriptionState);
250
+ const externalProductId = requireGoogleExternalProductId({
251
+ externalProductId: input.externalProductId,
252
+ payloadProductId: getString(input.payload.productId),
253
+ resourceProductId: getString(resource.productId),
254
+ lineItemProductId: getString(lineItem.productId),
255
+ subscriptionId: getString(input.payload.subscriptionId),
256
+ });
257
+ const cancelAt = getString(input.payload.cancelAt) ??
258
+ ((autoRenewEnabled === false || input.lifecycle.lifecycle.includes("cancellation")) &&
259
+ isFutureTimestamp(currentPeriodEnd)
260
+ ? currentPeriodEnd
261
+ : null);
262
+ return {
263
+ pluginKey: "google-play",
264
+ sourceType: input.sourceType ?? "google-play",
265
+ sourceRef: input.sourceRef,
266
+ status: explicitStatus ??
267
+ normalizeGoogleSubscriptionState(subscriptionState, input.lifecycle, currentPeriodEnd, isTrial),
268
+ subjectId: getString(input.payload.subjectId) ??
269
+ getString(input.payload.userId) ??
270
+ getString(resource.subjectId) ??
271
+ getString(resource.userId),
272
+ externalSubjectId: getExternalSubjectId(input.payload, resource),
273
+ planCode: getString(input.payload.planCode) ?? getString(resource.planCode),
274
+ externalProductId,
275
+ currentPeriodStart,
276
+ currentPeriodEnd,
277
+ cancelAt,
278
+ metadata: buildMetadata(input.payload, input.wrapper, {
279
+ lifecycle: input.lifecycle.lifecycle,
280
+ notificationType: input.notificationType,
281
+ notificationName: typeof input.notificationType === "number"
282
+ ? input.lifecycle.eventType.split(".").at(-1)
283
+ : undefined,
284
+ linkedPurchaseToken: getString(input.payload.linkedPurchaseToken) ??
285
+ getString(resource.linkedPurchaseToken),
286
+ latestOrderId: getString(input.payload.latestOrderId) ?? getString(resource.latestOrderId),
287
+ subscriptionState,
288
+ autoRenewEnabled,
289
+ acknowledged: getString(resource.acknowledgementState) ??
290
+ getString(input.payload.acknowledgementState),
291
+ }),
292
+ };
293
+ }
294
+ function toNormalizedEvent(payload, wrapper) {
295
+ const sourceRef = String(payload.purchaseToken ?? payload.subscriptionId ?? payload.orderId ?? randomUUID());
296
+ const record = buildSubscriptionRecord({
297
+ payload,
298
+ wrapper,
299
+ lifecycle: {
300
+ eventType: getString(payload.eventType) ?? "google-play.subscription.updated",
301
+ lifecycle: "update",
302
+ status: getString(payload.status) ??
303
+ "active",
304
+ },
305
+ sourceRef,
306
+ externalProductId: getString(payload.productId) ?? getString(payload.subscriptionId),
307
+ });
308
+ return {
309
+ eventKey: getString(payload.eventKey) ??
310
+ getString(asObject(wrapper?.message ?? {}, "Google Play message must be an object.")
311
+ .messageId) ??
312
+ String(payload.orderId ?? payload.purchaseToken ?? hashPayload(payload)),
313
+ eventType: getString(payload.eventType) ?? "google-play.subscription.updated",
314
+ sourceRef,
315
+ records: [record],
316
+ };
317
+ }
318
+ function toSubscriptionNotificationEvent(payload, wrapper) {
319
+ const notification = asObject(payload.subscriptionNotification, "Google Play subscriptionNotification must be an object.");
320
+ const notificationType = Number(notification.notificationType ?? 4);
321
+ const lifecycle = googleSubscriptionNotificationMap[notificationType] ?? {
322
+ eventType: `google-play.subscription.notification.${notificationType}`,
323
+ lifecycle: "update",
324
+ status: "active",
325
+ };
326
+ const sourceRef = String(notification.purchaseToken ?? payload.eventTimeMillis ?? randomUUID());
327
+ return {
328
+ eventKey: getString(payload.eventKey) ??
329
+ getString(asObject(wrapper?.message ?? {}, "Google Play message must be an object.")
330
+ .messageId) ??
331
+ String(payload.eventTimeMillis ?? notification.purchaseToken ?? hashPayload(payload)),
332
+ eventType: lifecycle.eventType,
333
+ sourceRef,
334
+ records: [
335
+ buildSubscriptionRecord({
336
+ payload,
337
+ wrapper,
338
+ lifecycle,
339
+ notificationType,
340
+ sourceRef,
341
+ externalProductId: getString(notification.subscriptionId),
342
+ }),
343
+ ],
344
+ };
345
+ }
346
+ function toOneTimeProductEvent(payload, wrapper) {
347
+ const notification = asObject(payload.oneTimeProductNotification, "Google Play oneTimeProductNotification must be an object.");
348
+ const notificationType = Number(notification.notificationType ?? 1);
349
+ const lifecycle = googleOneTimeNotificationMap[notificationType] ?? {
350
+ eventType: `google-play.one_time_product.notification.${notificationType}`,
351
+ lifecycle: "update",
352
+ status: "active",
353
+ };
354
+ const sourceRef = String(notification.purchaseToken ?? payload.eventTimeMillis ?? randomUUID());
355
+ return {
356
+ eventKey: getString(payload.eventKey) ??
357
+ getString(asObject(wrapper?.message ?? {}, "Google Play message must be an object.")
358
+ .messageId) ??
359
+ String(payload.eventTimeMillis ?? notification.purchaseToken ?? hashPayload(payload)),
360
+ eventType: lifecycle.eventType,
361
+ sourceRef,
362
+ records: [
363
+ buildSubscriptionRecord({
364
+ payload: {
365
+ ...payload,
366
+ productId: notification.sku,
367
+ purchaseToken: notification.purchaseToken,
368
+ },
369
+ wrapper,
370
+ lifecycle,
371
+ notificationType,
372
+ sourceType: "google-play-one-time",
373
+ sourceRef,
374
+ externalProductId: getString(notification.sku),
375
+ }),
376
+ ],
377
+ };
378
+ }
379
+ function toVoidedPurchaseEvent(payload, wrapper) {
380
+ const notification = asObject(payload.voidedPurchaseNotification, "Google Play voidedPurchaseNotification must be an object.");
381
+ const productType = Number(notification.productType ?? 1);
382
+ const refundType = Number(notification.refundType ?? 1);
383
+ const sourceRef = String(notification.purchaseToken ??
384
+ notification.orderId ??
385
+ payload.eventTimeMillis ??
386
+ randomUUID());
387
+ return {
388
+ eventKey: getString(payload.eventKey) ??
389
+ getString(asObject(wrapper?.message ?? {}, "Google Play message must be an object.")
390
+ .messageId) ??
391
+ String(notification.orderId ?? notification.purchaseToken ?? hashPayload(payload)),
392
+ eventType: "google-play.purchase.voided",
393
+ sourceRef,
394
+ records: [
395
+ buildSubscriptionRecord({
396
+ payload: {
397
+ ...payload,
398
+ purchaseToken: notification.purchaseToken,
399
+ orderId: notification.orderId,
400
+ },
401
+ wrapper,
402
+ lifecycle: {
403
+ eventType: "google-play.purchase.voided",
404
+ lifecycle: refundType === 2 ? "partial_refund" : "refund",
405
+ status: productType === 2 && refundType === 2 ? "active" : "refunded",
406
+ },
407
+ notificationType: productType,
408
+ sourceType: productType === 2 ? "google-play-one-time" : "google-play",
409
+ sourceRef,
410
+ }),
411
+ ],
412
+ };
413
+ }
414
+ function toTestNotificationEvent(payload, wrapper) {
415
+ return {
416
+ eventKey: getString(payload.eventKey) ??
417
+ getString(asObject(wrapper?.message ?? {}, "Google Play message must be an object.")
418
+ .messageId) ??
419
+ String(payload.eventTimeMillis ?? hashPayload(payload)),
420
+ eventType: "google-play.test_notification",
421
+ sourceRef: null,
422
+ records: [],
423
+ };
424
+ }
425
+ export const googlePlayPlugin = {
426
+ key: "google-play",
427
+ displayName: "Google Play Billing",
428
+ description: "Normalizes Google Play billing, RTDN lifecycle changes, one-time purchases, and verified Pub/Sub deliveries into the canonical model.",
429
+ capabilities: ["rtdn", "subscription-sync", "app-store", "one-time-purchase"],
430
+ async provisionPlan(input, context) {
431
+ return provisionGooglePlayPlan(input, context.config);
432
+ },
433
+ async deprovisionPlan(input, context) {
434
+ return deprovisionGooglePlayPlan(input, context.config, context.result);
435
+ },
436
+ async verifyWebhook(envelope, context) {
437
+ const googleVerification = await verifyGooglePubSubWebhook(envelope, context.config);
438
+ if (googleVerification) {
439
+ return googleVerification;
440
+ }
441
+ return verifyTrustedRelayWebhook(envelope, context.config);
442
+ },
443
+ async parseWebhook(envelope) {
444
+ const { payload, wrapper } = parsePayload(envelope.body);
445
+ if (payload.testNotification) {
446
+ return toTestNotificationEvent(payload, wrapper);
447
+ }
448
+ if (payload.subscriptionNotification) {
449
+ return toSubscriptionNotificationEvent(payload, wrapper);
450
+ }
451
+ if (payload.oneTimeProductNotification) {
452
+ return toOneTimeProductEvent(payload, wrapper);
453
+ }
454
+ if (payload.voidedPurchaseNotification) {
455
+ return toVoidedPurchaseEvent(payload, wrapper);
456
+ }
457
+ return toNormalizedEvent(payload, wrapper);
458
+ },
459
+ };
460
+ //# sourceMappingURL=play.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"play.js","sourceRoot":"","sources":["../../../../src/providers/google/plugin/play.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface GoogleServiceAccountConfig {
2
+ clientEmail: string;
3
+ privateKey: string;
4
+ privateKeyId?: string;
5
+ tokenUri?: string;
6
+ scope?: string;
7
+ allowCustomTokenUriHost?: boolean;
8
+ }
9
+ export declare function getGoogleAccessToken(serviceAccount: GoogleServiceAccountConfig): Promise<string>;
10
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../../src/providers/google/security/oauth.ts"],"names":[],"mappings":"AAiGA,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,0BAA0B,GACzC,OAAO,CAAC,MAAM,CAAC,CA+CjB"}
@@ -0,0 +1,116 @@
1
+ import { createSign } from "node:crypto";
2
+ const GOOGLE_OAUTH_SCOPE = "https://www.googleapis.com/auth/androidpublisher";
3
+ const GOOGLE_TOKEN_URL = "https://oauth2.googleapis.com/token";
4
+ const DEFAULT_TRUSTED_TOKEN_HOSTS = new Set(["oauth2.googleapis.com"]);
5
+ const MAX_CACHE_SIZE = 100;
6
+ const accessTokenCache = new Map();
7
+ function getString(value) {
8
+ return typeof value === "string" && value.length > 0 ? value : undefined;
9
+ }
10
+ function getNumber(value) {
11
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
12
+ }
13
+ function asObject(value) {
14
+ return value && typeof value === "object" && !Array.isArray(value)
15
+ ? value
16
+ : {};
17
+ }
18
+ function isExplicitlyEnabled(value) {
19
+ return value === true || value === "true";
20
+ }
21
+ function resolveTokenUrl(serviceAccount) {
22
+ const raw = serviceAccount.tokenUri ?? GOOGLE_TOKEN_URL;
23
+ let parsed;
24
+ try {
25
+ parsed = new URL(raw);
26
+ }
27
+ catch {
28
+ throw new Error(`Invalid Google OAuth token URL: ${raw}.`);
29
+ }
30
+ if (parsed.protocol !== "https:") {
31
+ throw new Error("Google OAuth token URL must use HTTPS.");
32
+ }
33
+ if (!DEFAULT_TRUSTED_TOKEN_HOSTS.has(parsed.hostname) &&
34
+ !isExplicitlyEnabled(serviceAccount.allowCustomTokenUriHost)) {
35
+ throw new Error(`Refusing Google OAuth token URL host "${parsed.hostname}". Set allowCustomTokenUriHost=true to override intentionally.`);
36
+ }
37
+ return parsed.toString();
38
+ }
39
+ function toBase64Url(value) {
40
+ return Buffer.from(value)
41
+ .toString("base64")
42
+ .replace(/\+/g, "-")
43
+ .replace(/\//g, "_")
44
+ .replace(/=+$/g, "");
45
+ }
46
+ function createServiceAccountJwt(input) {
47
+ const nowSeconds = Math.floor(Date.now() / 1000);
48
+ const header = {
49
+ alg: "RS256",
50
+ typ: "JWT",
51
+ kid: input.privateKeyId,
52
+ };
53
+ const payload = {
54
+ iss: input.clientEmail,
55
+ scope: input.scope ?? GOOGLE_OAUTH_SCOPE,
56
+ aud: input.tokenUri ?? GOOGLE_TOKEN_URL,
57
+ exp: nowSeconds + 3600,
58
+ iat: nowSeconds,
59
+ };
60
+ const encodedHeader = toBase64Url(JSON.stringify(header));
61
+ const encodedPayload = toBase64Url(JSON.stringify(payload));
62
+ const signingInput = `${encodedHeader}.${encodedPayload}`;
63
+ const signer = createSign("RSA-SHA256");
64
+ signer.update(signingInput);
65
+ signer.end();
66
+ const signature = signer
67
+ .sign(input.privateKey.replace(/\\n/g, "\n"))
68
+ .toString("base64")
69
+ .replace(/\+/g, "-")
70
+ .replace(/\//g, "_")
71
+ .replace(/=+$/g, "");
72
+ return `${signingInput}.${signature}`;
73
+ }
74
+ export async function getGoogleAccessToken(serviceAccount) {
75
+ const cacheKey = `${serviceAccount.clientEmail}:${serviceAccount.scope ?? GOOGLE_OAUTH_SCOPE}`;
76
+ const cached = accessTokenCache.get(cacheKey);
77
+ if (cached && cached.expiresAt > Date.now() + 60_000) {
78
+ return cached.accessToken;
79
+ }
80
+ const tokenUrl = resolveTokenUrl(serviceAccount);
81
+ const assertion = createServiceAccountJwt({
82
+ ...serviceAccount,
83
+ tokenUri: tokenUrl,
84
+ });
85
+ const response = await fetch(tokenUrl, {
86
+ method: "POST",
87
+ headers: {
88
+ "content-type": "application/x-www-form-urlencoded",
89
+ },
90
+ body: new URLSearchParams({
91
+ grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
92
+ assertion,
93
+ }),
94
+ });
95
+ if (!response.ok) {
96
+ throw new Error(`Google OAuth token exchange failed with status ${response.status}.`);
97
+ }
98
+ const body = asObject(await response.json());
99
+ const accessToken = getString(body.access_token);
100
+ const expiresIn = getNumber(body.expires_in) ?? 3600;
101
+ if (!accessToken) {
102
+ throw new Error("Google OAuth token response did not include access_token.");
103
+ }
104
+ accessTokenCache.set(cacheKey, {
105
+ accessToken,
106
+ expiresAt: Date.now() + expiresIn * 1000,
107
+ });
108
+ if (accessTokenCache.size > MAX_CACHE_SIZE) {
109
+ const firstKey = accessTokenCache.keys().next().value;
110
+ if (firstKey !== undefined) {
111
+ accessTokenCache.delete(firstKey);
112
+ }
113
+ }
114
+ return accessToken;
115
+ }
116
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../../src/providers/google/security/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PluginWebhookEnvelope, PluginWebhookVerification } from "@shdan/submesh-core";
2
+ export declare function verifyGooglePubSubWebhook(envelope: PluginWebhookEnvelope, config: Record<string, unknown>): Promise<PluginWebhookVerification | undefined>;
3
+ //# sourceMappingURL=pubsub-verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubsub-verification.d.ts","sourceRoot":"","sources":["../../../../src/providers/google/security/pubsub-verification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,qBAAqB,CAAC;AA8L7B,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,qBAAqB,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAyFhD"}