ooxml-core 1.21.0 → 1.22.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 (108) hide show
  1. package/dist/automation/index.cjs +33919 -12659
  2. package/dist/automation/index.d.ts +4 -0
  3. package/dist/automation/index.d.ts.map +1 -1
  4. package/dist/automation/index.mjs +33907 -12660
  5. package/dist/automation/node.cjs +37 -0
  6. package/dist/automation/node.d.ts +32 -1
  7. package/dist/automation/node.d.ts.map +1 -1
  8. package/dist/automation/node.mjs +36 -1
  9. package/dist/automation/proposal.d.ts +25 -0
  10. package/dist/automation/proposal.d.ts.map +1 -0
  11. package/dist/automation/tools/define.d.ts +27 -0
  12. package/dist/automation/tools/define.d.ts.map +1 -0
  13. package/dist/automation/tools/docx-tools.d.ts +4 -0
  14. package/dist/automation/tools/docx-tools.d.ts.map +1 -0
  15. package/dist/automation/tools/index.d.ts +16 -0
  16. package/dist/automation/tools/index.d.ts.map +1 -0
  17. package/dist/automation/tools/types.d.ts +52 -0
  18. package/dist/automation/tools/types.d.ts.map +1 -0
  19. package/dist/automation/tools/visio-tools.d.ts +4 -0
  20. package/dist/automation/tools/visio-tools.d.ts.map +1 -0
  21. package/dist/automation/tools/xlsx-tools.d.ts +8 -0
  22. package/dist/automation/tools/xlsx-tools.d.ts.map +1 -0
  23. package/dist/automation/xlsx-edits.d.ts +88 -0
  24. package/dist/automation/xlsx-edits.d.ts.map +1 -0
  25. package/dist/automation/xlsx-proposal.d.ts +34 -0
  26. package/dist/automation/xlsx-proposal.d.ts.map +1 -0
  27. package/dist/automation/xlsx.d.ts +10 -5
  28. package/dist/automation/xlsx.d.ts.map +1 -1
  29. package/dist/chunk-MHNETXQB.mjs +1 -0
  30. package/dist/collab/embedding.d.ts +8 -3
  31. package/dist/collab/embedding.d.ts.map +1 -1
  32. package/dist/collab/index.cjs +124 -102
  33. package/dist/collab/index.d.ts +1 -0
  34. package/dist/collab/index.d.ts.map +1 -1
  35. package/dist/collab/index.mjs +124 -103
  36. package/dist/collab/webrtc-provider.d.ts +21 -0
  37. package/dist/collab/webrtc-provider.d.ts.map +1 -0
  38. package/dist/pptx/automation/index.cjs +28707 -7376
  39. package/dist/pptx/automation/index.d.ts +91 -1
  40. package/dist/pptx/automation/index.d.ts.map +1 -1
  41. package/dist/pptx/automation/index.mjs +734 -57
  42. package/dist/pptx/automation/schemas/chart-formatting-schemas.d.ts +1 -1
  43. package/dist/pptx/automation/schemas/chart-schemas.d.ts +1 -1
  44. package/dist/pptx/automation/schemas/chart-user-shape-schemas.d.ts +1 -1
  45. package/dist/pptx/automation/schemas/element-schemas.d.ts +1 -1
  46. package/dist/pptx/automation/schemas/export-schemas.d.ts +1 -1
  47. package/dist/pptx/automation/schemas/geometry-schemas.d.ts +1 -1
  48. package/dist/pptx/automation/schemas/hyperlink-schemas.d.ts +1 -1
  49. package/dist/pptx/automation/schemas/index.mjs +1 -0
  50. package/dist/pptx/automation/schemas/json-schemas.d.ts +1 -1
  51. package/dist/pptx/automation/schemas/layout-schemas.d.ts +1 -1
  52. package/dist/pptx/automation/schemas/lock-schemas.d.ts +1 -1
  53. package/dist/pptx/automation/schemas/metadata-schemas.d.ts +1 -1
  54. package/dist/pptx/automation/schemas/ole-schemas.d.ts +1 -1
  55. package/dist/pptx/automation/schemas/presentation-schemas.d.ts +1 -1
  56. package/dist/pptx/automation/schemas/section-schemas.d.ts +1 -1
  57. package/dist/pptx/automation/schemas/slide-schemas.d.ts +1 -1
  58. package/dist/pptx/automation/schemas/smartart-schemas.d.ts +1 -1
  59. package/dist/pptx/automation/schemas/table-style-schemas.d.ts +1 -1
  60. package/dist/pptx/automation/schemas/template-schemas.d.ts +1 -1
  61. package/dist/pptx/automation/schemas/theme-schemas.d.ts +1 -1
  62. package/dist/pptx/automation/schemas/validation-schemas.d.ts +1 -1
  63. package/dist/pptx/chunks/{schemas-CWr181Wx.d.ts → schemas-fuDGetRe.d.ts} +2 -2
  64. package/dist/pptx/chunks/{schemas-CWr181Wx.d.ts.map → schemas-fuDGetRe.d.ts.map} +1 -1
  65. package/dist/visio/collab/bind.d.ts +44 -0
  66. package/dist/visio/collab/bind.d.ts.map +1 -0
  67. package/dist/visio/collab/compose.d.ts +15 -0
  68. package/dist/visio/collab/compose.d.ts.map +1 -0
  69. package/dist/visio/collab/index.cjs +1194 -0
  70. package/dist/visio/collab/index.d.ts +8 -0
  71. package/dist/visio/collab/index.d.ts.map +1 -0
  72. package/dist/visio/collab/index.mjs +1152 -0
  73. package/dist/visio/collab/keys.d.ts +22 -0
  74. package/dist/visio/collab/keys.d.ts.map +1 -0
  75. package/dist/visio/collab/order.d.ts +11 -0
  76. package/dist/visio/collab/order.d.ts.map +1 -0
  77. package/dist/visio/collab/package.d.ts +37 -0
  78. package/dist/visio/collab/package.d.ts.map +1 -0
  79. package/dist/visio/collab/read.d.ts +41 -0
  80. package/dist/visio/collab/read.d.ts.map +1 -0
  81. package/dist/visio/collab/scan.d.ts +28 -0
  82. package/dist/visio/collab/scan.d.ts.map +1 -0
  83. package/dist/visio/collab/schema.d.ts +70 -0
  84. package/dist/visio/collab/schema.d.ts.map +1 -0
  85. package/dist/visio/collab/snapshot.d.ts +61 -0
  86. package/dist/visio/collab/snapshot.d.ts.map +1 -0
  87. package/dist/visio/collab/write.d.ts +20 -0
  88. package/dist/visio/collab/write.d.ts.map +1 -0
  89. package/dist/visio/ui/collab-options.d.ts +24 -0
  90. package/dist/visio/ui/collab-options.d.ts.map +1 -0
  91. package/dist/visio/ui/collab-presence.d.ts +31 -0
  92. package/dist/visio/ui/collab-presence.d.ts.map +1 -0
  93. package/dist/visio/ui/contract.d.ts +4 -3
  94. package/dist/visio/ui/contract.d.ts.map +1 -1
  95. package/dist/visio/ui/document-history.d.ts +3 -1
  96. package/dist/visio/ui/document-history.d.ts.map +1 -1
  97. package/dist/visio/ui/index.cjs +119 -52
  98. package/dist/visio/ui/index.d.ts +2 -0
  99. package/dist/visio/ui/index.d.ts.map +1 -1
  100. package/dist/visio/ui/index.mjs +114 -53
  101. package/dist/xlsx/ui/index.cjs +5 -0
  102. package/dist/xlsx/ui/index.mjs +5 -0
  103. package/dist/xlsx/ui/locales/de/shell.d.ts.map +1 -1
  104. package/dist/xlsx/ui/locales/en/shell.d.ts.map +1 -1
  105. package/dist/xlsx/ui/locales/es/shell.d.ts.map +1 -1
  106. package/dist/xlsx/ui/locales/fr/shell.d.ts.map +1 -1
  107. package/dist/xlsx/ui/locales/zh-CN/shell.d.ts.map +1 -1
  108. package/package.json +6 -1
