@shopware-ag/app-server-sdk 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.
Files changed (149) hide show
  1. package/README.md +43 -0
  2. package/dist/commonjs/app.d.ts +31 -0
  3. package/dist/commonjs/app.d.ts.map +1 -0
  4. package/dist/commonjs/app.js +25 -0
  5. package/dist/commonjs/app.js.map +1 -0
  6. package/dist/commonjs/context-resolver.d.ts +30 -0
  7. package/dist/commonjs/context-resolver.d.ts.map +1 -0
  8. package/dist/commonjs/context-resolver.js +70 -0
  9. package/dist/commonjs/context-resolver.js.map +1 -0
  10. package/dist/commonjs/framework/hono.d.ts +36 -0
  11. package/dist/commonjs/framework/hono.d.ts.map +1 -0
  12. package/dist/commonjs/framework/hono.js +84 -0
  13. package/dist/commonjs/framework/hono.js.map +1 -0
  14. package/dist/commonjs/helper/app-actions.d.ts +13 -0
  15. package/dist/commonjs/helper/app-actions.d.ts.map +1 -0
  16. package/dist/commonjs/helper/app-actions.js +54 -0
  17. package/dist/commonjs/helper/app-actions.js.map +1 -0
  18. package/dist/commonjs/http-client.d.ts +67 -0
  19. package/dist/commonjs/http-client.d.ts.map +1 -0
  20. package/dist/commonjs/http-client.js +155 -0
  21. package/dist/commonjs/http-client.js.map +1 -0
  22. package/dist/commonjs/mod.d.ts +6 -0
  23. package/dist/commonjs/mod.d.ts.map +1 -0
  24. package/dist/commonjs/mod.js +16 -0
  25. package/dist/commonjs/mod.js.map +1 -0
  26. package/dist/commonjs/package.json +3 -0
  27. package/dist/commonjs/registration.d.ts +18 -0
  28. package/dist/commonjs/registration.d.ts.map +1 -0
  29. package/dist/commonjs/registration.js +89 -0
  30. package/dist/commonjs/registration.js.map +1 -0
  31. package/dist/commonjs/repository.d.ts +51 -0
  32. package/dist/commonjs/repository.d.ts.map +1 -0
  33. package/dist/commonjs/repository.js +68 -0
  34. package/dist/commonjs/repository.js.map +1 -0
  35. package/dist/commonjs/service/cloudflare.d.ts +43 -0
  36. package/dist/commonjs/service/cloudflare.d.ts.map +1 -0
  37. package/dist/commonjs/service/cloudflare.js +45 -0
  38. package/dist/commonjs/service/cloudflare.js.map +1 -0
  39. package/dist/commonjs/service/deno.d.ts +18 -0
  40. package/dist/commonjs/service/deno.d.ts.map +1 -0
  41. package/dist/commonjs/service/deno.js +48 -0
  42. package/dist/commonjs/service/deno.js.map +1 -0
  43. package/dist/commonjs/signer.d.ts +12 -0
  44. package/dist/commonjs/signer.d.ts.map +1 -0
  45. package/dist/commonjs/signer.js +58 -0
  46. package/dist/commonjs/signer.js.map +1 -0
  47. package/dist/commonjs/types.d.ts +28 -0
  48. package/dist/commonjs/types.d.ts.map +1 -0
  49. package/dist/commonjs/types.js +3 -0
  50. package/dist/commonjs/types.js.map +1 -0
  51. package/dist/deno/app.d.ts +31 -0
  52. package/dist/deno/app.d.ts.map +1 -0
  53. package/dist/deno/app.js +21 -0
  54. package/dist/deno/app.js.map +1 -0
  55. package/dist/deno/context-resolver.d.ts +30 -0
  56. package/dist/deno/context-resolver.d.ts.map +1 -0
  57. package/dist/deno/context-resolver.js +65 -0
  58. package/dist/deno/context-resolver.js.map +1 -0
  59. package/dist/deno/framework/hono.d.ts +36 -0
  60. package/dist/deno/framework/hono.d.ts.map +1 -0
  61. package/dist/deno/framework/hono.js +81 -0
  62. package/dist/deno/framework/hono.js.map +1 -0
  63. package/dist/deno/helper/app-actions.d.ts +13 -0
  64. package/dist/deno/helper/app-actions.d.ts.map +1 -0
  65. package/dist/deno/helper/app-actions.js +49 -0
  66. package/dist/deno/helper/app-actions.js.map +1 -0
  67. package/dist/deno/http-client.d.ts +67 -0
  68. package/dist/deno/http-client.d.ts.map +1 -0
  69. package/dist/deno/http-client.js +148 -0
  70. package/dist/deno/http-client.js.map +1 -0
  71. package/dist/deno/mod.d.ts +6 -0
  72. package/dist/deno/mod.d.ts.map +1 -0
  73. package/dist/deno/mod.js +5 -0
  74. package/dist/deno/mod.js.map +1 -0
  75. package/dist/deno/package.json +3 -0
  76. package/dist/deno/registration.d.ts +18 -0
  77. package/dist/deno/registration.d.ts.map +1 -0
  78. package/dist/deno/registration.js +84 -0
  79. package/dist/deno/registration.js.map +1 -0
  80. package/dist/deno/repository.d.ts +51 -0
  81. package/dist/deno/repository.d.ts.map +1 -0
  82. package/dist/deno/repository.js +63 -0
  83. package/dist/deno/repository.js.map +1 -0
  84. package/dist/deno/service/cloudflare.d.ts +43 -0
  85. package/dist/deno/service/cloudflare.d.ts.map +1 -0
  86. package/dist/deno/service/cloudflare.js +41 -0
  87. package/dist/deno/service/cloudflare.js.map +1 -0
  88. package/dist/deno/service/deno.d.ts +18 -0
  89. package/dist/deno/service/deno.d.ts.map +1 -0
  90. package/dist/deno/service/deno.js +44 -0
  91. package/dist/deno/service/deno.js.map +1 -0
  92. package/dist/deno/signer.d.ts +12 -0
  93. package/dist/deno/signer.d.ts.map +1 -0
  94. package/dist/deno/signer.js +54 -0
  95. package/dist/deno/signer.js.map +1 -0
  96. package/dist/deno/types.d.ts +28 -0
  97. package/dist/deno/types.d.ts.map +1 -0
  98. package/dist/deno/types.js +2 -0
  99. package/dist/deno/types.js.map +1 -0
  100. package/dist/esm/app.d.ts +31 -0
  101. package/dist/esm/app.d.ts.map +1 -0
  102. package/dist/esm/app.js +21 -0
  103. package/dist/esm/app.js.map +1 -0
  104. package/dist/esm/context-resolver.d.ts +30 -0
  105. package/dist/esm/context-resolver.d.ts.map +1 -0
  106. package/dist/esm/context-resolver.js +65 -0
  107. package/dist/esm/context-resolver.js.map +1 -0
  108. package/dist/esm/framework/hono.d.ts +36 -0
  109. package/dist/esm/framework/hono.d.ts.map +1 -0
  110. package/dist/esm/framework/hono.js +81 -0
  111. package/dist/esm/framework/hono.js.map +1 -0
  112. package/dist/esm/helper/app-actions.d.ts +13 -0
  113. package/dist/esm/helper/app-actions.d.ts.map +1 -0
  114. package/dist/esm/helper/app-actions.js +49 -0
  115. package/dist/esm/helper/app-actions.js.map +1 -0
  116. package/dist/esm/http-client.d.ts +67 -0
  117. package/dist/esm/http-client.d.ts.map +1 -0
  118. package/dist/esm/http-client.js +148 -0
  119. package/dist/esm/http-client.js.map +1 -0
  120. package/dist/esm/mod.d.ts +6 -0
  121. package/dist/esm/mod.d.ts.map +1 -0
  122. package/dist/esm/mod.js +5 -0
  123. package/dist/esm/mod.js.map +1 -0
  124. package/dist/esm/package.json +3 -0
  125. package/dist/esm/registration.d.ts +18 -0
  126. package/dist/esm/registration.d.ts.map +1 -0
  127. package/dist/esm/registration.js +84 -0
  128. package/dist/esm/registration.js.map +1 -0
  129. package/dist/esm/repository.d.ts +51 -0
  130. package/dist/esm/repository.d.ts.map +1 -0
  131. package/dist/esm/repository.js +63 -0
  132. package/dist/esm/repository.js.map +1 -0
  133. package/dist/esm/service/cloudflare.d.ts +43 -0
  134. package/dist/esm/service/cloudflare.d.ts.map +1 -0
  135. package/dist/esm/service/cloudflare.js +41 -0
  136. package/dist/esm/service/cloudflare.js.map +1 -0
  137. package/dist/esm/service/deno.d.ts +18 -0
  138. package/dist/esm/service/deno.d.ts.map +1 -0
  139. package/dist/esm/service/deno.js +44 -0
  140. package/dist/esm/service/deno.js.map +1 -0
  141. package/dist/esm/signer.d.ts +12 -0
  142. package/dist/esm/signer.d.ts.map +1 -0
  143. package/dist/esm/signer.js +54 -0
  144. package/dist/esm/signer.js.map +1 -0
  145. package/dist/esm/types.d.ts +28 -0
  146. package/dist/esm/types.d.ts.map +1 -0
  147. package/dist/esm/types.js +2 -0
  148. package/dist/esm/types.js.map +1 -0
  149. package/package.json +72 -0
