@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.
- package/dist/hocuspocus-webhook.cjs +169 -168
- package/dist/hocuspocus-webhook.cjs.map +1 -1
- package/dist/hocuspocus-webhook.esm.js +140 -167
- package/dist/hocuspocus-webhook.esm.js.map +1 -1
- package/dist/index.d.ts +61 -0
- package/dist/index.js +142 -0
- package/package.json +6 -6
- package/dist/node_modules/@tiptap/pm/model/index.d.ts +0 -1
- package/dist/node_modules/@tiptap/pm/state/index.d.ts +0 -1
- package/dist/node_modules/@tiptap/pm/transform/index.d.ts +0 -1
- package/dist/node_modules/@tiptap/pm/view/index.d.ts +0 -1
- package/dist/packages/common/src/CloseEvents.d.ts +0 -29
- package/dist/packages/common/src/auth.d.ts +0 -13
- package/dist/packages/common/src/awarenessStatesToArray.d.ts +0 -3
- package/dist/packages/common/src/index.d.ts +0 -4
- package/dist/packages/common/src/types.d.ts +0 -10
- package/dist/packages/extension-database/src/Database.d.ts +0 -30
- package/dist/packages/extension-database/src/index.d.ts +0 -1
- package/dist/packages/extension-logger/src/Logger.d.ts +0 -67
- package/dist/packages/extension-logger/src/index.d.ts +0 -1
- package/dist/packages/extension-redis/src/Redis.d.ts +0 -124
- package/dist/packages/extension-redis/src/index.d.ts +0 -1
- package/dist/packages/extension-s3/src/S3.d.ts +0 -44
- package/dist/packages/extension-s3/src/index.d.ts +0 -1
- package/dist/packages/extension-sqlite/src/SQLite.d.ts +0 -27
- package/dist/packages/extension-sqlite/src/index.d.ts +0 -1
- package/dist/packages/extension-throttle/src/index.d.ts +0 -30
- package/dist/packages/extension-webhook/src/index.d.ts +0 -56
- package/dist/packages/provider/src/EventEmitter.d.ts +0 -9
- package/dist/packages/provider/src/HocuspocusProvider.d.ts +0 -116
- package/dist/packages/provider/src/HocuspocusProviderWebsocket.d.ts +0 -119
- package/dist/packages/provider/src/IncomingMessage.d.ts +0 -17
- package/dist/packages/provider/src/MessageReceiver.d.ts +0 -12
- package/dist/packages/provider/src/MessageSender.d.ts +0 -9
- package/dist/packages/provider/src/OutgoingMessage.d.ts +0 -9
- package/dist/packages/provider/src/OutgoingMessages/AuthenticationMessage.d.ts +0 -8
- package/dist/packages/provider/src/OutgoingMessages/AwarenessMessage.d.ts +0 -9
- package/dist/packages/provider/src/OutgoingMessages/CloseMessage.d.ts +0 -9
- package/dist/packages/provider/src/OutgoingMessages/QueryAwarenessMessage.d.ts +0 -9
- package/dist/packages/provider/src/OutgoingMessages/StatelessMessage.d.ts +0 -8
- package/dist/packages/provider/src/OutgoingMessages/SyncStepOneMessage.d.ts +0 -9
- package/dist/packages/provider/src/OutgoingMessages/SyncStepTwoMessage.d.ts +0 -9
- package/dist/packages/provider/src/OutgoingMessages/UpdateMessage.d.ts +0 -8
- package/dist/packages/provider/src/index.d.ts +0 -3
- package/dist/packages/provider/src/types.d.ts +0 -93
- package/dist/packages/server/src/ClientConnection.d.ts +0 -63
- package/dist/packages/server/src/Connection.d.ts +0 -75
- package/dist/packages/server/src/DirectConnection.d.ts +0 -14
- package/dist/packages/server/src/Document.d.ts +0 -92
- package/dist/packages/server/src/Hocuspocus.d.ts +0 -80
- package/dist/packages/server/src/IncomingMessage.d.ts +0 -25
- package/dist/packages/server/src/MessageReceiver.d.ts +0 -11
- package/dist/packages/server/src/OutgoingMessage.d.ts +0 -23
- package/dist/packages/server/src/Server.d.ts +0 -32
- package/dist/packages/server/src/index.d.ts +0 -9
- package/dist/packages/server/src/types.d.ts +0 -342
- package/dist/packages/server/src/util/debounce.d.ts +0 -6
- package/dist/packages/server/src/util/getParameters.d.ts +0 -6
- package/dist/packages/transformer/src/Prosemirror.d.ts +0 -11
- package/dist/packages/transformer/src/Tiptap.d.ts +0 -10
- package/dist/packages/transformer/src/index.d.ts +0 -3
- package/dist/packages/transformer/src/types.d.ts +0 -5
- package/dist/playground/backend/src/default.d.ts +0 -1
- package/dist/playground/backend/src/deno.d.ts +0 -1
- package/dist/playground/backend/src/express.d.ts +0 -1
- package/dist/playground/backend/src/hono.d.ts +0 -1
- package/dist/playground/backend/src/koa.d.ts +0 -1
- package/dist/playground/backend/src/load-document.d.ts +0 -1
- package/dist/playground/backend/src/redis.d.ts +0 -1
- package/dist/playground/backend/src/s3-redis.d.ts +0 -1
- package/dist/playground/backend/src/s3.d.ts +0 -1
- package/dist/playground/backend/src/slow.d.ts +0 -1
- package/dist/playground/backend/src/tiptapcollab.d.ts +0 -1
- package/dist/playground/backend/src/webhook.d.ts +0 -1
- package/dist/playground/frontend/app/SocketContext1.d.ts +0 -2
- package/dist/playground/frontend/app/SocketContext2.d.ts +0 -2
- package/dist/playground/frontend/next.config.d.ts +0 -3
- package/dist/tests/extension-database/fetch.d.ts +0 -1
- package/dist/tests/extension-logger/onListen.d.ts +0 -1
- package/dist/tests/extension-redis/onAwarenessChange.d.ts +0 -1
- package/dist/tests/extension-redis/onChange.d.ts +0 -1
- package/dist/tests/extension-redis/onStateless.d.ts +0 -1
- package/dist/tests/extension-redis/onStoreDocument.d.ts +0 -1
- package/dist/tests/extension-s3/fetch.d.ts +0 -1
- package/dist/tests/extension-throttle/banning.d.ts +0 -1
- package/dist/tests/extension-throttle/configuration.d.ts +0 -1
- package/dist/tests/provider/hasUnsyncedChanges.d.ts +0 -1
- package/dist/tests/provider/observe.d.ts +0 -1
- package/dist/tests/provider/observeDeep.d.ts +0 -1
- package/dist/tests/provider/onAuthenticated.d.ts +0 -1
- package/dist/tests/provider/onAuthenticationFailed.d.ts +0 -1
- package/dist/tests/provider/onAwarenessChange.d.ts +0 -1
- package/dist/tests/provider/onAwarenessUpdate.d.ts +0 -1
- package/dist/tests/provider/onClose.d.ts +0 -1
- package/dist/tests/provider/onConnect.d.ts +0 -1
- package/dist/tests/provider/onDisconnect.d.ts +0 -1
- package/dist/tests/provider/onMessage.d.ts +0 -1
- package/dist/tests/provider/onOpen.d.ts +0 -1
- package/dist/tests/provider/onStateless.d.ts +0 -1
- package/dist/tests/provider/onSynced.d.ts +0 -1
- package/dist/tests/providerwebsocket/configuration.d.ts +0 -1
- package/dist/tests/server/address.d.ts +0 -1
- package/dist/tests/server/afterLoadDocument.d.ts +0 -1
- package/dist/tests/server/afterStoreDocument.d.ts +0 -1
- package/dist/tests/server/afterUnloadDocument.d.ts +0 -1
- package/dist/tests/server/beforeBroadcastStateless.d.ts +0 -1
- package/dist/tests/server/beforeHandleMessage.d.ts +0 -1
- package/dist/tests/server/beforeSync.d.ts +0 -1
- package/dist/tests/server/beforeUnloadDocument.d.ts +0 -1
- package/dist/tests/server/closeConnections.d.ts +0 -1
- package/dist/tests/server/getConnectionsCount.d.ts +0 -1
- package/dist/tests/server/getDocumentsCount.d.ts +0 -1
- package/dist/tests/server/listen.d.ts +0 -1
- package/dist/tests/server/onAuthenticate.d.ts +0 -1
- package/dist/tests/server/onAwarenessUpdate.d.ts +0 -1
- package/dist/tests/server/onChange.d.ts +0 -1
- package/dist/tests/server/onClose.d.ts +0 -1
- package/dist/tests/server/onConfigure.d.ts +0 -1
- package/dist/tests/server/onConnect.d.ts +0 -1
- package/dist/tests/server/onDestroy.d.ts +0 -1
- package/dist/tests/server/onDisconnect.d.ts +0 -1
- package/dist/tests/server/onListen.d.ts +0 -1
- package/dist/tests/server/onLoadDocument.d.ts +0 -1
- package/dist/tests/server/onRequest.d.ts +0 -1
- package/dist/tests/server/onStateless.d.ts +0 -1
- package/dist/tests/server/onStoreDocument.d.ts +0 -1
- package/dist/tests/server/onTokenSync.d.ts +0 -1
- package/dist/tests/server/onUpgrade.d.ts +0 -1
- package/dist/tests/server/openDirectConnection.d.ts +0 -1
- package/dist/tests/server/websocketError.d.ts +0 -1
- package/dist/tests/transformer/TiptapTransformer.d.ts +0 -1
- package/dist/tests/utils/createDirectory.d.ts +0 -1
- package/dist/tests/utils/flushRedis.d.ts +0 -1
- package/dist/tests/utils/index.d.ts +0 -9
- package/dist/tests/utils/newHocuspocus.d.ts +0 -2
- package/dist/tests/utils/newHocuspocusProvider.d.ts +0 -3
- package/dist/tests/utils/newHocuspocusProviderWebsocket.d.ts +0 -4
- package/dist/tests/utils/randomInteger.d.ts +0 -1
- package/dist/tests/utils/redisConnectionSettings.d.ts +0 -4
- package/dist/tests/utils/removeDirectory.d.ts +0 -1
- package/dist/tests/utils/retryableAssertion.d.ts +0 -2
- package/dist/tests/utils/sleep.d.ts +0 -1
|
@@ -1,172 +1,173 @@
|
|
|
1
|
-
'
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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":[
|
|
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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"}
|