@hocuspocus/extension-webhook 3.4.4 → 3.4.5-rc.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 (142) hide show
  1. package/dist/hocuspocus-webhook.cjs +169 -168
  2. package/dist/hocuspocus-webhook.cjs.map +1 -1
  3. package/dist/hocuspocus-webhook.esm.js +140 -167
  4. package/dist/hocuspocus-webhook.esm.js.map +1 -1
  5. package/dist/index.d.ts +61 -0
  6. package/dist/index.js +142 -0
  7. package/package.json +6 -6
  8. package/dist/node_modules/@tiptap/pm/model/index.d.ts +0 -1
  9. package/dist/node_modules/@tiptap/pm/state/index.d.ts +0 -1
  10. package/dist/node_modules/@tiptap/pm/transform/index.d.ts +0 -1
  11. package/dist/node_modules/@tiptap/pm/view/index.d.ts +0 -1
  12. package/dist/packages/common/src/CloseEvents.d.ts +0 -29
  13. package/dist/packages/common/src/auth.d.ts +0 -13
  14. package/dist/packages/common/src/awarenessStatesToArray.d.ts +0 -3
  15. package/dist/packages/common/src/index.d.ts +0 -4
  16. package/dist/packages/common/src/types.d.ts +0 -10
  17. package/dist/packages/extension-database/src/Database.d.ts +0 -30
  18. package/dist/packages/extension-database/src/index.d.ts +0 -1
  19. package/dist/packages/extension-logger/src/Logger.d.ts +0 -67
  20. package/dist/packages/extension-logger/src/index.d.ts +0 -1
  21. package/dist/packages/extension-redis/src/Redis.d.ts +0 -124
  22. package/dist/packages/extension-redis/src/index.d.ts +0 -1
  23. package/dist/packages/extension-s3/src/S3.d.ts +0 -44
  24. package/dist/packages/extension-s3/src/index.d.ts +0 -1
  25. package/dist/packages/extension-sqlite/src/SQLite.d.ts +0 -27
  26. package/dist/packages/extension-sqlite/src/index.d.ts +0 -1
  27. package/dist/packages/extension-throttle/src/index.d.ts +0 -30
  28. package/dist/packages/extension-webhook/src/index.d.ts +0 -56
  29. package/dist/packages/provider/src/EventEmitter.d.ts +0 -9
  30. package/dist/packages/provider/src/HocuspocusProvider.d.ts +0 -116
  31. package/dist/packages/provider/src/HocuspocusProviderWebsocket.d.ts +0 -119
  32. package/dist/packages/provider/src/IncomingMessage.d.ts +0 -17
  33. package/dist/packages/provider/src/MessageReceiver.d.ts +0 -12
  34. package/dist/packages/provider/src/MessageSender.d.ts +0 -9
  35. package/dist/packages/provider/src/OutgoingMessage.d.ts +0 -9
  36. package/dist/packages/provider/src/OutgoingMessages/AuthenticationMessage.d.ts +0 -8
  37. package/dist/packages/provider/src/OutgoingMessages/AwarenessMessage.d.ts +0 -9
  38. package/dist/packages/provider/src/OutgoingMessages/CloseMessage.d.ts +0 -9
  39. package/dist/packages/provider/src/OutgoingMessages/QueryAwarenessMessage.d.ts +0 -9
  40. package/dist/packages/provider/src/OutgoingMessages/StatelessMessage.d.ts +0 -8
  41. package/dist/packages/provider/src/OutgoingMessages/SyncStepOneMessage.d.ts +0 -9
  42. package/dist/packages/provider/src/OutgoingMessages/SyncStepTwoMessage.d.ts +0 -9
  43. package/dist/packages/provider/src/OutgoingMessages/UpdateMessage.d.ts +0 -8
  44. package/dist/packages/provider/src/index.d.ts +0 -3
  45. package/dist/packages/provider/src/types.d.ts +0 -93
  46. package/dist/packages/server/src/ClientConnection.d.ts +0 -63
  47. package/dist/packages/server/src/Connection.d.ts +0 -75
  48. package/dist/packages/server/src/DirectConnection.d.ts +0 -14
  49. package/dist/packages/server/src/Document.d.ts +0 -92
  50. package/dist/packages/server/src/Hocuspocus.d.ts +0 -80
  51. package/dist/packages/server/src/IncomingMessage.d.ts +0 -25
  52. package/dist/packages/server/src/MessageReceiver.d.ts +0 -11
  53. package/dist/packages/server/src/OutgoingMessage.d.ts +0 -23
  54. package/dist/packages/server/src/Server.d.ts +0 -32
  55. package/dist/packages/server/src/index.d.ts +0 -9
  56. package/dist/packages/server/src/types.d.ts +0 -342
  57. package/dist/packages/server/src/util/debounce.d.ts +0 -6
  58. package/dist/packages/server/src/util/getParameters.d.ts +0 -6
  59. package/dist/packages/transformer/src/Prosemirror.d.ts +0 -11
  60. package/dist/packages/transformer/src/Tiptap.d.ts +0 -10
  61. package/dist/packages/transformer/src/index.d.ts +0 -3
  62. package/dist/packages/transformer/src/types.d.ts +0 -5
  63. package/dist/playground/backend/src/default.d.ts +0 -1
  64. package/dist/playground/backend/src/deno.d.ts +0 -1
  65. package/dist/playground/backend/src/express.d.ts +0 -1
  66. package/dist/playground/backend/src/hono.d.ts +0 -1
  67. package/dist/playground/backend/src/koa.d.ts +0 -1
  68. package/dist/playground/backend/src/load-document.d.ts +0 -1
  69. package/dist/playground/backend/src/redis.d.ts +0 -1
  70. package/dist/playground/backend/src/s3-redis.d.ts +0 -1
  71. package/dist/playground/backend/src/s3.d.ts +0 -1
  72. package/dist/playground/backend/src/slow.d.ts +0 -1
  73. package/dist/playground/backend/src/tiptapcollab.d.ts +0 -1
  74. package/dist/playground/backend/src/webhook.d.ts +0 -1
  75. package/dist/playground/frontend/app/SocketContext1.d.ts +0 -2
  76. package/dist/playground/frontend/app/SocketContext2.d.ts +0 -2
  77. package/dist/playground/frontend/next.config.d.ts +0 -3
  78. package/dist/tests/extension-database/fetch.d.ts +0 -1
  79. package/dist/tests/extension-logger/onListen.d.ts +0 -1
  80. package/dist/tests/extension-redis/onAwarenessChange.d.ts +0 -1
  81. package/dist/tests/extension-redis/onChange.d.ts +0 -1
  82. package/dist/tests/extension-redis/onStateless.d.ts +0 -1
  83. package/dist/tests/extension-redis/onStoreDocument.d.ts +0 -1
  84. package/dist/tests/extension-s3/fetch.d.ts +0 -1
  85. package/dist/tests/extension-throttle/banning.d.ts +0 -1
  86. package/dist/tests/extension-throttle/configuration.d.ts +0 -1
  87. package/dist/tests/provider/hasUnsyncedChanges.d.ts +0 -1
  88. package/dist/tests/provider/observe.d.ts +0 -1
  89. package/dist/tests/provider/observeDeep.d.ts +0 -1
  90. package/dist/tests/provider/onAuthenticated.d.ts +0 -1
  91. package/dist/tests/provider/onAuthenticationFailed.d.ts +0 -1
  92. package/dist/tests/provider/onAwarenessChange.d.ts +0 -1
  93. package/dist/tests/provider/onAwarenessUpdate.d.ts +0 -1
  94. package/dist/tests/provider/onClose.d.ts +0 -1
  95. package/dist/tests/provider/onConnect.d.ts +0 -1
  96. package/dist/tests/provider/onDisconnect.d.ts +0 -1
  97. package/dist/tests/provider/onMessage.d.ts +0 -1
  98. package/dist/tests/provider/onOpen.d.ts +0 -1
  99. package/dist/tests/provider/onStateless.d.ts +0 -1
  100. package/dist/tests/provider/onSynced.d.ts +0 -1
  101. package/dist/tests/providerwebsocket/configuration.d.ts +0 -1
  102. package/dist/tests/server/address.d.ts +0 -1
  103. package/dist/tests/server/afterLoadDocument.d.ts +0 -1
  104. package/dist/tests/server/afterStoreDocument.d.ts +0 -1
  105. package/dist/tests/server/afterUnloadDocument.d.ts +0 -1
  106. package/dist/tests/server/beforeBroadcastStateless.d.ts +0 -1
  107. package/dist/tests/server/beforeHandleMessage.d.ts +0 -1
  108. package/dist/tests/server/beforeSync.d.ts +0 -1
  109. package/dist/tests/server/beforeUnloadDocument.d.ts +0 -1
  110. package/dist/tests/server/closeConnections.d.ts +0 -1
  111. package/dist/tests/server/getConnectionsCount.d.ts +0 -1
  112. package/dist/tests/server/getDocumentsCount.d.ts +0 -1
  113. package/dist/tests/server/listen.d.ts +0 -1
  114. package/dist/tests/server/onAuthenticate.d.ts +0 -1
  115. package/dist/tests/server/onAwarenessUpdate.d.ts +0 -1
  116. package/dist/tests/server/onChange.d.ts +0 -1
  117. package/dist/tests/server/onClose.d.ts +0 -1
  118. package/dist/tests/server/onConfigure.d.ts +0 -1
  119. package/dist/tests/server/onConnect.d.ts +0 -1
  120. package/dist/tests/server/onDestroy.d.ts +0 -1
  121. package/dist/tests/server/onDisconnect.d.ts +0 -1
  122. package/dist/tests/server/onListen.d.ts +0 -1
  123. package/dist/tests/server/onLoadDocument.d.ts +0 -1
  124. package/dist/tests/server/onRequest.d.ts +0 -1
  125. package/dist/tests/server/onStateless.d.ts +0 -1
  126. package/dist/tests/server/onStoreDocument.d.ts +0 -1
  127. package/dist/tests/server/onTokenSync.d.ts +0 -1
  128. package/dist/tests/server/onUpgrade.d.ts +0 -1
  129. package/dist/tests/server/openDirectConnection.d.ts +0 -1
  130. package/dist/tests/server/websocketError.d.ts +0 -1
  131. package/dist/tests/transformer/TiptapTransformer.d.ts +0 -1
  132. package/dist/tests/utils/createDirectory.d.ts +0 -1
  133. package/dist/tests/utils/flushRedis.d.ts +0 -1
  134. package/dist/tests/utils/index.d.ts +0 -9
  135. package/dist/tests/utils/newHocuspocus.d.ts +0 -2
  136. package/dist/tests/utils/newHocuspocusProvider.d.ts +0 -3
  137. package/dist/tests/utils/newHocuspocusProviderWebsocket.d.ts +0 -4
  138. package/dist/tests/utils/randomInteger.d.ts +0 -1
  139. package/dist/tests/utils/redisConnectionSettings.d.ts +0 -4
  140. package/dist/tests/utils/removeDirectory.d.ts +0 -1
  141. package/dist/tests/utils/retryableAssertion.d.ts +0 -2
  142. package/dist/tests/utils/sleep.d.ts +0 -1