@@ -1048,6 +1048,118 @@ function createTransportProvider({ doc, awareness }, { transport, maxMessageByte
1048
1048
  };
1049
1049
  }
1050
1050
 
1051
+ // collab/external-provider.ts
1052
+ function adaptYjsProvider(provider) {
1053
+ const events = new Emitter();
1054
+ let destroyed = false;
1055
+ let status = provider.wsconnected || provider.connected ? "connected" : provider.wsconnecting ? "connecting" : "disconnected";
1056
+ let synced = Boolean(provider.synced);
1057
+ const subscriptions = [];
1058
+ const listen = (name, handler) => {
1059
+ const wrapped = handler;
1060
+ provider.on(name, wrapped);
1061
+ subscriptions.push([name, wrapped]);
1062
+ };
1063
+ const setStatus = (next) => {
1064
+ if (destroyed || next === status) return;
1065
+ status = next;
1066
+ events.emit("status", next);
1067
+ };
1068
+ const setSynced = (next) => {
1069
+ if (destroyed || next === synced) return;
1070
+ synced = next;
1071
+ events.emit("synced", next);
1072
+ };
1073
+ listen("status", (payload) => {
1074
+ if (typeof payload.connected === "boolean") {
1075
+ if (!payload.connected) setSynced(false);
1076
+ return setStatus(payload.connected ? "connected" : "disconnected");
1077
+ }
1078
+ if (payload.status === "connected" || payload.status === "connecting")
1079
+ setStatus(payload.status);
1080
+ else if (payload.status === "disconnected") {
1081
+ setSynced(false);
1082
+ setStatus("disconnected");
1083
+ }
1084
+ });
1085
+ const onSync = (value) => setSynced(typeof value === "boolean" ? value : value.synced === true);
1086
+ listen("sync", onSync);
1087
+ listen("synced", onSync);
1088
+ listen("connection-error", (cause) => {
1089
+ if (destroyed) return;
1090
+ setStatus("error");
1091
+ events.emit("error", cause instanceof Error ? cause : new Error("Provider connection error"));
1092
+ });
1093
+ return {
1094
+ get status() {
1095
+ return status;
1096
+ },
1097
+ get synced() {
1098
+ return synced;
1099
+ },
1100
+ connect: () => {
1101
+ if (destroyed || status === "connected" || status === "connecting") return;
1102
+ setStatus("connecting");
1103
+ provider.connect?.();
1104
+ },
1105
+ disconnect: () => {
1106
+ if (destroyed) return;
1107
+ provider.disconnect?.();
1108
+ setSynced(false);
1109
+ setStatus("disconnected");
1110
+ },
1111
+ destroy: () => {
1112
+ if (destroyed) return;
1113
+ setSynced(false);
1114
+ setStatus("disconnected");
1115
+ destroyed = true;
1116
+ for (const [name, handler] of subscriptions) provider.off?.(name, handler);
1117
+ subscriptions.length = 0;
1118
+ events.clear();
1119
+ provider.destroy?.();
1120
+ },
1121
+ on: (event, listener) => events.on(event, listener)
1122
+ };
1123
+ }
1124
+ function observeExternalSession(session, onSnapshot) {
1125
+ let active = true;
1126
+ let subscribing = true;
1127
+ let previous;
1128
+ let unsubscribe;
1129
+ const notify = () => {
1130
+ if (!active || subscribing) return;
1131
+ const snapshot = session.getSnapshot();
1132
+ if (previous?.status === snapshot.status && previous.synced === snapshot.synced) return;
1133
+ previous = { status: snapshot.status, synced: snapshot.synced };
1134
+ onSnapshot(previous);
1135
+ };
1136
+ const dispose = () => {
1137
+ if (!active) return;
1138
+ active = false;
1139
+ unsubscribe?.();
1140
+ };
1141
+ try {
1142
+ unsubscribe = session.subscribe(notify);
1143
+ subscribing = false;
1144
+ notify();
1145
+ } catch (error) {
1146
+ dispose();
1147
+ throw error;
1148
+ }
1149
+ return dispose;
1150
+ }
1151
+
1152
+ // collab/webrtc-provider.ts
1153
+ function webrtcProvider(options) {
1154
+ return ({ doc, awareness, roomId }) => adaptYjsProvider(
1155
+ new options.WebrtcProvider(roomId, doc, {
1156
+ awareness,
1157
+ ...options.signaling ? { signaling: options.signaling } : {},
1158
+ ...options.password ? { password: options.password } : {}
1159
+ })
1160
+ );
1161
+ }
1162
+
1051
1163
  // collab/websocket-transport.ts