@@ -0,0 +1,18 @@
1
+ import { SimpleShop } from "../repository.js";
2
+ import type { ShopRepositoryInterface } from "../repository.js";
3
+ /**
4
+ * Deno KV integration
5
+ * @module
6
+ */
7
+ /**
8
+ * DenoKVRepository is a ShopRepositoryInterface implementation that uses the Deno KV storage to save the shop data
9
+ */
10
+ export declare class DenoKVRepository implements ShopRepositoryInterface<SimpleShop> {
11
+ private namespace;
12
+ constructor(namespace?: string);
13
+ createShop(id: string, url: string, secret: string): Promise<void>;
14
+ getShopById(id: string): Promise<SimpleShop | null>;
15
+ updateShop(shop: SimpleShop): Promise<void>;
16
+ deleteShop(id: string): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=deno.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deno.d.ts","sourceRoot":"","sources":["../../../src/service/deno.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAiB,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE/E;;;GAGG;AAEH;;GAEG;AACH,qBAAa,gBAAiB,YAAW,uBAAuB,CAAC,UAAU,CAAC;IAC/D,OAAO,CAAC,SAAS;gBAAT,SAAS,SAAU;IAEjC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA2BnD,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAM3C"}
@@ -0,0 +1,44 @@
1
+ import { SimpleShop } from "../repository.js";
2
+ /**
3
+ * Deno KV integration
4
+ * @module
5
+ */
6
+ /**
7
+ * DenoKVRepository is a ShopRepositoryInterface implementation that uses the Deno KV storage to save the shop data
8
+ */
9
+ export class DenoKVRepository {
10
+ namespace;
11
+ constructor(namespace = "shops") {
12
+ this.namespace = namespace;
13
+ }
14
+ async createShop(id, url, secret) {
15
+ // @ts-ignore
16
+ const kv = await Deno.openKv();
17
+ await kv.set([this.namespace, id], new SimpleShop(id, url, secret));
18
+ }
19
+ async getShopById(id) {
20
+ // @ts-ignore
21
+ const kv = await Deno.openKv();
22
+ const result = await kv.get([this.namespace, id]);
23
+ if (result.key === null) {
24
+ return null;
25
+ }
26
+ const data = result.value;
27
+ const shop = new SimpleShop(data.shopId, data.shopUrl, data.shopSecret);
28
+ if (data.shopClientId && data.shopClientSecret) {
29
+ shop.setShopCredentials(data.shopClientId, data.shopClientSecret);
30
+ }
31
+ return shop;
32
+ }
33
+ async updateShop(shop) {
34
+ // @ts-ignore
35
+ const kv = await Deno.openKv();
36
+ await kv.set([this.namespace, shop.getShopId()], shop);
37
+ }
38
+ async deleteShop(id) {
39
+ // @ts-ignore
40
+ const kv = await Deno.openKv();
41
+ await kv.delete([this.namespace, id]);
42
+ }
43
+ }
44
+ //# sourceMappingURL=deno.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deno.js","sourceRoot":"","sources":["../../../src/service/deno.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C;;;GAGG;AAEH;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACR;IAApB,YAAoB,YAAY,OAAO;QAAnB,cAAS,GAAT,SAAS,CAAU;IAAG,CAAC;IAE3C,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,GAAW,EAAE,MAAc;QACvD,aAAa;QACb,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAE/B,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,IAAI,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC3B,aAAa;QACb,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QAElD,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,KAMnB,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAExE,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAChD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAgB;QAChC,aAAa;QACb,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAE/B,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU;QAC1B,aAAa;QACb,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAE/B,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;CACD","sourcesContent":["import { SimpleShop } from \"../repository.js\";\nimport type { ShopInterface, ShopRepositoryInterface } from \"../repository.js\";\n\n/**\n * Deno KV integration\n * @module\n */\n\n/**\n * DenoKVRepository is a ShopRepositoryInterface implementation that uses the Deno KV storage to save the shop data\n */\nexport class DenoKVRepository implements ShopRepositoryInterface<SimpleShop> {\n\tconstructor(private namespace = \"shops\") {}\n\n\tasync createShop(id: string, url: string, secret: string): Promise<void> {\n\t\t// @ts-ignore\n\t\tconst kv = await Deno.openKv();\n\n\t\tawait kv.set([this.namespace, id], new SimpleShop(id, url, secret));\n\t}\n\n\tasync getShopById(id: string): Promise<SimpleShop | null> {\n\t\t// @ts-ignore\n\t\tconst kv = await Deno.openKv();\n\n\t\tconst result = await kv.get([this.namespace, id]);\n\n\t\tif (result.key === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst data = result.value as {\n\t\t\tshopId: string;\n\t\t\tshopUrl: string;\n\t\t\tshopSecret: string;\n\t\t\tshopClientId: string | null;\n\t\t\tshopClientSecret: string | null;\n\t\t};\n\n\t\tconst shop = new SimpleShop(data.shopId, data.shopUrl, data.shopSecret);\n\n\t\tif (data.shopClientId && data.shopClientSecret) {\n\t\t\tshop.setShopCredentials(data.shopClientId, data.shopClientSecret);\n\t\t}\n\n\t\treturn shop;\n\t}\n\n\tasync updateShop(shop: SimpleShop): Promise<void> {\n\t\t// @ts-ignore\n\t\tconst kv = await Deno.openKv();\n\n\t\tawait kv.set([this.namespace, shop.getShopId()], shop);\n\t}\n\n\tasync deleteShop(id: string): Promise<void> {\n\t\t// @ts-ignore\n\t\tconst kv = await Deno.openKv();\n\n\t\tawait kv.delete([this.namespace, id]);\n\t}\n}\n"]}
@@ -0,0 +1,12 @@
1
+ export declare class WebCryptoHmacSigner {
2
+ private encoder;
3
+ private keyCache;
4
+ constructor();
5
+ signResponse(response: Response, secret: string): Promise<void>;
6
+ verifyGetRequest(request: Request, secret: string): Promise<void>;
7
+ getKeyForSecret(secret: string): Promise<CryptoKey>;
8
+ sign(message: string, secret: string): Promise<string>;
9
+ verify(signature: string, data: string, secret: string): Promise<boolean>;
10
+ buf2hex(buf: ArrayBuffer): string;
11
+ }
12
+ //# sourceMappingURL=signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/signer.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAyB;;IAOnC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/D,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BjE,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAmBnD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYtD,MAAM,CACX,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IAMnB,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM;CAKjC"}
@@ -0,0 +1,54 @@
1
+ export class WebCryptoHmacSigner {
2
+ encoder;
3
+ keyCache;
4
+ constructor() {
5
+ this.encoder = new TextEncoder();
6
+ this.keyCache = new Map();
7
+ }
8
+ async signResponse(response, secret) {
9
+ response.headers.set("shopware-app-signature", await this.sign(await response.clone().text(), secret));
10
+ }
11
+ async verifyGetRequest(request, secret) {
12
+ const url = new URL(request.url);
13
+ const signature = url.searchParams.get("shopware-shop-signature");
14
+ if (signature === null) {
15
+ throw new Error("Missing shopware-shop-signature query parameter");
16
+ }
17
+ url.searchParams.delete("shopware-shop-signature");
18
+ let body = "";
19
+ for (const searchKey of url.searchParams.keys()) {
20
+ body += `${searchKey}=${decodeURIComponent(url.searchParams.get(searchKey))}&`;
21
+ }
22
+ body = body.slice(0, -1);
23
+ if (body === "") {
24
+ throw new Error("Missing query parameters to verify the GET request");
25
+ }
26
+ if (!(await this.verify(signature, body, secret))) {
27
+ throw new Error("Invalid signature");
28
+ }
29
+ }
30
+ async getKeyForSecret(secret) {
31
+ if (this.keyCache.has(secret)) {
32
+ return this.keyCache.get(secret);
33
+ }
34
+ const secretKeyData = this.encoder.encode(secret);
35
+ const key = await crypto.subtle.importKey("raw", secretKeyData, { name: "HMAC", hash: "SHA-256" }, false, ["sign", "verify"]);
36
+ this.keyCache.set(secret, key);
37
+ return key;
38
+ }
39
+ async sign(message, secret) {
40
+ const key = await this.getKeyForSecret(secret);
41
+ const mac = await crypto.subtle.sign("HMAC", key, this.encoder.encode(message));
42
+ return this.buf2hex(mac);
43
+ }
44
+ async verify(signature, data, secret) {
45
+ const signed = await this.sign(data, secret);
46
+ return signature === signed;
47
+ }
48
+ buf2hex(buf) {
49
+ return Array.prototype.map
50
+ .call(new Uint8Array(buf), (x) => `00${x.toString(16)}`.slice(-2))
51
+ .join("");
52
+ }
53
+ }
54
+ //# sourceMappingURL=signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/signer.ts"],"names":[],"mappings":"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","sourcesContent":["export class WebCryptoHmacSigner {\n\tprivate encoder: TextEncoder;\n\tprivate keyCache: Map<string, CryptoKey>;\n\n\tconstructor() {\n\t\tthis.encoder = new TextEncoder();\n\t\tthis.keyCache = new Map<string, CryptoKey>();\n\t}\n\n\tasync signResponse(response: Response, secret: string): Promise<void> {\n\t\tresponse.headers.set(\n\t\t\t\"shopware-app-signature\",\n\t\t\tawait this.sign(await response.clone().text(), secret),\n\t\t);\n\t}\n\n\tasync verifyGetRequest(request: Request, secret: string): Promise<void> {\n\t\tconst url = new URL(request.url);\n\t\tconst signature = url.searchParams.get(\"shopware-shop-signature\");\n\n\t\tif (signature === null) {\n\t\t\tthrow new Error(\"Missing shopware-shop-signature query parameter\");\n\t\t}\n\n\t\turl.searchParams.delete(\"shopware-shop-signature\");\n\n\t\tlet body = \"\";\n\n\t\tfor (const searchKey of url.searchParams.keys()) {\n\t\t\tbody += `${searchKey}=${decodeURIComponent(url.searchParams.get(searchKey) as string)}&`;\n\t\t}\n\n\t\tbody = body.slice(0, -1);\n\n\t\tif (body === \"\") {\n\t\t\tthrow new Error(\"Missing query parameters to verify the GET request\");\n\t\t}\n\n\t\tif (!(await this.verify(signature, body, secret))) {\n\t\t\tthrow new Error(\"Invalid signature\");\n\t\t}\n\t}\n\n\tasync getKeyForSecret(secret: string): Promise<CryptoKey> {\n\t\tif (this.keyCache.has(secret)) {\n\t\t\treturn this.keyCache.get(secret) as CryptoKey;\n\t\t}\n\n\t\tconst secretKeyData = this.encoder.encode(secret);\n\t\tconst key = await crypto.subtle.importKey(\n\t\t\t\"raw\",\n\t\t\tsecretKeyData,\n\t\t\t{ name: \"HMAC\", hash: \"SHA-256\" },\n\t\t\tfalse,\n\t\t\t[\"sign\", \"verify\"],\n\t\t);\n\n\t\tthis.keyCache.set(secret, key);\n\n\t\treturn key;\n\t}\n\n\tasync sign(message: string, secret: string): Promise<string> {\n\t\tconst key = await this.getKeyForSecret(secret);\n\n\t\tconst mac = await crypto.subtle.sign(\n\t\t\t\"HMAC\",\n\t\t\tkey as CryptoKey,\n\t\t\tthis.encoder.encode(message),\n\t\t);\n\n\t\treturn this.buf2hex(mac);\n\t}\n\n\tasync verify(\n\t\tsignature: string,\n\t\tdata: string,\n\t\tsecret: string,\n\t): Promise<boolean> {\n\t\tconst signed = await this.sign(data, secret);\n\n\t\treturn signature === signed;\n\t}\n\n\tbuf2hex(buf: ArrayBuffer): string {\n\t\treturn Array.prototype.map\n\t\t\t.call(new Uint8Array(buf), (x) => `00${x.toString(16)}`.slice(-2))\n\t\t\t.join(\"\");\n\t}\n}\n"]}
@@ -0,0 +1,28 @@
1
+ export type BrowserAppModuleRequest = {
2
+ "shop-id": string;
3
+ "shop-url": string;
4
+ timestamp: string;
5
+ "sw-version": string;
6
+ "sw-context-language": string;
7
+ "sw-user-language": string;
8
+ };
9
+ export type Source = {
10
+ url: string;
11
+ shopId: string;
12
+ appVersion: string;
13
+ };
14
+ export type Meta = {
15
+ timestamp: number;
16
+ reference: string;
17
+ language: string;
18
+ };
19
+ export type ActionButtonRequest = {
20
+ source: Source;
21
+ data: {
22
+ ids: string[];
23
+ entity: string;
24
+ action: string;
25
+ };
26
+ meta: Meta;
27
+ };
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QACL,GAAG,EAAE,MAAM,EAAE,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KACf,CAAC;IACF,IAAI,EAAE,IAAI,CAAC;CACX,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["export type BrowserAppModuleRequest = {\n\t\"shop-id\": string;\n\t\"shop-url\": string;\n\ttimestamp: string;\n\t\"sw-version\": string;\n\t\"sw-context-language\": string;\n\t\"sw-user-language\": string;\n};\n\nexport type Source = {\n\turl: string;\n\tshopId: string;\n\tappVersion: string;\n};\n\nexport type Meta = {\n\ttimestamp: number;\n\treference: string;\n\tlanguage: string;\n};\n\nexport type ActionButtonRequest = {\n\tsource: Source;\n\tdata: {\n\t\tids: string[];\n\t\tentity: string;\n\t\taction: string;\n\t};\n\tmeta: Meta;\n};\n"]}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@shopware-ag/app-server-sdk",
3
+ "version": "1.0.0",
4
+ "description": "App Server SDK for JavaScript",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "keywords": ["shopware", "app-server"],
8
+ "exports": {
9
+ "./package.json": "./package.json",
10
+ ".": {
11
+ "deno": {
12
+ "types": "./dist/deno/mod.d.ts",
13
+ "default": "./dist/deno/mod.js"
14
+ },
15
+ "import": {
16
+ "types": "./dist/esm/mod.d.ts",
17
+ "default": "./dist/esm/mod.js"
18
+ },
19
+ "require": {
20
+ "types": "./dist/commonjs/mod.d.ts",
21
+ "default": "./dist/commonjs/mod.js"
22
+ }
23
+ },
24
+ "./helper/app-actions": {
25
+ "deno": {
26
+ "types": "./dist/deno/helper/app-actions.d.ts",
27
+ "default": "./dist/deno/helper/app-actions.js"
28
+ },
29
+ "import": {
30
+ "types": "./dist/esm/helper/app-actions.d.ts",
31
+ "default": "./dist/esm/helper/app-actions.js"
32
+ },
33
+ "require": {
34
+ "types": "./dist/commonjs/helper/app-actions.d.ts",
35
+ "default": "./dist/commonjs/helper/app-actions.js"
36
+ }
37
+ },
38
+ "./types": {
39
+ "deno": {
40
+ "types": "./dist/deno/types.d.ts",
41
+ "default": "./dist/deno/types.js"
42
+ },
43
+ "import": {
44
+ "types": "./dist/esm/types.d.ts",
45
+ "default": "./dist/esm/types.js"
46
+ },
47
+ "require": {
48
+ "types": "./dist/commonjs/types.d.ts",
49
+ "default": "./dist/commonjs/types.js"
50
+ }
51
+ }
52
+ },
53
+ "main": "./dist/commonjs/mod.js",
54
+ "module": "./dist/esm/mod.js",
55
+ "types": "./dist/commonjs/mod.d.ts",
56
+ "files": ["dist"],
57
+ "devDependencies": {
58
+ "@biomejs/biome": "1.8.3",
59
+ "@types/bun": "^1.1.6",
60
+ "tshy": "^3.0.2",
61
+ "hono": "^4.5.6"
62
+ },
63
+ "tshy": {
64
+ "esmDialects": ["deno"],
65
+ "exports": {
66
+ "./package.json": "./package.json",
67
+ ".": "./src/mod.ts",
68
+ "./helper/app-actions": "./src/helper/app-actions.ts",
69
+ "./types": "./src/types.ts"
70
+ }
71
+ }
72
+ }