@@ -1,172 +1,173 @@
1
- 'use strict';
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ //#region \0rolldown/runtime.js
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
12
+ key = keys[i];
13
+ if (!__hasOwnProp.call(to, key) && key !== except) {
14
+ __defProp(to, key, {
15
+ get: ((k) => from[k]).bind(null, key),
16
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
17
+ });
18
+ }
19
+ }
20
+ }
21
+ return to;
22
+ };
23
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
24
+ value: mod,
25
+ enumerable: true
26
+ }) : target, mod));
2
27
 
3
- var node_crypto = require('node:crypto');
4
- var common = require('@hocuspocus/common');
5
- var transformer = require('@hocuspocus/transformer');
6
- var axios = require('axios');
28
+ //#endregion
29
+ let node_crypto = require("node:crypto");
30
+ let _hocuspocus_common = require("@hocuspocus/common");
31
+ let _hocuspocus_transformer = require("@hocuspocus/transformer");
32
+ let axios = require("axios");
33
+ axios = __toESM(axios);
7
34
 
8
- exports.Events = void 0;
9
- (function (Events) {
10
- Events["onChange"] = "change";
11
- Events["onConnect"] = "connect";
12
- Events["onCreate"] = "create";
13
- Events["onDisconnect"] = "disconnect";
14
- })(exports.Events || (exports.Events = {}));
15
- class Webhook {
16
- /**
17
- * Constructor
18
- */
19
- constructor(configuration) {
20
- this.configuration = {
21
- debounce: 2000,
22
- debounceMaxWait: 10000,
23
- secret: "",
24
- transformer: transformer.TiptapTransformer,
25
- url: "",
26
- events: [exports.Events.onChange],
27
- };
28
- this.debounced = new Map();
29
- this.configuration = {
30
- ...this.configuration,
31
- ...configuration,
32
- };
33
- if (!this.configuration.url) {
34
- throw new Error("url is required!");
35
- }
36
- }
37
- /**
38
- * Create a signature for the response body
39
- */
40
- createSignature(body) {
41
- const hmac = node_crypto.createHmac("sha256", this.configuration.secret);
42
- return `sha256=${hmac.update(body).digest("hex")}`;
43
- }
44
- /**
45
- * debounce the given function, using the given identifier
46
- */
47
- // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
48
- debounce(id, func) {
49
- const old = this.debounced.get(id);
50
- const start = (old === null || old === void 0 ? void 0 : old.start) || Date.now();
51
- const run = () => {
52
- this.debounced.delete(id);
53
- func();
54
- };
55
- if (old === null || old === void 0 ? void 0 : old.timeout)
56
- clearTimeout(old.timeout);
57
- if (Date.now() - start >= this.configuration.debounceMaxWait)
58
- return run();
59
- this.debounced.set(id, {
60
- start,
61
- timeout: setTimeout(run, this.configuration.debounce),
62
- });
63
- }
64
- /**
65
- * Send a request to the given url containing the given data
66
- */
67
- async sendRequest(event, payload) {
68
- const json = JSON.stringify({ event, payload });
69
- return axios.post(this.configuration.url, json, {
70
- headers: {
71
- "X-Hocuspocus-Signature-256": this.createSignature(json),
72
- "Content-Type": "application/json",
73
- },
74
- });
75
- }
76
- /**
77
- * onChange hook
78
- */
79
- async onChange(data) {
80
- if (!this.configuration.events.includes(exports.Events.onChange)) {
81
- return;
82
- }
83
- const save = async () => {
84
- try {
85
- await this.sendRequest(exports.Events.onChange, {
86
- document: this.configuration.transformer.fromYdoc(data.document),
87
- documentName: data.documentName,
88
- context: data.context,
89
- requestHeaders: data.requestHeaders,
90
- requestParameters: Object.fromEntries(data.requestParameters.entries()),
91
- });
92
- }
93
- catch (e) {
94
- console.error(`Caught error in extension-webhook: ${e}`);
95
- }
96
- };
97
- if (!this.configuration.debounce) {
98
- return save();
99
- }
100
- this.debounce(data.documentName, save);
101
- }
102
- /**
103
- * onLoadDocument hook
104
- */
105
- async onLoadDocument(data) {
106
- if (!this.configuration.events.includes(exports.Events.onCreate)) {
107
- return;
108
- }
109
- try {
110
- const response = await this.sendRequest(exports.Events.onCreate, {
111
- documentName: data.documentName,
112
- requestHeaders: data.requestHeaders,
113
- requestParameters: Object.fromEntries(data.requestParameters.entries()),
114
- });
115
- if (response.status !== 200 || !response.data)
116
- return;
117
- const document = typeof response.data === "string"
118
- ? JSON.parse(response.data)
119
- : response.data;
120
- // eslint-disable-next-line guard-for-in,no-restricted-syntax
121
- for (const fieldName in document) {
122
- if (data.document.isEmpty(fieldName)) {
123
- data.document.merge(this.configuration.transformer.toYdoc(document[fieldName], fieldName));
124
- }
125
- }
126
- }
127
- catch (e) {
128
- console.error(`Caught error in extension-webhook: ${e}`);
129
- }
130
- }
131
- /**
132
- * onConnect hook
133
- */
134
- async onConnect(data) {
135
- if (!this.configuration.events.includes(exports.Events.onConnect)) {
136
- return;
137
- }
138
- try {
139
- const response = await this.sendRequest(exports.Events.onConnect, {
140
- documentName: data.documentName,
141
- requestHeaders: data.requestHeaders,
142
- requestParameters: Object.fromEntries(data.requestParameters.entries()),
143
- });
144
- return typeof response.data === "string" && response.data.length > 0
145
- ? JSON.parse(response.data)
146
- : response.data;
147
- }
148
- catch (e) {
149
- console.error(`Caught error in extension-webhook: ${e}`);
150
- throw common.Forbidden;
151
- }
152
- }
153
- async onDisconnect(data) {
154
- if (!this.configuration.events.includes(exports.Events.onDisconnect)) {
155
- return;
156
- }
157
- try {
158
- await this.sendRequest(exports.Events.onDisconnect, {
159
- documentName: data.documentName,
160
- requestHeaders: data.requestHeaders,
161
- requestParameters: Object.fromEntries(data.requestParameters.entries()),
162
- context: data.context,
163
- });
164
- }
165
- catch (e) {
166
- console.error(`Caught error in extension-webhook: ${e}`);
167
- }
168
- }
169
- }
35
+ //#region packages/extension-webhook/src/index.ts
36
+ let Events = /* @__PURE__ */ function(Events) {
37
+ Events["onChange"] = "change";
38
+ Events["onConnect"] = "connect";
39
+ Events["onCreate"] = "create";
40
+ Events["onDisconnect"] = "disconnect";
41
+ return Events;
42
+ }({});
43
+ var Webhook = class {
44
+ /**
45
+ * Constructor
46
+ */
47
+ constructor(configuration) {
48
+ this.configuration = {
49
+ debounce: 2e3,
50
+ debounceMaxWait: 1e4,
51
+ secret: "",
52
+ transformer: _hocuspocus_transformer.TiptapTransformer,
53
+ url: "",
54
+ events: [Events.onChange]
55
+ };
56
+ this.debounced = /* @__PURE__ */ new Map();
57
+ this.configuration = {
58
+ ...this.configuration,
59
+ ...configuration
60
+ };
61
+ if (!this.configuration.url) throw new Error("url is required!");
62
+ }
63
+ /**
64
+ * Create a signature for the response body
65
+ */
66
+ createSignature(body) {
67
+ return `sha256=${(0, node_crypto.createHmac)("sha256", this.configuration.secret).update(body).digest("hex")}`;
68
+ }
69
+ /**
70
+ * debounce the given function, using the given identifier
71
+ */
72
+ debounce(id, func) {
73
+ const old = this.debounced.get(id);
74
+ const start = old?.start || Date.now();
75
+ const run = () => {
76
+ this.debounced.delete(id);
77
+ func();
78
+ };
79
+ if (old?.timeout) clearTimeout(old.timeout);
80
+ if (Date.now() - start >= this.configuration.debounceMaxWait) return run();
81
+ this.debounced.set(id, {
82
+ start,
83
+ timeout: setTimeout(run, this.configuration.debounce)
84
+ });
85
+ }
86
+ /**
87
+ * Send a request to the given url containing the given data
88
+ */
89
+ async sendRequest(event, payload) {
90
+ const json = JSON.stringify({
91
+ event,
92
+ payload
93
+ });
94
+ return axios.default.post(this.configuration.url, json, { headers: {
95
+ "X-Hocuspocus-Signature-256": this.createSignature(json),
96
+ "Content-Type": "application/json"
97
+ } });
98
+ }
99
+ /**
100
+ * onChange hook
101
+ */
102
+ async onChange(data) {
103
+ if (!this.configuration.events.includes(Events.onChange)) return;
104
+ const save = async () => {
105
+ try {
106
+ await this.sendRequest(Events.onChange, {
107
+ document: this.configuration.transformer.fromYdoc(data.document),
108
+ documentName: data.documentName,
109
+ context: data.context,
110
+ requestHeaders: data.requestHeaders,
111
+ requestParameters: Object.fromEntries(data.requestParameters.entries())
112
+ });
113
+ } catch (e) {
114
+ console.error(`Caught error in extension-webhook: ${e}`);
115
+ }
116
+ };
117
+ if (!this.configuration.debounce) return save();
118
+ this.debounce(data.documentName, save);
119
+ }
120
+ /**
121
+ * onLoadDocument hook
122
+ */
123
+ async onLoadDocument(data) {
124
+ if (!this.configuration.events.includes(Events.onCreate)) return;
125
+ try {
126
+ const response = await this.sendRequest(Events.onCreate, {
127
+ documentName: data.documentName,
128
+ requestHeaders: data.requestHeaders,
129
+ requestParameters: Object.fromEntries(data.requestParameters.entries())
130
+ });
131
+ if (response.status !== 200 || !response.data) return;
132
+ const document = typeof response.data === "string" ? JSON.parse(response.data) : response.data;
133
+ for (const fieldName in document) if (data.document.isEmpty(fieldName)) data.document.merge(this.configuration.transformer.toYdoc(document[fieldName], fieldName));
134
+ } catch (e) {
135
+ console.error(`Caught error in extension-webhook: ${e}`);
136
+ }
137
+ }
138
+ /**
139
+ * onConnect hook
140
+ */
141
+ async onConnect(data) {
142
+ if (!this.configuration.events.includes(Events.onConnect)) return;
143
+ try {
144
+ const response = await this.sendRequest(Events.onConnect, {
145
+ documentName: data.documentName,
146
+ requestHeaders: data.requestHeaders,
147
+ requestParameters: Object.fromEntries(data.requestParameters.entries())
148
+ });
149
+ return typeof response.data === "string" && response.data.length > 0 ? JSON.parse(response.data) : response.data;
150
+ } catch (e) {
151
+ console.error(`Caught error in extension-webhook: ${e}`);
152
+ throw _hocuspocus_common.Forbidden;
153
+ }
154
+ }
155
+ async onDisconnect(data) {
156
+ if (!this.configuration.events.includes(Events.onDisconnect)) return;
157
+ try {
158
+ await this.sendRequest(Events.onDisconnect, {
159
+ documentName: data.documentName,
160
+ requestHeaders: data.requestHeaders,
161
+ requestParameters: Object.fromEntries(data.requestParameters.entries()),
162
+ context: data.context
163
+ });
164
+ } catch (e) {
165
+ console.error(`Caught error in extension-webhook: ${e}`);
166
+ }
167
+ }
168
+ };
170
169
 
