@fireproof/core 0.20.5-dev-preview-7 → 0.20.5-dev-preview-9

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 (86) hide show
  1. package/blockstore/loader.d.ts +2 -1
  2. package/blockstore/loader.d.ts.map +1 -1
  3. package/blockstore/loader.js +40 -10
  4. package/blockstore/loader.js.map +1 -1
  5. package/blockstore/store.js +1 -1
  6. package/blockstore/store.js.map +1 -1
  7. package/cli/main.js +43 -46
  8. package/database.d.ts +0 -1
  9. package/database.d.ts.map +1 -1
  10. package/database.js +0 -1
  11. package/database.js.map +1 -1
  12. package/deno.json +8 -8
  13. package/ledger.d.ts +3 -2
  14. package/ledger.d.ts.map +1 -1
  15. package/ledger.js +7 -4
  16. package/ledger.js.map +1 -1
  17. package/package.json +9 -9
  18. package/protocols/cloud/msg-types.d.ts.map +1 -1
  19. package/protocols/cloud/msg-types.js.map +1 -1
  20. package/protocols/dashboard/index.d.ts +4 -0
  21. package/protocols/dashboard/index.d.ts.map +1 -0
  22. package/protocols/dashboard/index.js +4 -0
  23. package/protocols/dashboard/index.js.map +1 -0
  24. package/protocols/dashboard/msg-api.d.ts +11 -0
  25. package/protocols/dashboard/msg-api.d.ts.map +1 -0
  26. package/protocols/dashboard/msg-api.js +55 -0
  27. package/protocols/dashboard/msg-api.js.map +1 -0
  28. package/protocols/dashboard/msg-is.d.ts +39 -0
  29. package/protocols/dashboard/msg-is.d.ts.map +1 -0
  30. package/protocols/dashboard/msg-is.js +57 -0
  31. package/protocols/dashboard/msg-is.js.map +1 -0
  32. package/protocols/dashboard/msg-types.d.ts +404 -0
  33. package/protocols/dashboard/msg-types.d.ts.map +1 -0
  34. package/protocols/dashboard/msg-types.js +4 -0
  35. package/protocols/dashboard/msg-types.js.map +1 -0
  36. package/protocols/index.d.ts +1 -0
  37. package/protocols/index.d.ts.map +1 -1
  38. package/protocols/index.js +1 -0
  39. package/protocols/index.js.map +1 -1
  40. package/react/img-file.d.ts +0 -2
  41. package/react/img-file.d.ts.map +1 -1
  42. package/react/types.d.ts +28 -8
  43. package/react/types.d.ts.map +1 -1
  44. package/react/use-attach.d.ts +9 -4
  45. package/react/use-attach.d.ts.map +1 -1
  46. package/react/use-attach.js +144 -43
  47. package/react/use-attach.js.map +1 -1
  48. package/react/use-fireproof.js +2 -2
  49. package/react/use-fireproof.js.map +1 -1
  50. package/runtime/gateways/cloud/to-cloud.d.ts +21 -9
  51. package/runtime/gateways/cloud/to-cloud.d.ts.map +1 -1
  52. package/runtime/gateways/cloud/to-cloud.js +73 -59
  53. package/runtime/gateways/cloud/to-cloud.js.map +1 -1
  54. package/runtime/gateways/file/key-bag-file.d.ts +1 -0
  55. package/runtime/gateways/file/key-bag-file.d.ts.map +1 -1
  56. package/runtime/gateways/file/key-bag-file.js +12 -0
  57. package/runtime/gateways/file/key-bag-file.js.map +1 -1
  58. package/runtime/gateways/indexeddb/gateway-impl.d.ts.map +1 -1
  59. package/runtime/gateways/indexeddb/gateway-impl.js.map +1 -1
  60. package/runtime/gateways/indexeddb/key-bag-indexeddb.d.ts +1 -0
  61. package/runtime/gateways/indexeddb/key-bag-indexeddb.d.ts.map +1 -1
  62. package/runtime/gateways/indexeddb/key-bag-indexeddb.js +6 -0
  63. package/runtime/gateways/indexeddb/key-bag-indexeddb.js.map +1 -1
  64. package/runtime/key-bag-memory.d.ts +1 -0
  65. package/runtime/key-bag-memory.d.ts.map +1 -1
  66. package/runtime/key-bag-memory.js +7 -0
  67. package/runtime/key-bag-memory.js.map +1 -1
  68. package/runtime/key-bag.d.ts +3 -0
  69. package/runtime/key-bag.d.ts.map +1 -1
  70. package/runtime/key-bag.js +6 -0
  71. package/runtime/key-bag.js.map +1 -1
  72. package/tests/fireproof/attachable.test.ts +1 -1
  73. package/types.d.ts +1 -2
  74. package/types.d.ts.map +1 -1
  75. package/use-fireproof/iframe-strategy.d.ts +6 -4
  76. package/use-fireproof/iframe-strategy.d.ts.map +1 -1
  77. package/use-fireproof/iframe-strategy.js +7 -11
  78. package/use-fireproof/iframe-strategy.js.map +1 -1
  79. package/use-fireproof/index.d.ts +6 -2
  80. package/use-fireproof/index.d.ts.map +1 -1
  81. package/use-fireproof/index.js +20 -3
  82. package/use-fireproof/index.js.map +1 -1
  83. package/use-fireproof/redirect-strategy.d.ts +11 -4
  84. package/use-fireproof/redirect-strategy.d.ts.map +1 -1
  85. package/use-fireproof/redirect-strategy.js +136 -20
  86. package/use-fireproof/redirect-strategy.js.map +1 -1