1052
1164
  var OPEN = 1;
1053
1165
  function roomUrl(server, roomId) {
@@ -1144,9 +1256,15 @@ function openCollaborationSession(options, defaults) {
1144
1256
  const roomId = options.roomId ?? "";
1145
1257
  if (!isValidRoomId(roomId)) throw new Error(INVALID_ROOM_MESSAGE);
1146
1258
  let provider = options.provider;
1259
+ if (!provider && options.webrtc) {
1260
+ const password = options.webrtc.password ?? options.authToken;
1261
+ provider = webrtcProvider({ ...options.webrtc, ...password ? { password } : {} });
1262
+ }
1147
1263
  if (!provider && options.serverUrl)
1148
1264
  provider = transportProvider({
1149
- transport: createWebSocketTransport({ url: roomUrl(options.serverUrl, roomId) })
1265
+ transport: createWebSocketTransport({
1266
+ url: withToken(roomUrl(options.serverUrl, roomId), options.authToken)
1267
+ })
1150
1268
  });
1151
1269
  if (!provider) {
1152
1270
  if (!canBroadcast()) throw new Error(NO_BROADCAST_MESSAGE);
@@ -1170,6 +1288,10 @@ function openCollaborationSession(options, defaults) {
1170
1288
  });
1171
1289
  return { session, owned: true };
1172
1290
  }
1291
+ function withToken(url, token) {
1292
+ if (!token) return url;
1293
+ return `${url}${url.includes("?") ? "&" : "?"}token=${encodeURIComponent(token)}`;
1294
+ }
1173
1295
  function collaborationStateOf(session) {
1174
1296
  return {
1175
1297
  active: true,
@@ -1226,107 +1348,6 @@ function toExternalSession(session) {
1226
1348
  };
1227
1349
  }
1228
1350
 
1229
- // collab/external-provider.ts
1230
- function adaptYjsProvider(provider) {
1231
- const events = new Emitter();
1232
- let destroyed = false;
1233
- let status = provider.wsconnected || provider.connected ? "connected" : provider.wsconnecting ? "connecting" : "disconnected";
1234
- let synced = Boolean(provider.synced);
1235
- const subscriptions = [];
1236
- const listen = (name, handler) => {
1237
- const wrapped = handler;
1238
- provider.on(name, wrapped);
1239
- subscriptions.push([name, wrapped]);
1240
- };
1241
- const setStatus = (next) => {
1242
- if (destroyed || next === status) return;
1243
- status = next;
1244
- events.emit("status", next);
1245
- };
1246
- const setSynced = (next) => {
1247
- if (destroyed || next === synced) return;
1248
- synced = next;
1249
- events.emit("synced", next);
1250
- };
1251
- listen("status", (payload) => {
1252
- if (typeof payload.connected === "boolean") {
1253
- if (!payload.connected) setSynced(false);
1254
- return setStatus(payload.connected ? "connected" : "disconnected");
1255
- }
1256
- if (payload.status === "connected" || payload.status === "connecting")
1257
- setStatus(payload.status);
1258
- else if (payload.status === "disconnected") {
1259
- setSynced(false);
1260
- setStatus("disconnected");
1261
- }
1262
- });
1263
- const onSync = (value) => setSynced(typeof value === "boolean" ? value : value.synced === true);
1264
- listen("sync", onSync);
1265
- listen("synced", onSync);
1266
- listen("connection-error", (cause) => {
1267
- if (destroyed) return;
1268
- setStatus("error");
1269
- events.emit("error", cause instanceof Error ? cause : new Error("Provider connection error"));
1270
- });
1271
- return {
1272
- get status() {
1273
- return status;
1274
- },
1275
- get synced() {
1276
- return synced;
1277
- },
1278
- connect: () => {
1279
- if (destroyed || status === "connected" || status === "connecting") return;
1280
- setStatus("connecting");
1281
- provider.connect?.();
1282
- },
1283
- disconnect: () => {
1284
- if (destroyed) return;
1285
- provider.disconnect?.();
1286
- setSynced(false);
1287
- setStatus("disconnected");
1288
- },
1289
- destroy: () => {
1290
- if (destroyed) return;
1291
- setSynced(false);
1292
- setStatus("disconnected");
1293
- destroyed = true;
1294
- for (const [name, handler] of subscriptions) provider.off?.(name, handler);
1295
- subscriptions.length = 0;
1296
- events.clear();
1297
- provider.destroy?.();
1298
- },
1299
- on: (event, listener) => events.on(event, listener)
1300
- };
1301
- }
1302
- function observeExternalSession(session, onSnapshot) {
1303
- let active = true;
1304
- let subscribing = true;
1305
- let previous;
1306
- let unsubscribe;
1307
- const notify = () => {
1308
- if (!active || subscribing) return;
1309
- const snapshot = session.getSnapshot();
1310
- if (previous?.status === snapshot.status && previous.synced === snapshot.synced) return;
1311
- previous = { status: snapshot.status, synced: snapshot.synced };
1312
- onSnapshot(previous);
1313
- };
1314
- const dispose = () => {
1315
- if (!active) return;
1316
- active = false;
1317
- unsubscribe?.();
1318
- };
1319
- try {
1320
- unsubscribe = session.subscribe(notify);
1321
- subscribing = false;
1322
- notify();
1323
- } catch (error) {
1324
- dispose();
1325
- throw error;
1326
- }
1327
- return dispose;
1328
- }
1329
-
1330
1351
  // collab/memory-transport.ts
1331
1352
  function createMemoryHub(options = {}) {
1332
1353
  const rooms = /* @__PURE__ */ new Map();
@@ -1595,3 +1616,4 @@ exports.transportProvider = transportProvider;
1595
1616
  exports.validateDisplayName = validateDisplayName;
1596
1617
  exports.validateRoomId = validateRoomId;
1597
1618
  exports.validateUpdate = validateUpdate;
1619
+ exports.webrtcProvider = webrtcProvider;
@@ -17,5 +17,6 @@ export * from './provider.js';
17
17
  export * from './session.js';
18
18
  export * from './transport-provider.js';
19
19
  export * from './validation.js';
20
+ export * from './webrtc-provider.js';
20
21
  export * from './websocket-transport.js';
21
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../collab/index.ts"],"names":[],"mappings":"AAIA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../collab/index.ts"],"names":[],"mappings":"AAIA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
@@ -1024,6 +1024,118 @@ function createTransportProvider({ doc, awareness }, { transport, maxMessageByte
1024
1024
  };
1025
1025
  }
1026
1026
 
1027
+ // collab/external-provider.ts
1028
+ function adaptYjsProvider(provider) {
1029
+ const events = new Emitter();
1030
+ let destroyed = false;
1031
+ let status = provider.wsconnected || provider.connected ? "connected" : provider.wsconnecting ? "connecting" : "disconnected";
1032
+ let synced = Boolean(provider.synced);
1033
+ const subscriptions = [];
1034
+ const listen = (name, handler) => {
1035
+ const wrapped = handler;
1036
+ provider.on(name, wrapped);
1037
+ subscriptions.push([name, wrapped]);
1038
+ };
1039
+ const setStatus = (next) => {
1040
+ if (destroyed || next === status) return;
1041
+ status = next;
1042
+ events.emit("status", next);
1043
+ };
1044
+ const setSynced = (next) => {
1045
+ if (destroyed || next === synced) return;
1046
+ synced = next;
1047
+ events.emit("synced", next);
1048
+ };
1049
+ listen("status", (payload) => {
1050
+ if (typeof payload.connected === "boolean") {
1051
+ if (!payload.connected) setSynced(false);
1052
+ return setStatus(payload.connected ? "connected" : "disconnected");
1053
+ }
1054
+ if (payload.status === "connected" || payload.status === "connecting")
1055
+ setStatus(payload.status);
1056
+ else if (payload.status === "disconnected") {
1057
+ setSynced(false);
1058
+ setStatus("disconnected");
1059
+ }
1060
+ });
1061
+ const onSync = (value) => setSynced(typeof value === "boolean" ? value : value.synced === true);
1062
+ listen("sync", onSync);
1063
+ listen("synced", onSync);
1064
+ listen("connection-error", (cause) => {
1065
+ if (destroyed) return;
1066
+ setStatus("error");
1067
+ events.emit("error", cause instanceof Error ? cause : new Error("Provider connection error"));
1068
+ });
1069
+ return {
1070
+ get status() {
1071
+ return status;
1072
+ },
1073
+ get synced() {
1074
+ return synced;
1075
+ },
1076
+ connect: () => {
1077
+ if (destroyed || status === "connected" || status === "connecting") return;
1078
+ setStatus("connecting");
1079
+ provider.connect?.();
1080
+ },
1081
+ disconnect: () => {
1082
+ if (destroyed) return;
1083
+ provider.disconnect?.();
1084
+ setSynced(false);
1085
+ setStatus("disconnected");
1086
+ },
1087
+ destroy: () => {
1088
+ if (destroyed) return;
1089
+ setSynced(false);
1090
+ setStatus("disconnected");
1091
+ destroyed = true;
1092
+ for (const [name, handler] of subscriptions) provider.off?.(name, handler);
1093
+ subscriptions.length = 0;
1094
+ events.clear();
1095
+ provider.destroy?.();
1096
+ },
1097
+ on: (event, listener) => events.on(event, listener)
1098
+ };
1099
+ }
1100
+ function observeExternalSession(session, onSnapshot) {
1101
+ let active = true;
1102
+ let subscribing = true;
1103
+ let previous;
1104
+ let unsubscribe;
1105
+ const notify = () => {
1106
+ if (!active || subscribing) return;
1107
+ const snapshot = session.getSnapshot();
1108
+ if (previous?.status === snapshot.status && previous.synced === snapshot.synced) return;
1109
+ previous = { status: snapshot.status, synced: snapshot.synced };
1110
+ onSnapshot(previous);
1111
+ };
1112
+ const dispose = () => {
1113
+ if (!active) return;
1114
+ active = false;
1115
+ unsubscribe?.();
1116
+ };
1117
+ try {
1118
+ unsubscribe = session.subscribe(notify);
1119
+ subscribing = false;
1120
+ notify();
1121
+ } catch (error) {
1122
+ dispose();
1123
+ throw error;
1124
+ }
1125
+ return dispose;
1126
+ }
1127
+
1128
+ // collab/webrtc-provider.ts
1129
+ function webrtcProvider(options) {
1130
+ return ({ doc, awareness, roomId }) => adaptYjsProvider(
1131
+ new options.WebrtcProvider(roomId, doc, {
1132
+ awareness,
1133
+ ...options.signaling ? { signaling: options.signaling } : {},
1134
+ ...options.password ? { password: options.password } : {}
1135
+ })
1136
+ );
1137
+ }
1138
+
1027
1139
  // collab/websocket-transport.ts
1028
1140
  var OPEN = 1;
1029
1141
  function roomUrl(server, roomId) {
@@ -1120,9 +1232,15 @@ function openCollaborationSession(options, defaults) {
1120
1232
  const roomId = options.roomId ?? "";
1121
1233
  if (!isValidRoomId(roomId)) throw new Error(INVALID_ROOM_MESSAGE);
1122
1234
  let provider = options.provider;
1235
+ if (!provider && options.webrtc) {
1236
+ const password = options.webrtc.password ?? options.authToken;
1237
+ provider = webrtcProvider({ ...options.webrtc, ...password ? { password } : {} });
1238
+ }
1123
1239
  if (!provider && options.serverUrl)
1124
1240
  provider = transportProvider({
1125
- transport: createWebSocketTransport({ url: roomUrl(options.serverUrl, roomId) })
1241
+ transport: createWebSocketTransport({
1242
+ url: withToken(roomUrl(options.serverUrl, roomId), options.authToken)
1243
+ })
1126
1244
  });
1127
1245
  if (!provider) {
1128
1246
  if (!canBroadcast()) throw new Error(NO_BROADCAST_MESSAGE);
@@ -1146,6 +1264,10 @@ function openCollaborationSession(options, defaults) {
1146
1264
  });
1147
1265
  return { session, owned: true };
1148
1266
  }
1267
+ function withToken(url, token) {
1268
+ if (!token) return url;
1269
+ return `${url}${url.includes("?") ? "&" : "?"}token=${encodeURIComponent(token)}`;
1270
+ }
1149
1271
  function collaborationStateOf(session) {
1150
1272
  return {
1151
1273
  active: true,
@@ -1202,107 +1324,6 @@ function toExternalSession(session) {
1202
1324
  };
1203
1325
  }
1204
1326
 
1205
- // collab/external-provider.ts
1206
- function adaptYjsProvider(provider) {
1207
- const events = new Emitter();
1208
- let destroyed = false;
1209
- let status = provider.wsconnected || provider.connected ? "connected" : provider.wsconnecting ? "connecting" : "disconnected";
1210
- let synced = Boolean(provider.synced);
1211
- const subscriptions = [];
1212
- const listen = (name, handler) => {
1213
- const wrapped = handler;
1214
- provider.on(name, wrapped);
1215
- subscriptions.push([name, wrapped]);
1216
- };
1217
- const setStatus = (next) => {
1218
- if (destroyed || next === status) return;
1219
- status = next;
1220
- events.emit("status", next);
1221
- };
1222
- const setSynced = (next) => {
1223
- if (destroyed || next === synced) return;
1224
- synced = next;
1225
- events.emit("synced", next);
1226
- };
1227
- listen("status", (payload) => {
1228
- if (typeof payload.connected === "boolean") {
1229
- if (!payload.connected) setSynced(false);
1230
- return setStatus(payload.connected ? "connected" : "disconnected");
1231
- }
1232
- if (payload.status === "connected" || payload.status === "connecting")
1233
- setStatus(payload.status);
1234
- else if (payload.status === "disconnected") {
1235
- setSynced(false);
1236
- setStatus("disconnected");
1237
- }
1238
- });
1239
- const onSync = (value) => setSynced(typeof value === "boolean" ? value : value.synced === true);
1240
- listen("sync", onSync);
1241
- listen("synced", onSync);
1242
- listen("connection-error", (cause) => {
1243
- if (destroyed) return;
1244
- setStatus("error");
1245
- events.emit("error", cause instanceof Error ? cause : new Error("Provider connection error"));
1246
- });
1247
- return {
1248
- get status() {
1249
- return status;
1250
- },
1251
- get synced() {
1252
- return synced;
1253
- },
1254
- connect: () => {
1255
- if (destroyed || status === "connected" || status === "connecting") return;
1256
- setStatus("connecting");
1257
- provider.connect?.();
1258
- },
1259
- disconnect: () => {
1260
- if (destroyed) return;
1261
- provider.disconnect?.();
1262
- setSynced(false);
1263
- setStatus("disconnected");
1264
- },
1265
- destroy: () => {
1266
- if (destroyed) return;
1267
- setSynced(false);
1268
- setStatus("disconnected");
1269
- destroyed = true;
1270
- for (const [name, handler] of subscriptions) provider.off?.(name, handler);
1271
- subscriptions.length = 0;
1272
- events.clear();
1273
- provider.destroy?.();
1274
- },
1275
- on: (event, listener) => events.on(event, listener)
1276
- };
1277
- }
1278
- function observeExternalSession(session, onSnapshot) {
1279
- let active = true;
1280
- let subscribing = true;
1281
- let previous;
1282
- let unsubscribe;
1283
- const notify = () => {
1284
- if (!active || subscribing) return;
1285
- const snapshot = session.getSnapshot();
1286
- if (previous?.status === snapshot.status && previous.synced === snapshot.synced) return;
1287
- previous = { status: snapshot.status, synced: snapshot.synced };
1288
- onSnapshot(previous);
1289
- };
1290
- const dispose = () => {
1291
- if (!active) return;
1292
- active = false;
1293
- unsubscribe?.();
1294
- };
1295
- try {
1296
- unsubscribe = session.subscribe(notify);
1297
- subscribing = false;
1298
- notify();
1299
- } catch (error) {
1300
- dispose();
1301
- throw error;
1302
- }
1303
- return dispose;
1304
- }
1305
-
1306
1327
  // collab/memory-transport.ts
1307
1328
  function createMemoryHub(options = {}) {
1308
1329
  const rooms = /* @__PURE__ */ new Map();
@@ -1478,4 +1499,4 @@ function freezeDeep(value) {
1478
1499
  return value;
1479
1500
  }
1480
1501
 
1481
- export { BROADCAST_THROTTLE_MS, BoundedMap, COLLABORATION_CHANGE_EVENT, COLLABORATION_OFF_STATE, COLLABORATION_ROLES, COLLAB_LEAVE_MESSAGE, CONNECTION_TIMEOUT_MS, CURSOR_PALETTE, DEFAULT_COLOR, DEFAULT_MAX_PACKAGE_BYTES, DEPARTURE_CHANNEL, Emitter, INITIAL_SYNC_GRACE_MS, INVALID_ROOM_MESSAGE, IdempotencyCache, LEGACY_PPTX_DEPARTURE_CHANNEL, LEGACY_PPTX_LEAVE_MESSAGE, LOCAL_ORIGIN, MAX_LABEL_CHARS, MAX_UPDATE_BYTES, MESSAGE_AWARENESS, MESSAGE_QUERY_AWARENESS, MESSAGE_SYNC, NO_BROADCAST_MESSAGE, PRESENCE_FIELD, PRESENCE_HEARTBEAT_MS, STALE_PRESENCE_MS, SequenceTracker, adaptYjsProvider, applyUpdateSafe, asSelectionIds, assignUserColor, bindDocument, borrowAwareness, buildRoster, canBroadcast, canWrite, clampCoordinate, classifyVersion, clearLocalAwareness, collaborationStateOf, createAssetSync, createBroadcastTransport, createClientId, createCollabSession, createDepartureChannel, createIdGenerator, createMemoryHub, createPresencePublisher, createSyncGate, createTransportProvider, createWebSocketTransport, deriveCanvasPresence, derivePresence, encodeDiff, encodeSnapshot, encodeStateVector2 as encodeStateVector, formatCursorLabel, freezeDeep, fromBase64, getUserInitials, isMixedContentBlocked, isNonNegativeSafeInteger, isPresenceFresh, isValidId, isValidRoomId, mergeUpdates2 as mergeUpdates, observeExternalSession, onCollaborationStateChange, openCollaborationSession, packageAdapter, presenceToCursors, randomToken, registerTeardown, removeAwarenessStatesLocally, restoreSnapshot, roomUrl, sanitizeAvatarUrl, sanitizeCanvasPayload, sanitizeColor, sanitizeIdentity, sanitizeIndex, sanitizeRole, sanitizeUserName, shouldAutoFollowBroadcaster, shouldRoomReplaceLoad, stripHtmlTags, toBase64, toExternalSession, transportProvider, validateDisplayName, validateRoomId, validateUpdate };
1502
+ export { BROADCAST_THROTTLE_MS, BoundedMap, COLLABORATION_CHANGE_EVENT, COLLABORATION_OFF_STATE, COLLABORATION_ROLES, COLLAB_LEAVE_MESSAGE, CONNECTION_TIMEOUT_MS, CURSOR_PALETTE, DEFAULT_COLOR, DEFAULT_MAX_PACKAGE_BYTES, DEPARTURE_CHANNEL, Emitter, INITIAL_SYNC_GRACE_MS, INVALID_ROOM_MESSAGE, IdempotencyCache, LEGACY_PPTX_DEPARTURE_CHANNEL, LEGACY_PPTX_LEAVE_MESSAGE, LOCAL_ORIGIN, MAX_LABEL_CHARS, MAX_UPDATE_BYTES, MESSAGE_AWARENESS, MESSAGE_QUERY_AWARENESS, MESSAGE_SYNC, NO_BROADCAST_MESSAGE, PRESENCE_FIELD, PRESENCE_HEARTBEAT_MS, STALE_PRESENCE_MS, SequenceTracker, adaptYjsProvider, applyUpdateSafe, asSelectionIds, assignUserColor, bindDocument, borrowAwareness, buildRoster, canBroadcast, canWrite, clampCoordinate, classifyVersion, clearLocalAwareness, collaborationStateOf, createAssetSync, createBroadcastTransport, createClientId, createCollabSession, createDepartureChannel, createIdGenerator, createMemoryHub, createPresencePublisher, createSyncGate, createTransportProvider, createWebSocketTransport, deriveCanvasPresence, derivePresence, encodeDiff, encodeSnapshot, encodeStateVector2 as encodeStateVector, formatCursorLabel, freezeDeep, fromBase64, getUserInitials, isMixedContentBlocked, isNonNegativeSafeInteger, isPresenceFresh, isValidId, isValidRoomId, mergeUpdates2 as mergeUpdates, observeExternalSession, onCollaborationStateChange, openCollaborationSession, packageAdapter, presenceToCursors, randomToken, registerTeardown, removeAwarenessStatesLocally, restoreSnapshot, roomUrl, sanitizeAvatarUrl, sanitizeCanvasPayload, sanitizeColor, sanitizeIdentity, sanitizeIndex, sanitizeRole, sanitizeUserName, shouldAutoFollowBroadcaster, shouldRoomReplaceLoad, stripHtmlTags, toBase64, toExternalSession, transportProvider, validateDisplayName, validateRoomId, validateUpdate, webrtcProvider };
@@ -0,0 +1,21 @@
1
+ import type { Awareness } from 'y-protocols/awareness';
2
+ import type * as Y from 'yjs';
3
+ import { type YjsProviderLike } from './external-provider.js';
4
+ import type { ProviderFactory } from './provider.js';
5
+ /** The y-webrtc `WebrtcProvider` constructor, structurally. */
6
+ export type WebrtcProviderConstructor = new (roomId: string, doc: Y.Doc, options: {
7
+ signaling?: string[];
8
+ password?: string;
9
+ awareness?: Awareness;
10
+ }) => YjsProviderLike;
11
+ export interface WebrtcOptions {
12
+ /** `WebrtcProvider` from the host's own `y-webrtc` install. */
13
+ WebrtcProvider: WebrtcProviderConstructor;
14
+ /** Signaling server URLs; y-webrtc's defaults when omitted. */
15
+ signaling?: string[];
16
+ /** Room password: peers without it cannot read the room. */
17
+ password?: string;
18
+ }
19
+ /** A provider factory that joins the session's room over y-webrtc, sharing its awareness. */
20
+ export declare function webrtcProvider(options: WebrtcOptions): ProviderFactory;
21
+ //# sourceMappingURL=webrtc-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc-provider.d.ts","sourceRoot":"","sources":["../../collab/webrtc-provider.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC;AAC9B,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,+DAA+D;AAC/D,MAAM,MAAM,yBAAyB,GAAG,KACvC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE,KACvE,eAAe,CAAC;AAErB,MAAM,WAAW,aAAa;IAC7B,+DAA+D;IAC/D,cAAc,EAAE,yBAAyB,CAAC;IAC1C,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,eAAe,CAStE"}