170
+ //#endregion
171
+ exports.Events = Events;
171
172
  exports.Webhook = Webhook;
172
- //# sourceMappingURL=hocuspocus-webhook.cjs.map
173
+ //# sourceMappingURL=hocuspocus-webhook.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"hocuspocus-webhook.cjs","sources":["../src/index.ts"],"sourcesContent":[null],"names":["Events","TiptapTransformer","createHmac","Forbidden"],"mappings":";;;;;;;AAcYA;AAAZ,CAAA,UAAY,MAAM,EAAA;AACjB,IAAA,MAAA,CAAA,UAAA,CAAA,GAAA,QAAmB;AACnB,IAAA,MAAA,CAAA,WAAA,CAAA,GAAA,SAAqB;AACrB,IAAA,MAAA,CAAA,UAAA,CAAA,GAAA,QAAmB;AACnB,IAAA,MAAA,CAAA,cAAA,CAAA,GAAA,YAA2B;AAC5B,CAAC,EALWA,cAAM,KAANA,cAAM,GAKjB,EAAA,CAAA,CAAA;MAgBY,OAAO,CAAA;AAanB;;AAEG;AACH,IAAA,WAAA,CAAY,aAAsC,EAAA;AAflD,QAAA,IAAA,CAAA,aAAa,GAAkB;AAC9B,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,eAAe,EAAE,KAAK;AACtB,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,WAAW,EAAEC,6BAAiB;AAC9B,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,MAAM,EAAE,CAACD,cAAM,CAAC,QAAQ,CAAC;SACzB;AAED,QAAA,IAAA,CAAA,SAAS,GACR,IAAI,GAAG,EAAE;QAMT,IAAI,CAAC,aAAa,GAAG;YACpB,GAAG,IAAI,CAAC,aAAa;AACrB,YAAA,GAAG,aAAa;SAChB;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE;AAC5B,YAAA,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC;;;AAIrC;;AAEG;AACH,IAAA,eAAe,CAAC,IAAY,EAAA;AAC3B,QAAA,MAAM,IAAI,GAAGE,sBAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAE5D,QAAA,OAAO,CAAU,OAAA,EAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;;AAGnD;;AAEG;;IAEH,QAAQ,CAAC,EAAU,EAAE,IAAc,EAAA;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,QAAA,MAAM,KAAK,GAAG,CAAA,GAAG,aAAH,GAAG,KAAA,MAAA,GAAA,MAAA,GAAH,GAAG,CAAE,KAAK,KAAI,IAAI,CAAC,GAAG,EAAE;QAEtC,MAAM,GAAG,GAAG,MAAK;AAChB,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AACzB,YAAA,IAAI,EAAE;AACP,SAAC;AAED,QAAA,IAAI,GAAG,KAAH,IAAA,IAAA,GAAG,KAAH,MAAA,GAAA,MAAA,GAAA,GAAG,CAAE,OAAO;AAAE,YAAA,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;QAC3C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,eAAe;YAAE,OAAO,GAAG,EAAE;AAE1E,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE;YACtB,KAAK;YACL,OAAO,EAAE,UAAU,CAAC,GAAG,EAAU,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC7D,SAAA,CAAC;;AAGH;;AAEG;AACH,IAAA,MAAM,WAAW,CAAC,KAAa,EAAE,OAAY,EAAA;AAC5C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAE/C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE;AAC/C,YAAA,OAAO,EAAE;AACR,gBAAA,4BAA4B,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACxD,gBAAA,cAAc,EAAE,kBAAkB;AAClC,aAAA;AACD,SAAA,CAAC;;AAGH;;AAEG;IACH,MAAM,QAAQ,CAAC,IAAqB,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAACF,cAAM,CAAC,QAAQ,CAAC,EAAE;YACzD;;AAGD,QAAA,MAAM,IAAI,GAAG,YAAW;AACvB,YAAA,IAAI;AACH,gBAAA,MAAM,IAAI,CAAC,WAAW,CAACA,cAAM,CAAC,QAAQ,EAAE;AACvC,oBAAA,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAChE,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,cAAc,EAAE,IAAI,CAAC,cAAc;oBACnC,iBAAiB,EAAE,MAAM,CAAC,WAAW,CACpC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAChC;AACD,iBAAA,CAAC;;YACD,OAAO,CAAC,EAAE;AACX,gBAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA,CAAE,CAAC;;AAE1D,SAAC;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YACjC,OAAO,IAAI,EAAE;;QAGd,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC;;AAGvC;;AAEG;IACH,MAAM,cAAc,CAAC,IAA2B,EAAA;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAACA,cAAM,CAAC,QAAQ,CAAC,EAAE;YACzD;;AAGD,QAAA,IAAI;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAACA,cAAM,CAAC,QAAQ,EAAE;gBACxD,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;AACvE,aAAA,CAAC;YAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;gBAAE;AAE/C,YAAA,MAAM,QAAQ,GACb,OAAO,QAAQ,CAAC,IAAI,KAAK;kBACtB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI;AAC1B,kBAAE,QAAQ,CAAC,IAAI;;AAGjB,YAAA,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE;gBACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;oBACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAClB,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CACpC,QAAQ,CAAC,SAAS,CAAC,EACnB,SAAS,CACT,CACD;;;;QAGF,OAAO,CAAC,EAAE;AACX,YAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA,CAAE,CAAC;;;AAI1D;;AAEG;IACH,MAAM,SAAS,CAAC,IAAsB,EAAA;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAACA,cAAM,CAAC,SAAS,CAAC,EAAE;YAC1D;;AAGD,QAAA,IAAI;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAACA,cAAM,CAAC,SAAS,EAAE;gBACzD,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;AACvE,aAAA,CAAC;AAEF,YAAA,OAAO,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG;kBAChE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI;AAC1B,kBAAE,QAAQ,CAAC,IAAI;;QACf,OAAO,CAAC,EAAE;AACX,YAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA,CAAE,CAAC;AACxD,YAAA,MAAMG,gBAAS;;;IAIjB,MAAM,YAAY,CAAC,IAAyB,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAACH,cAAM,CAAC,YAAY,CAAC,EAAE;YAC7D;;AAGD,QAAA,IAAI;AACH,YAAA,MAAM,IAAI,CAAC,WAAW,CAACA,cAAM,CAAC,YAAY,EAAE;gBAC3C,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBACvE,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,aAAA,CAAC;;QACD,OAAO,CAAC,EAAE;AACX,YAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA,CAAE,CAAC;;;AAG1D;;;;"}
1
+ {"version":3,"file":"hocuspocus-webhook.cjs","names":["TiptapTransformer","Forbidden"],"sources":["../src/index.ts"],"sourcesContent":["import { createHmac } from \"node:crypto\";\nimport { Forbidden } from \"@hocuspocus/common\";\nimport type {\n\tExtension,\n\tonChangePayload,\n\tonConnectPayload,\n\tonDisconnectPayload,\n\tonLoadDocumentPayload,\n} from \"@hocuspocus/server\";\nimport type { Transformer } from \"@hocuspocus/transformer\";\nimport { TiptapTransformer } from \"@hocuspocus/transformer\";\nimport axios from \"axios\";\nimport type { Doc } from \"yjs\";\n\nexport enum Events {\n\tonChange = \"change\",\n\tonConnect = \"connect\",\n\tonCreate = \"create\",\n\tonDisconnect = \"disconnect\",\n}\n\nexport interface Configuration {\n\tdebounce: number | false | null;\n\tdebounceMaxWait: number;\n\tsecret: string;\n\ttransformer:\n\t\t| Transformer\n\t\t| {\n\t\t\t\ttoYdoc: (document: any) => Doc;\n\t\t\t\tfromYdoc: (document: Doc) => any;\n\t\t };\n\turl: string;\n\tevents: Array<Events>;\n}\n\nexport class Webhook implements Extension {\n\tconfiguration: Configuration = {\n\t\tdebounce: 2000,\n\t\tdebounceMaxWait: 10000,\n\t\tsecret: \"\",\n\t\ttransformer: TiptapTransformer,\n\t\turl: \"\",\n\t\tevents: [Events.onChange],\n\t};\n\n\tdebounced: Map<string, { timeout: NodeJS.Timeout; start: number }> =\n\t\tnew Map();\n\n\t/**\n\t * Constructor\n\t */\n\tconstructor(configuration?: Partial<Configuration>) {\n\t\tthis.configuration = {\n\t\t\t...this.configuration,\n\t\t\t...configuration,\n\t\t};\n\n\t\tif (!this.configuration.url) {\n\t\t\tthrow new Error(\"url is required!\");\n\t\t}\n\t}\n\n\t/**\n\t * Create a signature for the response body\n\t */\n\tcreateSignature(body: string): string {\n\t\tconst hmac = createHmac(\"sha256\", this.configuration.secret);\n\n\t\treturn `sha256=${hmac.update(body).digest(\"hex\")}`;\n\t}\n\n\t/**\n\t * debounce the given function, using the given identifier\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\tdebounce(id: string, func: Function) {\n\t\tconst old = this.debounced.get(id);\n\t\tconst start = old?.start || Date.now();\n\n\t\tconst run = () => {\n\t\t\tthis.debounced.delete(id);\n\t\t\tfunc();\n\t\t};\n\n\t\tif (old?.timeout) clearTimeout(old.timeout);\n\t\tif (Date.now() - start >= this.configuration.debounceMaxWait) return run();\n\n\t\tthis.debounced.set(id, {\n\t\t\tstart,\n\t\t\ttimeout: setTimeout(run, <number>this.configuration.debounce),\n\t\t});\n\t}\n\n\t/**\n\t * Send a request to the given url containing the given data\n\t */\n\tasync sendRequest(event: Events, payload: any) {\n\t\tconst json = JSON.stringify({ event, payload });\n\n\t\treturn axios.post(this.configuration.url, json, {\n\t\t\theaders: {\n\t\t\t\t\"X-Hocuspocus-Signature-256\": this.createSignature(json),\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * onChange hook\n\t */\n\tasync onChange(data: onChangePayload) {\n\t\tif (!this.configuration.events.includes(Events.onChange)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst save = async () => {\n\t\t\ttry {\n\t\t\t\tawait this.sendRequest(Events.onChange, {\n\t\t\t\t\tdocument: this.configuration.transformer.fromYdoc(data.document),\n\t\t\t\t\tdocumentName: data.documentName,\n\t\t\t\t\tcontext: data.context,\n\t\t\t\t\trequestHeaders: data.requestHeaders,\n\t\t\t\t\trequestParameters: Object.fromEntries(\n\t\t\t\t\t\tdata.requestParameters.entries(),\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(`Caught error in extension-webhook: ${e}`);\n\t\t\t}\n\t\t};\n\n\t\tif (!this.configuration.debounce) {\n\t\t\treturn save();\n\t\t}\n\n\t\tthis.debounce(data.documentName, save);\n\t}\n\n\t/**\n\t * onLoadDocument hook\n\t */\n\tasync onLoadDocument(data: onLoadDocumentPayload) {\n\t\tif (!this.configuration.events.includes(Events.onCreate)) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await this.sendRequest(Events.onCreate, {\n\t\t\t\tdocumentName: data.documentName,\n\t\t\t\trequestHeaders: data.requestHeaders,\n\t\t\t\trequestParameters: Object.fromEntries(data.requestParameters.entries()),\n\t\t\t});\n\n\t\t\tif (response.status !== 200 || !response.data) return;\n\n\t\t\tconst document =\n\t\t\t\ttypeof response.data === \"string\"\n\t\t\t\t\t? JSON.parse(response.data)\n\t\t\t\t\t: response.data;\n\n\t\t\t// eslint-disable-next-line guard-for-in,no-restricted-syntax\n\t\t\tfor (const fieldName in document) {\n\t\t\t\tif (data.document.isEmpty(fieldName)) {\n\t\t\t\t\tdata.document.merge(\n\t\t\t\t\t\tthis.configuration.transformer.toYdoc(\n\t\t\t\t\t\t\tdocument[fieldName],\n\t\t\t\t\t\t\tfieldName,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(`Caught error in extension-webhook: ${e}`);\n\t\t}\n\t}\n\n\t/**\n\t * onConnect hook\n\t */\n\tasync onConnect(data: onConnectPayload) {\n\t\tif (!this.configuration.events.includes(Events.onConnect)) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await this.sendRequest(Events.onConnect, {\n\t\t\t\tdocumentName: data.documentName,\n\t\t\t\trequestHeaders: data.requestHeaders,\n\t\t\t\trequestParameters: Object.fromEntries(data.requestParameters.entries()),\n\t\t\t});\n\n\t\t\treturn typeof response.data === \"string\" && response.data.length > 0\n\t\t\t\t? JSON.parse(response.data)\n\t\t\t\t: response.data;\n\t\t} catch (e) {\n\t\t\tconsole.error(`Caught error in extension-webhook: ${e}`);\n\t\t\tthrow Forbidden;\n\t\t}\n\t}\n\n\tasync onDisconnect(data: onDisconnectPayload) {\n\t\tif (!this.configuration.events.includes(Events.onDisconnect)) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.sendRequest(Events.onDisconnect, {\n\t\t\t\tdocumentName: data.documentName,\n\t\t\t\trequestHeaders: data.requestHeaders,\n\t\t\t\trequestParameters: Object.fromEntries(data.requestParameters.entries()),\n\t\t\t\tcontext: data.context,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error(`Caught error in extension-webhook: ${e}`);\n\t\t}\n\t}\n}\n"],"mappings":"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"}