@@ -1,31 +1,147 @@
1
- import { BuildURI, URI } from "@adviser/cement";
2
- import { sleep } from "@fireproof/core";
1
+ import { BuildURI } from "@adviser/cement";
2
+ import { ps } from "@fireproof/core";
3
3
  import { WebCtx } from "@fireproof/core/react";
4
+ import { decodeJwt } from "jose";
5
+ function overlayHtml(redirectLink) {
6
+ return `
7
+ <div class="fpOverlayContent">
8
+ <div class="fpCloseButton">&times;</div>
9
+ Fireproof Dashboard
10
+ Sign in to Fireproof Dashboard
11
+ <a href="${redirectLink}" target="_blank">Redirect to Fireproof</a>
12
+ </div>
13
+ `;
14
+ }
15
+ const overlayCss = `
16
+ .fpContainer {
17
+ position: relative; /* Needed for absolute positioning of the overlay */
18
+ }
19
+
20
+ .fpOverlay {
21
+ display: none; /* Initially hidden */
22
+ position: fixed; /* Covers the whole viewport */
23
+ top: 0;
24
+ left: 0;
25
+ width: 100%;
26
+ height: 100%;
27
+ background-color: rgba(0, 0, 0, 0.5); /* Semi-transparent background */
28
+ z-index: 1; /* Ensure it's on top of other content */
29
+ }
30
+
31
+ .fpOverlayContent {
32
+ position: absolute;
33
+ // width: calc(100vw - 50px);
34
+ // height: calc(100vh - 50px);
35
+ top: 50%;
36
+ left: 50%;
37
+ transform: translate(-50%, -50%); /* Center the content */
38
+ // transform: translate(0%, 0%); /* Center the content */
39
+ background-color: white;
40
+ color: black;
41
+ // margin: 10px;
42
+ padding: 20px;
43
+ border-radius: 5px;
44
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
45
+ }
46
+
47
+ .fpCloseButton {
48
+ position: absolute;
49
+ top: 10px;
50
+ right: 15px;
51
+ font-size: 20px;
52
+ cursor: pointer;
53
+ }
54
+ `;
4
55
  export class RedirectStrategy {
5
- open(logger, deviceId, opts) {
56
+ constructor() {
57
+ this.waitState = "stopped";
58
+ }
59
+ open(sthis, logger, deviceId, opts) {
6
60
  const redirectCtx = opts.context.get(WebCtx);
7
61
  logger.Debug().Url(redirectCtx.dashboardURI).Msg("open redirect");
62
+ this.resultId = sthis.nextId().str;
8
63
  const url = BuildURI.from(redirectCtx.dashboardURI)
9
64
  .setParam("back_url", window.location.href)
10
- .setParam("local_ledger_name", deviceId)
11
- .toString();
12
- window.location.href = url;
65
+ .setParam("result_id", this.resultId)
66
+ .setParam("local_ledger_name", deviceId);
67
+ if (opts.ledger) {
68
+ url.setParam("ledger", opts.ledger);
69
+ }
70
+ if (opts.tenant) {
71
+ url.setParam("tenant", opts.tenant);
72
+ }
73
+ let overlayNode = document.body.querySelector("#fpOverlay");
74
+ if (!overlayNode) {
75
+ const styleNode = document.createElement("style");
76
+ styleNode.innerHTML = overlayCss;
77
+ document.head.appendChild(styleNode);
78
+ overlayNode = document.createElement("div");
79
+ overlayNode.id = "fpOverlay";
80
+ overlayNode.className = "fpOverlay";
81
+ overlayNode.innerHTML = overlayHtml(url.toString());
82
+ document.body.appendChild(overlayNode);
83
+ overlayNode.querySelector(".fpCloseButton")?.addEventListener("click", () => {
84
+ if (overlayNode) {
85
+ if (overlayNode.style.display === "block") {
86
+ overlayNode.style.display = "none";
87
+ this.stop();
88
+ }
89
+ else {
90
+ overlayNode.style.display = "block";
91
+ }
92
+ }
93
+ });
94
+ }
95
+ overlayNode.style.display = "block";
96
+ this.overlayNode = overlayNode;
13
97
  }
14
- async gatherToken(logger, opts) {
15
- const redirectCtx = opts.context.get(WebCtx);
16
- const uri = URI.from(window.location.href);
17
- const uriFpToken = uri.getParam(redirectCtx.tokenKey);
18
- if (uriFpToken) {
19
- redirectCtx.setToken(uriFpToken);
20
- logger.Debug().Any({ uriFpToken }).Msg("Token set");
21
- window.location.href = uri.build().delParam(redirectCtx.tokenKey).toString();
22
- }
23
- return redirectCtx.token();
98
+ stop() {
99
+ if (this.waiting) {
100
+ clearTimeout(this.waiting);
101
+ this.waiting = undefined;
102
+ }
103
+ }
104
+ async tryToken(sthis, logger, opts) {
105
+ if (!this.currentToken) {
106
+ const webCtx = opts.context.get(WebCtx);
107
+ this.currentToken = await webCtx.token();
108
+ }
109
+ return this.currentToken;
24
110
  }
25
- async waitForToken(logger) {
26
- logger.Warn().Msg("waitForToken should not be called -- using redirect strategy");
27
- await sleep(100000);
28
- throw new Error("waitForToken not working on redirect strategy");
111
+ async getTokenAndClaimsByResultId(logger, dashApi, resultId, opts, resolve) {
112
+ if (!resultId) {
113
+ return logger.Error().Msg("No resultId");
114
+ }
115
+ if (this.waitState !== "started") {
116
+ return;
117
+ }
118
+ const rWaitForToken = await dashApi.waitForToken({ resultId }, logger);
119
+ if (rWaitForToken.isErr()) {
120
+ return logger.Error().Err(rWaitForToken).Msg("Error fetching token").ResultError();
121
+ }
122
+ const waitedTokenByResultId = rWaitForToken.unwrap();
123
+ if (waitedTokenByResultId.status === "found" && waitedTokenByResultId.token) {
124
+ const token = waitedTokenByResultId.token;
125
+ const claims = decodeJwt(token);
126
+ this.overlayNode?.style.setProperty("display", "none");
127
+ resolve({ token, claims });
128
+ return;
129
+ }
130
+ this.waiting = setTimeout(() => this.getTokenAndClaimsByResultId(logger, dashApi, resultId, opts, resolve), opts.interval);
131
+ }
132
+ async waitForToken(sthis, logger, deviceId, opts) {
133
+ if (!this.resultId) {
134
+ throw new Error("waitForToken not working on redirect strategy");
135
+ }
136
+ const webCtx = opts.context.get(WebCtx);
137
+ const dashApi = new ps.dashboard.Api(webCtx.tokenApiURI);
138
+ this.waitState = "started";
139
+ return new Promise((resolve) => {
140
+ this.getTokenAndClaimsByResultId(logger, dashApi, this.resultId, opts, (tokenAndClaims) => {
141
+ this.currentToken = tokenAndClaims;
142
+ resolve(tokenAndClaims);
143
+ });
144
+ });
29
145
  }
30
146
  }
31
147
  //# sourceMappingURL=redirect-strategy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"redirect-strategy.js","sourceRoot":"","sources":["../../../../src/use-fireproof/redirect-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAU,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAM,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D,MAAM,OAAO,gBAAgB;IAC3B,IAAI,CAAC,MAAc,EAAE,QAAgB,EAAE,IAA6B;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAkB,CAAC;QAC9D,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAClE,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;aAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;aAC1C,QAAQ,CAAC,mBAAmB,EAAE,QAAQ,CAAC;aACvC,QAAQ,EAAE,CAAC;QACd,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,IAA6B;QAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAkB,CAAC;QAC9D,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,UAAU,EAAE,CAAC;YACf,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACpD,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/E,CAAC;QACD,OAAO,WAAW,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc;QAC/B,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAClF,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;CACF"}
1
+ {"version":3,"file":"redirect-strategy.js","sourceRoot":"","sources":["../../../../src/use-fireproof/redirect-strategy.ts"],"names":[],"mappings":"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"}