solid-ui 3.1.3-13 → 3.1.3-15
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/README.md +0 -14
- package/dist/_virtual/_rolldown/runtime.cjs.js +1 -1
- package/dist/acl/access-controller.cjs.js.map +1 -1
- package/dist/acl/access-groups.cjs.js +1 -1
- package/dist/acl/access-groups.cjs.js.map +1 -1
- package/dist/acl/access-groups.esm.js +2 -1
- package/dist/acl/access-groups.esm.js.map +1 -1
- package/dist/acl/acl.cjs.js.map +1 -1
- package/dist/acl/acl.esm.js.map +1 -1
- package/dist/chat/bookmarks.esm.js +2 -1
- package/dist/chat/bookmarks.esm.js.map +1 -1
- package/dist/chat/chatLogic.cjs.js +1 -1
- package/dist/chat/chatLogic.cjs.js.map +1 -1
- package/dist/chat/chatLogic.esm.js +2 -2
- package/dist/chat/chatLogic.esm.js.map +1 -1
- package/dist/chat/keys.cjs.js +1 -1
- package/dist/chat/keys.cjs.js.map +1 -1
- package/dist/chat/keys.d.ts +1 -1
- package/dist/chat/keys.d.ts.map +1 -1
- package/dist/chat/keys.esm.js +5 -2
- package/dist/chat/keys.esm.js.map +1 -1
- package/dist/chat/signature.cjs.js +1 -1
- package/dist/chat/signature.cjs.js.map +1 -1
- package/dist/chat/signature.esm.js +2 -1
- package/dist/chat/signature.esm.js.map +1 -1
- package/dist/chunks/{DialogProvider-B7wEBrVN.js → DialogProvider-0HIHjONx.js} +11 -11
- package/dist/chunks/{DialogProvider-B7wEBrVN.js.map → DialogProvider-0HIHjONx.js.map} +1 -1
- package/dist/chunks/{account-DeNlj01m.js → account-Ch8h_zTv.js} +20 -21
- package/dist/chunks/{account-DeNlj01m.js.map → account-Ch8h_zTv.js.map} +1 -1
- package/dist/chunks/{auth-Knq99zZ9.js → auth-D4NUMSzc.js} +98 -72
- package/dist/chunks/auth-D4NUMSzc.js.map +1 -0
- package/dist/chunks/{avatar-DgO_p94F.js → avatar-BWtz4RlU.js} +7 -8
- package/dist/chunks/{avatar-DgO_p94F.js.map → avatar-BWtz4RlU.js.map} +1 -1
- package/dist/chunks/{button-Dvkek1tx.js → button-BJyFKOKO.js} +12 -15
- package/dist/chunks/{button-Dvkek1tx.js.map → button-BJyFKOKO.js.map} +1 -1
- package/dist/chunks/{chunk.7MPIABXH-DNcYOuE8.js → chunk.64OG2H45-BADxAtEI.js} +97 -50
- package/dist/chunks/chunk.64OG2H45-BADxAtEI.js.map +1 -0
- package/dist/chunks/{combobox-B5j4LoHY.js → combobox-0NWv9K3D.js} +106 -93
- package/dist/chunks/combobox-0NWv9K3D.js.map +1 -0
- package/dist/chunks/{combobox-option-C5lKAumO.js → combobox-option-B-twy1Zn.js} +6 -7
- package/dist/chunks/{combobox-option-C5lKAumO.js.map → combobox-option-B-twy1Zn.js.map} +1 -1
- package/dist/chunks/components-DrP7BOrs.js +1281 -0
- package/dist/chunks/components-DrP7BOrs.js.map +1 -0
- package/dist/chunks/{dialog-DZgm_Tph.js → dialog-CcMVH-Ut.js} +16 -16
- package/dist/chunks/{dialog-DZgm_Tph.js.map → dialog-CcMVH-Ut.js.map} +1 -1
- package/dist/chunks/{dialog-content-DY-ROHyi.js → dialog-content-DcD_s3hK.js} +2 -3
- package/dist/chunks/{dialog-content-DY-ROHyi.js.map → dialog-content-DcD_s3hK.js.map} +1 -1
- package/dist/chunks/{dialog-footer-BAZTjZ8J.js → dialog-footer-CHgSH7G5.js} +2 -3
- package/dist/chunks/{dialog-footer-BAZTjZ8J.js.map → dialog-footer-CHgSH7G5.js.map} +1 -1
- package/dist/chunks/{dialog-header-COzPcK8F.js → dialog-header-BjellR7_.js} +2 -3
- package/dist/chunks/{dialog-header-COzPcK8F.js.map → dialog-header-BjellR7_.js.map} +1 -1
- package/dist/chunks/{dialogs-DEuwXC46.js → dialogs-CeHuLUo5.js} +2 -2
- package/dist/chunks/{dialogs-DEuwXC46.js.map → dialogs-CeHuLUo5.js.map} +1 -1
- package/dist/chunks/{dialogs-root-BYp6fIUE.js → dialogs-root-CvsON-m8.js} +5 -6
- package/dist/chunks/{dialogs-root-BYp6fIUE.js.map → dialogs-root-CvsON-m8.js.map} +1 -1
- package/dist/chunks/{guard-DI4k0FkM.js → guard-BIesxo_f.js} +7 -8
- package/dist/chunks/{guard-DI4k0FkM.js.map → guard-BIesxo_f.js.map} +1 -1
- package/dist/chunks/{solid-logic.esm-BrMdCG2_.js → index.esm-CyyOkz04.js} +2663 -2745
- package/dist/chunks/index.esm-CyyOkz04.js.map +1 -0
- package/dist/chunks/{input-CCpEhtqA.js → input-CFDN76Y5.js} +99 -54
- package/dist/chunks/input-CFDN76Y5.js.map +1 -0
- package/dist/chunks/{jsonld-B61R4iOL.js → jsonld-52q5nY_t.js} +22 -27
- package/dist/chunks/{jsonld-B61R4iOL.js.map → jsonld-52q5nY_t.js.map} +1 -1
- package/dist/chunks/{login-button-BafqiKef.js → login-button-BhdKFJ-F.js} +8 -9
- package/dist/chunks/{login-button-BafqiKef.js.map → login-button-BhdKFJ-F.js.map} +1 -1
- package/dist/chunks/{logout-button-D54NF9EW.js → logout-button-ClbKS9ss.js} +8 -9
- package/dist/chunks/{logout-button-D54NF9EW.js.map → logout-button-ClbKS9ss.js.map} +1 -1
- package/dist/chunks/{menu-DKxtACGA.js → menu-DVgG-el5.js} +39 -35
- package/dist/chunks/menu-DVgG-el5.js.map +1 -0
- package/dist/chunks/{menu-item-D9BqJtKZ.js → menu-item-Bj3NgLzB.js} +5 -6
- package/dist/chunks/{menu-item-D9BqJtKZ.js.map → menu-item-Bj3NgLzB.js.map} +1 -1
- package/dist/chunks/{photo-capture-BoZF621r.js → photo-capture-CVKE0SKx.js} +18 -19
- package/dist/chunks/{photo-capture-BoZF621r.js.map → photo-capture-CVKE0SKx.js.map} +1 -1
- package/dist/chunks/{photo-capture-modal-BLZtHDj1.js → photo-capture-modal-DARmhHUH.js} +26 -26
- package/dist/chunks/{photo-capture-modal-BLZtHDj1.js.map → photo-capture-modal-DARmhHUH.js.map} +1 -1
- package/dist/chunks/{provider-Btl6Lnki.js → provider-CBSBzOfP.js} +9 -10
- package/dist/chunks/{provider-Btl6Lnki.js.map → provider-CBSBzOfP.js.map} +1 -1
- package/dist/chunks/rdf-form-BeuzVBOP.js +339 -0
- package/dist/chunks/rdf-form-BeuzVBOP.js.map +1 -0
- package/dist/chunks/rdf-input-n73oeSkf.js +440 -0
- package/dist/chunks/rdf-input-n73oeSkf.js.map +1 -0
- package/dist/chunks/{rolldown-runtime-B1bRi_D7.js → rolldown-runtime-Cb76FRpK.js} +2 -2
- package/dist/chunks/{select-XkieYvDm.js → select-BuIxSm1A.js} +9 -10
- package/dist/chunks/{select-XkieYvDm.js.map → select-BuIxSm1A.js.map} +1 -1
- package/dist/chunks/{select-option-DUg4AWzw.js → select-option-Z8qZsCQo.js} +6 -7
- package/dist/chunks/{select-option-DUg4AWzw.js.map → select-option-Z8qZsCQo.js.map} +1 -1
- package/dist/chunks/{signup-button-D5wS8_gB.js → signup-button-B-AgjjAK.js} +8 -9
- package/dist/chunks/{signup-button-D5wS8_gB.js.map → signup-button-B-AgjjAK.js.map} +1 -1
- package/dist/chunks/{solid-emblem-XHk-oomv.js → solid-emblem-D4ItOckU.js} +2 -3
- package/dist/chunks/{solid-emblem-XHk-oomv.js.map → solid-emblem-D4ItOckU.js.map} +1 -1
- package/dist/chunks/{src-CJICzMIV.js → src-B5SL8UtS.js} +2741 -3207
- package/dist/chunks/src-B5SL8UtS.js.map +1 -0
- package/dist/chunks/style-CjYxsW7j.js +536 -0
- package/dist/chunks/style-CjYxsW7j.js.map +1 -0
- package/dist/components/account/Account.cjs.js.map +1 -1
- package/dist/components/account.js +1 -1
- package/dist/components/all.cjs.js +1 -1
- package/dist/components/all.esm.js +2 -1
- package/dist/components/avatar/Avatar.cjs.js.map +1 -1
- package/dist/components/avatar.js +1 -1
- package/dist/components/button/Button.cjs.js +1 -1
- package/dist/components/button/Button.cjs.js.map +1 -1
- package/dist/components/button/Button.esm.js +1 -3
- package/dist/components/button/Button.esm.js.map +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/combobox/Combobox.cjs.js +2 -2
- package/dist/components/combobox/Combobox.cjs.js.map +1 -1
- package/dist/components/combobox/Combobox.d.ts +1 -0
- package/dist/components/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.esm.js +61 -47
- package/dist/components/combobox/Combobox.esm.js.map +1 -1
- package/dist/components/combobox-option/ComboboxOption.cjs.js.map +1 -1
- package/dist/components/combobox-option.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/dialog/Dialog.cjs.js +4 -4
- package/dist/components/dialog/Dialog.cjs.js.map +1 -1
- package/dist/components/dialog/Dialog.esm.js +5 -4
- package/dist/components/dialog/Dialog.esm.js.map +1 -1
- package/dist/components/dialog-content.js +1 -1
- package/dist/components/dialog-footer.js +1 -1
- package/dist/components/dialog-header.js +1 -1
- package/dist/components/dialog-provider/DialogProvider.cjs.js.map +1 -1
- package/dist/components/dialog-provider.js +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/dialogs-root/DialogsRoot.cjs.js.map +1 -1
- package/dist/components/dialogs-root.js +1 -1
- package/dist/components/guard/Guard.cjs.js.map +1 -1
- package/dist/components/guard.js +1 -1
- package/dist/components/input/Input.cjs.js +3 -2
- package/dist/components/input/Input.cjs.js.map +1 -1
- package/dist/components/input/Input.d.ts +3 -0
- package/dist/components/input/Input.d.ts.map +1 -1
- package/dist/components/input/Input.esm.js +99 -53
- package/dist/components/input/Input.esm.js.map +1 -1
- package/dist/components/input/Input.styles.cjs.js +1 -1
- package/dist/components/input/Input.styles.cjs.js.map +1 -1
- package/dist/components/input/Input.styles.esm.js +1 -1
- package/dist/components/input/Input.styles.esm.js.map +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/login-button/LoginButton.cjs.js.map +1 -1
- package/dist/components/login-button.js +1 -1
- package/dist/components/login-modal/LoginModal.cjs.js.map +1 -1
- package/dist/components/login-modal.js +1 -1
- package/dist/components/logout-button/LogoutButton.cjs.js.map +1 -1
- package/dist/components/logout-button.js +1 -1
- package/dist/components/menu/Menu.cjs.js +1 -1
- package/dist/components/menu/Menu.cjs.js.map +1 -1
- package/dist/components/menu/Menu.d.ts.map +1 -1
- package/dist/components/menu/Menu.esm.js +1 -1
- package/dist/components/menu/Menu.esm.js.map +1 -1
- package/dist/components/menu/Menu.test.d.ts +1 -0
- package/dist/components/menu/Menu.test.d.ts.map +1 -0
- package/dist/components/menu-item/MenuItem.cjs.js.map +1 -1
- package/dist/components/menu-item.js +1 -1
- package/dist/components/menu.js +1 -1
- package/dist/components/photo-capture/PhotoCapture.cjs.js.map +1 -1
- package/dist/components/photo-capture-modal/PhotoCaptureModal.cjs.js +1 -1
- package/dist/components/photo-capture-modal/PhotoCaptureModal.cjs.js.map +1 -1
- package/dist/components/photo-capture-modal/PhotoCaptureModal.esm.js +2 -1
- package/dist/components/photo-capture-modal/PhotoCaptureModal.esm.js.map +1 -1
- package/dist/components/photo-capture-modal.js +1 -1
- package/dist/components/photo-capture.js +1 -1
- package/dist/components/provider/Provider.cjs.js.map +1 -1
- package/dist/components/provider.js +1 -1
- package/dist/components/rdf-form/RDFForm.cjs.js +12 -0
- package/dist/components/rdf-form/RDFForm.cjs.js.map +1 -0
- package/dist/components/rdf-form/RDFForm.d.ts +17 -0
- package/dist/components/rdf-form/RDFForm.d.ts.map +1 -0
- package/dist/components/rdf-form/RDFForm.esm.js +344 -0
- package/dist/components/rdf-form/RDFForm.esm.js.map +1 -0
- package/dist/components/rdf-form/RDForm.stories.d.ts +20 -0
- package/dist/components/rdf-form/RDForm.stories.d.ts.map +1 -0
- package/dist/components/rdf-form/index.cjs.js +2 -0
- package/dist/components/rdf-form/index.cjs.js.map +1 -0
- package/dist/components/rdf-form/index.d.ts +4 -0
- package/dist/components/rdf-form/index.d.ts.map +1 -0
- package/dist/components/rdf-form/index.esm.js +7 -0
- package/dist/components/rdf-form/index.esm.js.map +1 -0
- package/dist/components/rdf-form.js +2 -0
- package/dist/components/rdf-input/RDFInput.cjs.js +11 -0
- package/dist/components/rdf-input/RDFInput.cjs.js.map +1 -0
- package/dist/components/rdf-input/RDFInput.d.ts +24 -0
- package/dist/components/rdf-input/RDFInput.d.ts.map +1 -0
- package/dist/components/rdf-input/RDFInput.esm.js +349 -0
- package/dist/components/rdf-input/RDFInput.esm.js.map +1 -0
- package/dist/components/rdf-input/index.cjs.js +2 -0
- package/dist/components/rdf-input/index.cjs.js.map +1 -0
- package/dist/components/rdf-input/index.d.ts +4 -0
- package/dist/components/rdf-input/index.d.ts.map +1 -0
- package/dist/components/rdf-input/index.esm.js +7 -0
- package/dist/components/rdf-input/index.esm.js.map +1 -0
- package/dist/components/rdf-input.js +2 -0
- package/dist/components/select/Select.cjs.js.map +1 -1
- package/dist/components/select-option/SelectOption.cjs.js.map +1 -1
- package/dist/components/select-option.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/signup-button/SignupButton.cjs.js.map +1 -1
- package/dist/components/signup-button.js +1 -1
- package/dist/components/solid-emblem.js +1 -1
- package/dist/components.js +26 -25
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +3 -2
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +8 -7
- package/dist/lib/auth/SolidAuth.cjs.js +1 -1
- package/dist/lib/auth/SolidAuth.cjs.js.map +1 -1
- package/dist/lib/auth/SolidAuth.esm.js +3 -1
- package/dist/lib/auth/SolidAuth.esm.js.map +1 -1
- package/dist/lib/auth/context.cjs.js.map +1 -1
- package/dist/lib/components/dialog-component/DialogComponent.cjs.js.map +1 -1
- package/dist/lib/components/form-control-component/FormControlComponent.cjs.js.map +1 -1
- package/dist/lib/components/web-component/WebComponent.cjs.js +1 -1
- package/dist/lib/components/web-component/WebComponent.cjs.js.map +1 -1
- package/dist/lib/components/web-component/WebComponent.esm.js +2 -1
- package/dist/lib/components/web-component/WebComponent.esm.js.map +1 -1
- package/dist/lib/dialogs/context.cjs.js.map +1 -1
- package/dist/lib/file-explorer/context.cjs.js +2 -0
- package/dist/lib/file-explorer/context.cjs.js.map +1 -0
- package/dist/lib/file-explorer/context.d.ts +22 -0
- package/dist/lib/file-explorer/context.d.ts.map +1 -0
- package/dist/lib/file-explorer/context.esm.js +7 -0
- package/dist/lib/file-explorer/context.esm.js.map +1 -0
- package/dist/lib/forms/fieldParams.cjs.js +2 -0
- package/dist/lib/forms/fieldParams.cjs.js.map +1 -0
- package/dist/lib/forms/fieldParams.d.ts +21 -0
- package/dist/lib/forms/fieldParams.d.ts.map +1 -0
- package/dist/lib/forms/fieldParams.esm.js +74 -0
- package/dist/lib/forms/fieldParams.esm.js.map +1 -0
- package/dist/lib/forms/rdfFormsHelper.cjs.js +2 -0
- package/dist/lib/forms/rdfFormsHelper.cjs.js.map +1 -0
- package/dist/lib/forms/rdfFormsHelper.d.ts +16 -0
- package/dist/lib/forms/rdfFormsHelper.d.ts.map +1 -0
- package/dist/lib/forms/rdfFormsHelper.esm.js +34 -0
- package/dist/lib/forms/rdfFormsHelper.esm.js.map +1 -0
- package/dist/lib/forms/store/NoopStore.cjs.js +2 -0
- package/dist/lib/forms/store/NoopStore.cjs.js.map +1 -0
- package/dist/lib/forms/store/NoopStore.d.ts +6 -0
- package/dist/lib/forms/store/NoopStore.d.ts.map +1 -0
- package/dist/lib/forms/store/NoopStore.esm.js +10 -0
- package/dist/lib/forms/store/NoopStore.esm.js.map +1 -0
- package/dist/lib/forms/store/StoreContext.cjs.js +2 -0
- package/dist/lib/forms/store/StoreContext.cjs.js.map +1 -0
- package/dist/lib/forms/store/StoreContext.d.ts +10 -0
- package/dist/lib/forms/store/StoreContext.d.ts.map +1 -0
- package/dist/lib/forms/store/StoreContext.esm.js +8 -0
- package/dist/lib/forms/store/StoreContext.esm.js.map +1 -0
- package/dist/lib/ns.cjs.js.map +1 -1
- package/dist/lib/pad.cjs.js +1 -1
- package/dist/lib/pad.cjs.js.map +1 -1
- package/dist/lib/pad.esm.js +6 -5
- package/dist/lib/pad.esm.js.map +1 -1
- package/dist/lib/participation.cjs.js +1 -1
- package/dist/lib/participation.cjs.js.map +1 -1
- package/dist/lib/participation.esm.js +4 -2
- package/dist/lib/participation.esm.js.map +1 -1
- package/dist/lib/preferences.cjs.js +1 -1
- package/dist/lib/preferences.cjs.js.map +1 -1
- package/dist/lib/preferences.esm.js +9 -7
- package/dist/lib/preferences.esm.js.map +1 -1
- package/dist/lib/table.cjs.js +2 -2
- package/dist/lib/table.cjs.js.map +1 -1
- package/dist/lib/table.esm.js +2 -2
- package/dist/lib/table.esm.js.map +1 -1
- package/dist/loader.js +8 -7
- package/dist/login/login.cjs.js.map +1 -1
- package/dist/media/media-capture.esm.js +2 -1
- package/dist/media/media-capture.esm.js.map +1 -1
- package/dist/solid-ui.js +107 -156
- package/dist/solid-ui.min.js +107 -156
- package/dist/solid-ui.min.js.map +1 -1
- package/dist/storybook/components/StorybookProvider.d.ts +1 -0
- package/dist/storybook/components/StorybookProvider.d.ts.map +1 -1
- package/dist/storybook/store/StorybookStore.d.ts +6 -0
- package/dist/storybook/store/StorybookStore.d.ts.map +1 -0
- package/dist/utils/headerFooterHelpers.cjs.js +1 -1
- package/dist/utils/headerFooterHelpers.cjs.js.map +1 -1
- package/dist/utils/headerFooterHelpers.esm.js +2 -1
- package/dist/utils/headerFooterHelpers.esm.js.map +1 -1
- package/dist/utils/index.cjs.js +1 -1
- package/dist/utils/index.cjs.js.map +1 -1
- package/dist/utils/index.esm.js +1 -1
- package/dist/utils/index.esm.js.map +1 -1
- package/dist/utils/keyHelpers/accessData.cjs.js +1 -1
- package/dist/utils/keyHelpers/accessData.cjs.js.map +1 -1
- package/dist/utils/keyHelpers/accessData.d.ts +3 -3
- package/dist/utils/keyHelpers/accessData.d.ts.map +1 -1
- package/dist/utils/keyHelpers/accessData.esm.js +2 -1
- package/dist/utils/keyHelpers/accessData.esm.js.map +1 -1
- package/dist/utils/keyHelpers/otherHelpers.d.ts +1 -1
- package/dist/utils/keyHelpers/otherHelpers.d.ts.map +1 -1
- package/dist/widgets/buttons.cjs.js +2 -2
- package/dist/widgets/buttons.cjs.js.map +1 -1
- package/dist/widgets/buttons.esm.js +10 -5
- package/dist/widgets/buttons.esm.js.map +1 -1
- package/dist/widgets/dragAndDrop.cjs.js +1 -1
- package/dist/widgets/dragAndDrop.cjs.js.map +1 -1
- package/dist/widgets/dragAndDrop.esm.js +1 -1
- package/dist/widgets/dragAndDrop.esm.js.map +1 -1
- package/dist/widgets/forms/autocomplete/autocompleteBar.esm.js +25 -18
- package/dist/widgets/forms/autocomplete/autocompleteBar.esm.js.map +1 -1
- package/dist/widgets/forms/autocomplete/autocompleteField.cjs.js.map +1 -1
- package/dist/widgets/forms/autocomplete/publicData.cjs.js +1 -1
- package/dist/widgets/forms/autocomplete/publicData.cjs.js.map +1 -1
- package/dist/widgets/forms/autocomplete/publicData.d.ts +3 -3
- package/dist/widgets/forms/autocomplete/publicData.d.ts.map +1 -1
- package/dist/widgets/forms/autocomplete/publicData.esm.js +6 -4
- package/dist/widgets/forms/autocomplete/publicData.esm.js.map +1 -1
- package/dist/widgets/forms/basic.cjs.js +1 -1
- package/dist/widgets/forms/basic.cjs.js.map +1 -1
- package/dist/widgets/forms/basic.esm.js +27 -25
- package/dist/widgets/forms/basic.esm.js.map +1 -1
- package/dist/widgets/forms/formStyle.cjs.js +1 -1
- package/dist/widgets/forms/formStyle.cjs.js.map +1 -1
- package/dist/widgets/forms/formStyle.esm.js +4 -4
- package/dist/widgets/forms/formStyle.esm.js.map +1 -1
- package/dist/widgets/forms.cjs.js +2 -2
- package/dist/widgets/forms.cjs.js.map +1 -1
- package/dist/widgets/forms.esm.js +10 -8
- package/dist/widgets/forms.esm.js.map +1 -1
- package/dist/widgets/multiSelect.cjs.js +1 -1
- package/dist/widgets/multiSelect.cjs.js.map +1 -1
- package/dist/widgets/multiSelect.esm.js +2 -1
- package/dist/widgets/multiSelect.esm.js.map +1 -1
- package/dist/widgets/peoplePicker.cjs.js.map +1 -1
- package/package.json +4 -3
- package/dist/chunks/auth-Knq99zZ9.js.map +0 -1
- package/dist/chunks/chunk.7MPIABXH-DNcYOuE8.js.map +0 -1
- package/dist/chunks/combobox-B5j4LoHY.js.map +0 -1
- package/dist/chunks/components-BD458q30.js +0 -758
- package/dist/chunks/components-BD458q30.js.map +0 -1
- package/dist/chunks/footer-BLSjn5ur.js +0 -144
- package/dist/chunks/footer-BLSjn5ur.js.map +0 -1
- package/dist/chunks/headerFooterHelpers-CPd5d20q.js +0 -52
- package/dist/chunks/headerFooterHelpers-CPd5d20q.js.map +0 -1
- package/dist/chunks/input-CCpEhtqA.js.map +0 -1
- package/dist/chunks/lit-C4H1jI4q.js +0 -527
- package/dist/chunks/lit-C4H1jI4q.js.map +0 -1
- package/dist/chunks/menu-DKxtACGA.js.map +0 -1
- package/dist/chunks/solid-logic.esm-BrMdCG2_.js.map +0 -1
- package/dist/chunks/src-CJICzMIV.js.map +0 -1
- package/dist/components/footer/index.cjs.js +0 -1
- package/dist/components/footer/index.d.ts +0 -2
- package/dist/components/footer/index.d.ts.map +0 -1
- package/dist/components/footer/index.esm.js +0 -3
- package/dist/components/footer.js +0 -2
- package/dist/v2/components/layout/footer/Footer.cjs.js +0 -73
- package/dist/v2/components/layout/footer/Footer.cjs.js.map +0 -1
- package/dist/v2/components/layout/footer/Footer.d.ts +0 -60
- package/dist/v2/components/layout/footer/Footer.d.ts.map +0 -1
- package/dist/v2/components/layout/footer/Footer.esm.js +0 -143
- package/dist/v2/components/layout/footer/Footer.esm.js.map +0 -1
- package/dist/v2/components/layout/footer/Footer.test.d.ts +0 -1
- package/dist/v2/components/layout/footer/Footer.test.d.ts.map +0 -1
- package/dist/v2/components/layout/footer/index.cjs.js +0 -2
- package/dist/v2/components/layout/footer/index.cjs.js.map +0 -1
- package/dist/v2/components/layout/footer/index.d.ts +0 -3
- package/dist/v2/components/layout/footer/index.d.ts.map +0 -1
- package/dist/v2/components/layout/footer/index.esm.js +0 -8
- package/dist/v2/components/layout/footer/index.esm.js.map +0 -1
package/dist/acl/acl.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acl.esm.js","names":[],"sources":["../../src/acl/acl.ts"],"sourcesContent":["/**\n * Non-UI functions for access control.\n * See https://github.com/solidos/web-access-control-spec\n * for the spec that defines how ACL documents work.\n * @packageDocumentation\n */\n\nimport ns from '../lib/ns'\nimport { solidLogicSingleton, ACL_LINK } from 'solid-logic'\nimport * as utils from '../utils'\nimport { AgentMapMap, AgentMapUnion, ComboList } from './types'\nimport * as debug from '../lib/debug'\nimport { graph, Store, NamedNode, serialize, st, Statement, sym, LiveStore } from 'rdflib'\n\nconst kb = solidLogicSingleton.store\n\n/**\n * Take the \"default\" ACL and convert it into the equivalent ACL\n * which the resource would have had. Return it as a new separate store.\n * The \"defaultForNew\" predicate is also accepted, as a deprecated\n * synonym for \"default\".\n */\nexport function adoptACLDefault (\n doc: NamedNode,\n aclDoc: NamedNode,\n defaultResource: NamedNode,\n defaultACLDoc: NamedNode\n): Store {\n const ACL = ns.acl\n const isContainer = doc.uri.slice(-1) === '/' // Give default for all directories\n\n const defaults = kb\n .each(undefined, ACL('default'), defaultResource, defaultACLDoc)\n .concat(kb.each(undefined, ACL('defaultForNew'), defaultResource, defaultACLDoc))\n\n const proposed = defaults.reduce((accumulatedStatements, da) => accumulatedStatements\n .concat(kb.statementsMatching(da as NamedNode, ns.rdf('type'), ACL('Authorization'), defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('agent'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('agentClass'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('agentGroup'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('origin'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('originClass'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('mode'), undefined, defaultACLDoc))\n .concat(st(da as NamedNode, ACL('accessTo'), doc, defaultACLDoc))\n .concat(isContainer ? st(da as NamedNode, ACL('default'), doc, defaultACLDoc) : []), [] as Statement[])\n\n const kb2 = graph() // Potential - derived is kept apart\n proposed.forEach(st => kb2.add(move(st.subject), move(st.predicate), move(st.object), sym(aclDoc.uri)))\n return kb2 as LiveStore\n\n function move (symbol) {\n const y = defaultACLDoc.uri.length // The default ACL file\n return sym(\n symbol.uri.slice(0, y) === defaultACLDoc.uri\n ? aclDoc.uri + symbol.uri.slice(y)\n : symbol.uri\n )\n }\n}\n\n/**\n * Read and canonicalize the ACL for x in aclDoc\n *\n * Accumulate the access rights which each agent or class has\n */\nexport function readACL (\n doc: NamedNode,\n aclDoc: NamedNode,\n kb2: Store = kb,\n getDefaults: boolean = false\n): AgentMapMap {\n const auths: Array<NamedNode> = getDefaults\n ? getDefaultsFallback(kb2, ns)\n : kb2.each(undefined, ns.acl('accessTo'), doc)\n\n const ACL = ns.acl\n const ac = {\n agent: {},\n agentClass: {},\n agentGroup: {},\n origin: {},\n originClass: {}\n }\n Object.keys(ac).forEach(pred => {\n auths.forEach(function (a) {\n (kb2.each(a, ACL('mode')) as Array<NamedNode>).forEach(function (mode) {\n (kb2.each(a, ACL(pred)) as Array<NamedNode>).forEach(function (agent) {\n ac[pred][agent.uri] = ac[pred][agent.uri] || {}\n ac[pred][agent.uri][mode.uri] = a // could be \"true\" but leave pointer just in case\n })\n })\n })\n })\n return ac\n\n function getDefaultsFallback (kb, ns) {\n return kb\n .each(undefined, ns.acl('default'), doc)\n .concat(kb.each(undefined, ns.acl('defaultForNew'), doc))\n }\n}\n\n/**\n * Compare two ACLs\n */\nexport function sameACL (a: AgentMapMap | AgentMapUnion, b: AgentMapMap | AgentMapUnion): boolean {\n const contains = function (a, b) {\n for (const pred in {\n agent: true,\n agentClass: true,\n agentGroup: true,\n origin: true,\n originClass: true\n }) {\n if (a[pred]) {\n for (const agent in a[pred]) {\n for (const mode in a[pred][agent]) {\n if (!b[pred][agent] || !b[pred][agent][mode]) {\n return false\n }\n }\n }\n }\n }\n return true\n }\n return contains(a, b) && contains(b, a)\n}\n\n/**\n * Union N ACLs\n */\nexport function ACLunion (list: Array<AgentMapMap | AgentMapUnion>): AgentMapUnion {\n const b = list[0]\n let a, ag\n for (let k = 1; k < list.length; k++) {\n ;['agent', 'agentClass', 'agentGroup', 'origin', 'originClass'].forEach(\n function (pred) {\n a = list[k]\n if (a[pred]) {\n for (ag in a[pred]) {\n for (const mode in a[pred][ag]) {\n if (!b[pred][ag]) b[pred][ag] = []\n b[pred][ag][mode] = true\n }\n }\n }\n }\n )\n }\n return b as AgentMapUnion\n}\n\ntype loadUnionACLCallback = (ok: boolean, message?: string | NamedNode | AgentMapUnion | AgentMapMap) => void\n\n/**\n * Merge ACLs lists from things to form union\n */\nexport function loadUnionACL (subjectList: Array<NamedNode>, callbackFunction: loadUnionACLCallback): void {\n const aclList: Array<AgentMapMap> = []\n const doList = function (list) {\n if (list.length) {\n const doc = list.shift().doc()\n getACLorDefault(doc, function (\n ok,\n p2,\n targetDoc,\n targetACLDoc,\n defaultHolder,\n defaultACLDoc\n ) {\n const defa = !p2\n if (!ok || !defaultHolder || !defaultACLDoc) return callbackFunction(ok, targetACLDoc)\n const acl = defa\n ? readACL(defaultHolder, defaultACLDoc)\n : readACL(targetDoc as NamedNode, targetACLDoc as NamedNode)\n aclList.push(acl)\n doList(list.slice(1))\n })\n } else {\n // all gone\n callbackFunction(true, ACLunion(aclList))\n }\n }\n doList(subjectList)\n}\n\n/**\n * Represents these as an RDF graph by combination of modes\n *\n * Each agent can only be in one place in this model, one combination of modes.\n * Combos are like full control, read append, read only etc.\n */\nexport function ACLbyCombination (ac: AgentMapMap | AgentMapUnion): ComboList {\n const byCombo = {}\n ;['agent', 'agentClass', 'agentGroup', 'origin', 'originClass'].forEach(function (pred) {\n for (const agent in ac[pred]) {\n const combo: string[] = []\n for (const mode in ac[pred][agent]) {\n combo.push(mode)\n }\n combo.sort()\n const combo2 = combo.join('\\n')\n if (!byCombo[combo2]) byCombo[combo2] = []\n byCombo[combo2].push([pred, agent])\n }\n })\n return byCombo\n}\n\n/**\n * Write ACL graph to store from AC\n */\nexport function makeACLGraph (kb: Store, x: NamedNode, ac: AgentMapMap, aclDoc: NamedNode): void {\n const byCombo = ACLbyCombination(ac)\n return makeACLGraphbyCombo(kb, x, byCombo, aclDoc)\n}\n\n/**\n * Write ACL graph to store from combo\n */\nexport function makeACLGraphbyCombo (\n kb: Store,\n x: NamedNode,\n byCombo: ComboList,\n aclDoc: NamedNode,\n main?: boolean,\n defa?: boolean\n): void {\n const ACL = ns.acl\n for (const combo in byCombo) {\n const pairs = byCombo[combo]\n if (!pairs.length) continue // do not add to store when no agent\n const modeURIs = combo.split('\\n')\n let short = modeURIs\n .map(function (u) {\n return u.split('#')[1]\n })\n .join('')\n if (defa && !main) short += 'Default' // don't muddle authorizations\n const a = kb.sym(aclDoc.uri + '#' + short)\n kb.add(a, ns.rdf('type'), ACL('Authorization'), aclDoc)\n if (main) {\n kb.add(a, ACL('accessTo'), x, aclDoc)\n }\n if (defa) {\n kb.add(a, ACL('default'), x, aclDoc)\n }\n for (let i = 0; i < modeURIs.length; i++) {\n kb.add(a, ACL('mode'), kb.sym(modeURIs[i]), aclDoc)\n }\n for (let i = 0; i < pairs.length; i++) {\n const pred = pairs[i][0]\n const ag = pairs[i][1]\n kb.add(a, ACL(pred), kb.sym(ag), aclDoc)\n }\n }\n}\n\n/**\n * Debugging short strings for dumping ACL\n * and possibly in the UI\n */\nexport function ACLToString (ac: AgentMapMap): string {\n return comboToString(ACLbyCombination(ac))\n}\n\n/**\n * Convert a [[ComboList]] to a string\n */\nexport function comboToString (byCombo: ComboList): string {\n let str = ''\n for (const combo in byCombo) {\n const modeURIs = combo.split('\\n')\n const initials = modeURIs\n .map(function (u) {\n return u.split('#')[1][0]\n })\n .join('')\n str += initials + ':'\n const pairs = byCombo[combo]\n for (let i = 0; i < pairs.length; i++) {\n const pred = pairs[i][0]\n const ag = sym(pairs[i][1])\n str += pred === 'agent' ? '@' : ''\n str += ag.sameTerm(ns.foaf('Agent')) ? '*' : utils.label(ag)\n if (i < pairs.length - 1) str += ','\n }\n str += ';'\n }\n return '{' + str.slice(0, -1) + '}' // drop extra semicolon\n}\n\n/**\n * Write ACL graph as Turtle\n */\nexport function makeACLString (x: NamedNode, ac: AgentMapMap, aclDoc: NamedNode): string {\n const kb2 = graph()\n makeACLGraph(kb2, x, ac, aclDoc)\n return serialize(aclDoc, kb2, aclDoc.uri, 'text/turtle') || ''\n}\n\n/**\n * Write ACL graph to web\n */\nexport function putACLObject (\n kb: LiveStore,\n x: NamedNode,\n ac: AgentMapMap | AgentMapUnion,\n aclDoc: NamedNode,\n callbackFunction: (ok: boolean, message?: string) => void\n): void {\n const byCombo = ACLbyCombination(ac)\n return putACLbyCombo(kb, x, byCombo, aclDoc, callbackFunction)\n}\n\n/**\n * Write ACL graph to web from a [[ComboList]]\n */\nexport function putACLbyCombo (\n kb: LiveStore,\n x: NamedNode,\n byCombo: ComboList,\n aclDoc: NamedNode,\n callbackFunction: (ok: boolean, message?: string) => void\n): void {\n const kb2 = graph()\n makeACLGraphbyCombo(kb2, x, byCombo, aclDoc, true)\n\n // const str = makeACLString = function(x, ac, aclDoc)\n kb.updater?.put(\n aclDoc,\n kb2.statementsMatching(undefined, undefined, undefined, aclDoc),\n 'text/turtle',\n function (uri, ok, message) {\n if (!ok) {\n callbackFunction(ok, message)\n } else {\n kb.fetcher?.unload(aclDoc)\n makeACLGraphbyCombo(kb, x, byCombo, aclDoc, true)\n kb.fetcher!.requested[aclDoc.uri] = 'done' // missing: save headers\n callbackFunction(ok)\n }\n }\n )\n}\n\ntype fixIndividualCardACLCallback = (ok: boolean, message?: string | NamedNode | AgentMapUnion | AgentMapMap) => void\ntype fixIndividualACLCallback = (ok: boolean, message?: string | NamedNode | AgentMapUnion | AgentMapMap) => void\n\n/**\n * Fix the ACl for an individual card as a function of the groups it is in\n *\n * All group files must be loaded first\n */\nexport function fixIndividualCardACL (person: NamedNode, log: Function, callbackFunction: fixIndividualCardACLCallback): void {\n const groups = kb.each(undefined, ns.vcard('hasMember'), person) as NamedNode[]\n // const doc = person.doc()\n if (groups) {\n fixIndividualACL(person, groups, log, callbackFunction)\n } else {\n log('This card is in no groups')\n callbackFunction(true) // fine, no requirements to access. default should be ok\n }\n // @@ if no groups, then use default for People container or the book top container.?\n}\n\n/**\n * This function is used by [[fixIndividualCardACL]]\n */\nexport function fixIndividualACL (item: NamedNode, subjects: Array<NamedNode>, log: Function, callbackFunction: fixIndividualACLCallback): void {\n log = log || debug.log\n const doc = item.doc()\n getACLorDefault(doc, function (\n ok,\n exists,\n targetDoc,\n targetACLDoc,\n defaultHolder,\n defaultACLDoc\n ) {\n if (!ok || !defaultHolder || !defaultACLDoc) return callbackFunction(false, targetACLDoc) // ie message\n const ac = exists\n ? readACL(targetDoc as NamedNode, targetACLDoc as NamedNode)\n : readACL(defaultHolder, defaultACLDoc)\n loadUnionACL(subjects, function (ok, union) {\n if (!ok) return callbackFunction(false, union)\n if (sameACL(union as AgentMapMap | AgentMapUnion, ac)) {\n log('Nice - same ACL. no change ' + utils.label(item) + ' ' + doc)\n } else {\n log('Group ACLs differ for ' + utils.label(item) + ' ' + doc)\n\n // log(\"Group ACLs: \" + makeACLString(targetDoc, union, targetACLDoc))\n // log((exists ? \"Previous set\" : \"Default\") + \" ACLs: \" +\n // makeACLString(targetDoc, ac, targetACLDoc))\n\n putACLObject(\n kb as unknown as LiveStore,\n targetDoc as NamedNode,\n union as AgentMapMap | AgentMapUnion,\n targetACLDoc as NamedNode,\n callbackFunction\n )\n }\n })\n })\n}\n\n/**\n * Set an ACL\n */\nexport function setACL (\n docURI: NamedNode,\n aclText: string,\n callbackFunction: (ok: boolean, message: string) => void\n): void {\n const aclDoc = kb.any(\n docURI,\n ACL_LINK\n ) // @@ check that this get set by web.js\n if (!kb.fetcher) {\n throw new Error('Store has no fetcher')\n }\n if (aclDoc) {\n // Great we already know where it is\n kb.fetcher\n .webOperation('PUT', aclDoc.value, {\n data: aclText,\n contentType: 'text/turtle'\n })\n .then((res) => {\n callbackFunction(res.ok, res.error || '')\n }) // @@@ check params\n } else {\n kb.fetcher.nowOrWhenFetched(docURI, undefined, function (ok, body) {\n if (!ok) return callbackFunction(ok, 'Gettting headers for ACL: ' + body)\n const aclDoc = kb.any(\n docURI,\n ACL_LINK\n ) // @@ check that this get set by web.js\n if (!aclDoc) {\n // complainIfBad(false, \"No Link rel=ACL header for \" + docURI)\n callbackFunction(false, 'No Link rel=ACL header for ' + docURI)\n } else {\n if (!kb.fetcher) {\n throw new Error('Store has no fetcher')\n }\n kb.fetcher\n .webOperation('PUT', aclDoc.value, {\n data: aclText,\n contentType: 'text/turtle'\n })\n .then((res) => {\n callbackFunction(res.ok, res.error || '')\n })\n }\n })\n }\n}\n\n/**\n * Get ACL file or default if necessary\n *\n * @param callbackFunction Will be called in the following ways, in the following cases:\n * * `callbackFunction(true, true, doc, aclDoc)` if the ACL did exist\n * * `callbackFunction(true, false, doc, aclDoc, defaultHolder, defaultACLDoc)` if the ACL file did not exist but a default did\n * * `callbackFunction(false, false, status, message)` when there was an error getting the original\n * * `callbackFunction(false, true, status, message)` when there was an error getting the default\n */\nexport function getACLorDefault (\n doc: NamedNode,\n callbackFunction: (\n a: boolean,\n b: boolean,\n statusOrMessage: number | NamedNode,\n message: string | NamedNode,\n c?: NamedNode,\n d?: NamedNode\n ) => void\n): void {\n getACL(doc, function (ok, status, aclDoc, message): string | void {\n const ACL = ns.acl\n if (!ok) return callbackFunction(false, false, status as number, message as string)\n\n // Recursively search for the ACL file which gives default access\n const tryParent = function (uri) {\n if (uri.slice(-1) === '/') {\n uri = uri.slice(0, -1)\n }\n const right = uri.lastIndexOf('/')\n const left = uri.indexOf('/', uri.indexOf('//') + 2)\n if (left > right) {\n return callbackFunction(false, true, 404, 'Found no ACL resource')\n }\n uri = uri.slice(0, right + 1)\n const doc2 = sym(uri)\n getACL(doc2, function (ok, status, defaultACLDoc: any): NamedNode | void {\n if (!ok) {\n return callbackFunction(\n false,\n true,\n status as number,\n `( No ACL pointer ${uri} ${status})${defaultACLDoc}`\n ) as void\n } else if (status === 403) {\n return callbackFunction(\n false,\n true,\n status,\n `( default ACL file FORBIDDEN. Stop.${uri})`\n )\n } else if (status === 404) {\n return tryParent(uri)\n } else if (status !== 200) {\n return callbackFunction(\n false,\n true,\n status as number,\n `Error status '${status}' searching for default for ${doc2}`\n )\n }\n // 200\n // statusBlock.textContent += (\" ACCESS set at \" + uri + \". End search.\")\n const defaults = kb\n .each(undefined, ACL('default'), kb.sym(uri), defaultACLDoc)\n .concat(\n kb.each(undefined, ACL('defaultForNew'), kb.sym(uri), defaultACLDoc)\n )\n if (!defaults.length) {\n return tryParent(uri) // Keep searching\n }\n const defaultHolder = kb.sym(uri)\n return callbackFunction(\n true,\n false,\n doc,\n aclDoc as NamedNode,\n defaultHolder,\n defaultACLDoc as NamedNode\n )\n })\n } // tryParent\n\n if (!ok) {\n return callbackFunction(\n false,\n false,\n status as number,\n `Error accessing Access Control information for ${doc}) ${message}`\n )\n } else if (status === 404) {\n tryParent(doc.uri) // @@ construct default one - the server should do that\n } else if (status === 403) {\n return callbackFunction(\n false,\n false,\n status,\n `(Sharing not available to you)${message}`\n )\n } else if (status !== 200) {\n return callbackFunction(\n false,\n false,\n status as number,\n `Error ${status} accessing Access Control information for ${doc}: ${message}`\n )\n } else {\n // 200\n return callbackFunction(true, true, doc, aclDoc as NamedNode)\n }\n }) // Call to getACL\n}\n\n/**\n * Calls back `(ok, status, acldoc, message)` as follows\n *\n * * `(false, 900, errormessage)` if no link header\n * * `(true, 403, documentSymbol, fileaccesserror)` if not authorized\n * * `(true, 404, documentSymbol, fileaccesserror)` if does not exist\n * * `(true, 200, documentSymbol)` if file exists and read OK\n */\nexport function getACL (\n doc: NamedNode,\n callbackFunction: (\n ok: boolean,\n messageOrStatus: number | string,\n messageOrDoc?: NamedNode | string,\n message?: string\n ) => void\n): void {\n if (!kb.fetcher) {\n throw new Error('kb has no fetcher')\n }\n kb.fetcher.nowOrWhenFetched(doc, undefined, function (ok, body) {\n if (!ok) {\n return callbackFunction(ok, `Can't get headers to find ACL for ${doc}: ${body}`)\n }\n const aclDoc = kb.any(\n doc,\n ACL_LINK\n ) // @@ check that this get set by web.js\n if (!aclDoc) {\n callbackFunction(false, 900, `No Link rel=ACL header for ${doc}`)\n } else {\n if (!kb.fetcher) {\n throw new Error('kb has no fetcher')\n }\n if (kb.fetcher.nonexistent[aclDoc.value]) {\n return callbackFunction(\n true,\n 404,\n aclDoc as NamedNode,\n `ACL file ${aclDoc} does not exist.`\n )\n }\n kb.fetcher.nowOrWhenFetched(aclDoc as NamedNode, undefined, function (\n ok,\n message,\n response\n ) {\n if (!ok) {\n callbackFunction(\n true,\n response.status,\n aclDoc as NamedNode,\n `Can't read Access Control File ${aclDoc}: ${message}`\n )\n } else {\n callbackFunction(true, 200, aclDoc as NamedNode)\n }\n })\n }\n })\n}\n\n/**\n * Calls [[getACLorDefault]] and then (?)\n */\nexport async function getProspectiveHolder (targetDirectory: string): Promise<NamedNode | undefined> {\n return new Promise((resolve, reject) => getACLorDefault(sym(targetDirectory), (\n ok,\n isDirectACL,\n targetDoc,\n targetACLDoc,\n defaultHolder\n ) => {\n if (ok) {\n return resolve((isDirectACL ? targetDoc : defaultHolder) as NamedNode)\n }\n return reject(new Error(`Error loading ${targetDirectory}`))\n }))\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acl.esm.js","names":[],"sources":["../../src/acl/acl.ts"],"sourcesContent":["/**\n * Non-UI functions for access control.\n * See https://github.com/solidos/web-access-control-spec\n * for the spec that defines how ACL documents work.\n * @packageDocumentation\n */\n\nimport ns from '../lib/ns'\nimport { solidLogicSingleton, ACL_LINK } from 'solid-logic'\nimport * as utils from '../utils'\nimport { AgentMapMap, AgentMapUnion, ComboList } from './types'\nimport * as debug from '../lib/debug'\nimport { graph, Store, NamedNode, serialize, st, Statement, sym, LiveStore } from 'rdflib'\n\nconst kb = solidLogicSingleton.store\n\n/**\n * Take the \"default\" ACL and convert it into the equivalent ACL\n * which the resource would have had. Return it as a new separate store.\n * The \"defaultForNew\" predicate is also accepted, as a deprecated\n * synonym for \"default\".\n */\nexport function adoptACLDefault (\n doc: NamedNode,\n aclDoc: NamedNode,\n defaultResource: NamedNode,\n defaultACLDoc: NamedNode\n): Store {\n const ACL = ns.acl\n const isContainer = doc.uri.slice(-1) === '/' // Give default for all directories\n\n const defaults = kb\n .each(undefined, ACL('default'), defaultResource, defaultACLDoc)\n .concat(kb.each(undefined, ACL('defaultForNew'), defaultResource, defaultACLDoc))\n\n const proposed = defaults.reduce((accumulatedStatements, da) => accumulatedStatements\n .concat(kb.statementsMatching(da as NamedNode, ns.rdf('type'), ACL('Authorization'), defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('agent'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('agentClass'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('agentGroup'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('origin'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('originClass'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('mode'), undefined, defaultACLDoc))\n .concat(st(da as NamedNode, ACL('accessTo'), doc, defaultACLDoc))\n .concat(isContainer ? st(da as NamedNode, ACL('default'), doc, defaultACLDoc) : []), [] as Statement[])\n\n const kb2 = graph() // Potential - derived is kept apart\n proposed.forEach(st => kb2.add(move(st.subject), move(st.predicate), move(st.object), sym(aclDoc.uri)))\n return kb2 as LiveStore\n\n function move (symbol) {\n const y = defaultACLDoc.uri.length // The default ACL file\n return sym(\n symbol.uri.slice(0, y) === defaultACLDoc.uri\n ? aclDoc.uri + symbol.uri.slice(y)\n : symbol.uri\n )\n }\n}\n\n/**\n * Read and canonicalize the ACL for x in aclDoc\n *\n * Accumulate the access rights which each agent or class has\n */\nexport function readACL (\n doc: NamedNode,\n aclDoc: NamedNode,\n kb2: Store = kb,\n getDefaults: boolean = false\n): AgentMapMap {\n const auths: Array<NamedNode> = getDefaults\n ? getDefaultsFallback(kb2, ns)\n : kb2.each(undefined, ns.acl('accessTo'), doc)\n\n const ACL = ns.acl\n const ac = {\n agent: {},\n agentClass: {},\n agentGroup: {},\n origin: {},\n originClass: {}\n }\n Object.keys(ac).forEach(pred => {\n auths.forEach(function (a) {\n (kb2.each(a, ACL('mode')) as Array<NamedNode>).forEach(function (mode) {\n (kb2.each(a, ACL(pred)) as Array<NamedNode>).forEach(function (agent) {\n ac[pred][agent.uri] = ac[pred][agent.uri] || {}\n ac[pred][agent.uri][mode.uri] = a // could be \"true\" but leave pointer just in case\n })\n })\n })\n })\n return ac\n\n function getDefaultsFallback (kb, ns) {\n return kb\n .each(undefined, ns.acl('default'), doc)\n .concat(kb.each(undefined, ns.acl('defaultForNew'), doc))\n }\n}\n\n/**\n * Compare two ACLs\n */\nexport function sameACL (a: AgentMapMap | AgentMapUnion, b: AgentMapMap | AgentMapUnion): boolean {\n const contains = function (a, b) {\n for (const pred in {\n agent: true,\n agentClass: true,\n agentGroup: true,\n origin: true,\n originClass: true\n }) {\n if (a[pred]) {\n for (const agent in a[pred]) {\n for (const mode in a[pred][agent]) {\n if (!b[pred][agent] || !b[pred][agent][mode]) {\n return false\n }\n }\n }\n }\n }\n return true\n }\n return contains(a, b) && contains(b, a)\n}\n\n/**\n * Union N ACLs\n */\nexport function ACLunion (list: Array<AgentMapMap | AgentMapUnion>): AgentMapUnion {\n const b = list[0]\n let a, ag\n for (let k = 1; k < list.length; k++) {\n ;['agent', 'agentClass', 'agentGroup', 'origin', 'originClass'].forEach(\n function (pred) {\n a = list[k]\n if (a[pred]) {\n for (ag in a[pred]) {\n for (const mode in a[pred][ag]) {\n if (!b[pred][ag]) b[pred][ag] = []\n b[pred][ag][mode] = true\n }\n }\n }\n }\n )\n }\n return b as AgentMapUnion\n}\n\ntype loadUnionACLCallback = (ok: boolean, message?: string | NamedNode | AgentMapUnion | AgentMapMap) => void\n\n/**\n * Merge ACLs lists from things to form union\n */\nexport function loadUnionACL (subjectList: Array<NamedNode>, callbackFunction: loadUnionACLCallback): void {\n const aclList: Array<AgentMapMap> = []\n const doList = function (list) {\n if (list.length) {\n const doc = list.shift().doc()\n getACLorDefault(doc, function (\n ok,\n p2,\n targetDoc,\n targetACLDoc,\n defaultHolder,\n defaultACLDoc\n ) {\n const defa = !p2\n if (!ok || !defaultHolder || !defaultACLDoc) return callbackFunction(ok, targetACLDoc)\n const acl = defa\n ? readACL(defaultHolder, defaultACLDoc)\n : readACL(targetDoc as NamedNode, targetACLDoc as NamedNode)\n aclList.push(acl)\n doList(list.slice(1))\n })\n } else {\n // all gone\n callbackFunction(true, ACLunion(aclList))\n }\n }\n doList(subjectList)\n}\n\n/**\n * Represents these as an RDF graph by combination of modes\n *\n * Each agent can only be in one place in this model, one combination of modes.\n * Combos are like full control, read append, read only etc.\n */\nexport function ACLbyCombination (ac: AgentMapMap | AgentMapUnion): ComboList {\n const byCombo = {}\n ;['agent', 'agentClass', 'agentGroup', 'origin', 'originClass'].forEach(function (pred) {\n for (const agent in ac[pred]) {\n const combo: string[] = []\n for (const mode in ac[pred][agent]) {\n combo.push(mode)\n }\n combo.sort()\n const combo2 = combo.join('\\n')\n if (!byCombo[combo2]) byCombo[combo2] = []\n byCombo[combo2].push([pred, agent])\n }\n })\n return byCombo\n}\n\n/**\n * Write ACL graph to store from AC\n */\nexport function makeACLGraph (kb: Store, x: NamedNode, ac: AgentMapMap, aclDoc: NamedNode): void {\n const byCombo = ACLbyCombination(ac)\n return makeACLGraphbyCombo(kb, x, byCombo, aclDoc)\n}\n\n/**\n * Write ACL graph to store from combo\n */\nexport function makeACLGraphbyCombo (\n kb: Store,\n x: NamedNode,\n byCombo: ComboList,\n aclDoc: NamedNode,\n main?: boolean,\n defa?: boolean\n): void {\n const ACL = ns.acl\n for (const combo in byCombo) {\n const pairs = byCombo[combo]\n if (!pairs.length) continue // do not add to store when no agent\n const modeURIs = combo.split('\\n')\n let short = modeURIs\n .map(function (u) {\n return u.split('#')[1]\n })\n .join('')\n if (defa && !main) short += 'Default' // don't muddle authorizations\n const a = kb.sym(aclDoc.uri + '#' + short)\n kb.add(a, ns.rdf('type'), ACL('Authorization'), aclDoc)\n if (main) {\n kb.add(a, ACL('accessTo'), x, aclDoc)\n }\n if (defa) {\n kb.add(a, ACL('default'), x, aclDoc)\n }\n for (let i = 0; i < modeURIs.length; i++) {\n kb.add(a, ACL('mode'), kb.sym(modeURIs[i]), aclDoc)\n }\n for (let i = 0; i < pairs.length; i++) {\n const pred = pairs[i][0]\n const ag = pairs[i][1]\n kb.add(a, ACL(pred), kb.sym(ag), aclDoc)\n }\n }\n}\n\n/**\n * Debugging short strings for dumping ACL\n * and possibly in the UI\n */\nexport function ACLToString (ac: AgentMapMap): string {\n return comboToString(ACLbyCombination(ac))\n}\n\n/**\n * Convert a [[ComboList]] to a string\n */\nexport function comboToString (byCombo: ComboList): string {\n let str = ''\n for (const combo in byCombo) {\n const modeURIs = combo.split('\\n')\n const initials = modeURIs\n .map(function (u) {\n return u.split('#')[1][0]\n })\n .join('')\n str += initials + ':'\n const pairs = byCombo[combo]\n for (let i = 0; i < pairs.length; i++) {\n const pred = pairs[i][0]\n const ag = sym(pairs[i][1])\n str += pred === 'agent' ? '@' : ''\n str += ag.sameTerm(ns.foaf('Agent')) ? '*' : utils.label(ag)\n if (i < pairs.length - 1) str += ','\n }\n str += ';'\n }\n return '{' + str.slice(0, -1) + '}' // drop extra semicolon\n}\n\n/**\n * Write ACL graph as Turtle\n */\nexport function makeACLString (x: NamedNode, ac: AgentMapMap, aclDoc: NamedNode): string {\n const kb2 = graph()\n makeACLGraph(kb2, x, ac, aclDoc)\n return serialize(aclDoc, kb2, aclDoc.uri, 'text/turtle') || ''\n}\n\n/**\n * Write ACL graph to web\n */\nexport function putACLObject (\n kb: LiveStore,\n x: NamedNode,\n ac: AgentMapMap | AgentMapUnion,\n aclDoc: NamedNode,\n callbackFunction: (ok: boolean, message?: string) => void\n): void {\n const byCombo = ACLbyCombination(ac)\n return putACLbyCombo(kb, x, byCombo, aclDoc, callbackFunction)\n}\n\n/**\n * Write ACL graph to web from a [[ComboList]]\n */\nexport function putACLbyCombo (\n kb: LiveStore,\n x: NamedNode,\n byCombo: ComboList,\n aclDoc: NamedNode,\n callbackFunction: (ok: boolean, message?: string) => void\n): void {\n const kb2 = graph()\n makeACLGraphbyCombo(kb2, x, byCombo, aclDoc, true)\n\n // const str = makeACLString = function(x, ac, aclDoc)\n kb.updater?.put(\n aclDoc,\n kb2.statementsMatching(undefined, undefined, undefined, aclDoc),\n 'text/turtle',\n function (uri, ok, message) {\n if (!ok) {\n callbackFunction(ok, message)\n } else {\n kb.fetcher?.unload(aclDoc)\n makeACLGraphbyCombo(kb, x, byCombo, aclDoc, true)\n kb.fetcher!.requested[aclDoc.uri] = 'done' // missing: save headers\n callbackFunction(ok)\n }\n }\n )\n}\n\ntype fixIndividualCardACLCallback = (ok: boolean, message?: string | NamedNode | AgentMapUnion | AgentMapMap) => void\ntype fixIndividualACLCallback = (ok: boolean, message?: string | NamedNode | AgentMapUnion | AgentMapMap) => void\n\n/**\n * Fix the ACl for an individual card as a function of the groups it is in\n *\n * All group files must be loaded first\n */\nexport function fixIndividualCardACL (person: NamedNode, log: Function, callbackFunction: fixIndividualCardACLCallback): void {\n const groups = kb.each(undefined, ns.vcard('hasMember'), person) as NamedNode[]\n // const doc = person.doc()\n if (groups) {\n fixIndividualACL(person, groups, log, callbackFunction)\n } else {\n log('This card is in no groups')\n callbackFunction(true) // fine, no requirements to access. default should be ok\n }\n // @@ if no groups, then use default for People container or the book top container.?\n}\n\n/**\n * This function is used by [[fixIndividualCardACL]]\n */\nexport function fixIndividualACL (item: NamedNode, subjects: Array<NamedNode>, log: Function, callbackFunction: fixIndividualACLCallback): void {\n log = log || debug.log\n const doc = item.doc()\n getACLorDefault(doc, function (\n ok,\n exists,\n targetDoc,\n targetACLDoc,\n defaultHolder,\n defaultACLDoc\n ) {\n if (!ok || !defaultHolder || !defaultACLDoc) return callbackFunction(false, targetACLDoc) // ie message\n const ac = exists\n ? readACL(targetDoc as NamedNode, targetACLDoc as NamedNode)\n : readACL(defaultHolder, defaultACLDoc)\n loadUnionACL(subjects, function (ok, union) {\n if (!ok) return callbackFunction(false, union)\n if (sameACL(union as AgentMapMap | AgentMapUnion, ac)) {\n log('Nice - same ACL. no change ' + utils.label(item) + ' ' + doc)\n } else {\n log('Group ACLs differ for ' + utils.label(item) + ' ' + doc)\n\n // log(\"Group ACLs: \" + makeACLString(targetDoc, union, targetACLDoc))\n // log((exists ? \"Previous set\" : \"Default\") + \" ACLs: \" +\n // makeACLString(targetDoc, ac, targetACLDoc))\n\n putACLObject(\n kb as unknown as LiveStore,\n targetDoc as NamedNode,\n union as AgentMapMap | AgentMapUnion,\n targetACLDoc as NamedNode,\n callbackFunction\n )\n }\n })\n })\n}\n\n/**\n * Set an ACL\n */\nexport function setACL (\n docURI: NamedNode,\n aclText: string,\n callbackFunction: (ok: boolean, message: string) => void\n): void {\n const aclDoc = kb.any(\n docURI,\n ACL_LINK\n ) // @@ check that this get set by web.js\n if (!kb.fetcher) {\n throw new Error('Store has no fetcher')\n }\n if (aclDoc) {\n // Great we already know where it is\n kb.fetcher\n .webOperation('PUT', aclDoc.value, {\n data: aclText,\n contentType: 'text/turtle'\n })\n .then((res) => {\n callbackFunction(res.ok, res.error || '')\n }) // @@@ check params\n } else {\n kb.fetcher.nowOrWhenFetched(docURI, undefined, function (ok, body) {\n if (!ok) return callbackFunction(ok, 'Gettting headers for ACL: ' + body)\n const aclDoc = kb.any(\n docURI,\n ACL_LINK\n ) // @@ check that this get set by web.js\n if (!aclDoc) {\n // complainIfBad(false, \"No Link rel=ACL header for \" + docURI)\n callbackFunction(false, 'No Link rel=ACL header for ' + docURI)\n } else {\n if (!kb.fetcher) {\n throw new Error('Store has no fetcher')\n }\n kb.fetcher\n .webOperation('PUT', aclDoc.value, {\n data: aclText,\n contentType: 'text/turtle'\n })\n .then((res) => {\n callbackFunction(res.ok, res.error || '')\n })\n }\n })\n }\n}\n\n/**\n * Get ACL file or default if necessary\n *\n * @param callbackFunction Will be called in the following ways, in the following cases:\n * * `callbackFunction(true, true, doc, aclDoc)` if the ACL did exist\n * * `callbackFunction(true, false, doc, aclDoc, defaultHolder, defaultACLDoc)` if the ACL file did not exist but a default did\n * * `callbackFunction(false, false, status, message)` when there was an error getting the original\n * * `callbackFunction(false, true, status, message)` when there was an error getting the default\n */\nexport function getACLorDefault (\n doc: NamedNode,\n callbackFunction: (\n a: boolean,\n b: boolean,\n statusOrMessage: number | NamedNode,\n message: string | NamedNode,\n c?: NamedNode,\n d?: NamedNode\n ) => void\n): void {\n getACL(doc, function (ok, status, aclDoc, message): string | void {\n const ACL = ns.acl\n if (!ok) return callbackFunction(false, false, status as number, message as string)\n\n // Recursively search for the ACL file which gives default access\n const tryParent = function (uri) {\n if (uri.slice(-1) === '/') {\n uri = uri.slice(0, -1)\n }\n const right = uri.lastIndexOf('/')\n const left = uri.indexOf('/', uri.indexOf('//') + 2)\n if (left > right) {\n return callbackFunction(false, true, 404, 'Found no ACL resource')\n }\n uri = uri.slice(0, right + 1)\n const doc2 = sym(uri)\n getACL(doc2, function (ok, status, defaultACLDoc: any): NamedNode | void {\n if (!ok) {\n return callbackFunction(\n false,\n true,\n status as number,\n `( No ACL pointer ${uri} ${status})${defaultACLDoc}`\n ) as void\n } else if (status === 403) {\n return callbackFunction(\n false,\n true,\n status,\n `( default ACL file FORBIDDEN. Stop.${uri})`\n )\n } else if (status === 404) {\n return tryParent(uri)\n } else if (status !== 200) {\n return callbackFunction(\n false,\n true,\n status as number,\n `Error status '${status}' searching for default for ${doc2}`\n )\n }\n // 200\n // statusBlock.textContent += (\" ACCESS set at \" + uri + \". End search.\")\n const defaults = kb\n .each(undefined, ACL('default'), kb.sym(uri), defaultACLDoc)\n .concat(\n kb.each(undefined, ACL('defaultForNew'), kb.sym(uri), defaultACLDoc)\n )\n if (!defaults.length) {\n return tryParent(uri) // Keep searching\n }\n const defaultHolder = kb.sym(uri)\n return callbackFunction(\n true,\n false,\n doc,\n aclDoc as NamedNode,\n defaultHolder,\n defaultACLDoc as NamedNode\n )\n })\n } // tryParent\n\n if (!ok) {\n return callbackFunction(\n false,\n false,\n status as number,\n `Error accessing Access Control information for ${doc}) ${message}`\n )\n } else if (status === 404) {\n tryParent(doc.uri) // @@ construct default one - the server should do that\n } else if (status === 403) {\n return callbackFunction(\n false,\n false,\n status,\n `(Sharing not available to you)${message}`\n )\n } else if (status !== 200) {\n return callbackFunction(\n false,\n false,\n status as number,\n `Error ${status} accessing Access Control information for ${doc}: ${message}`\n )\n } else {\n // 200\n return callbackFunction(true, true, doc, aclDoc as NamedNode)\n }\n }) // Call to getACL\n}\n\n/**\n * Calls back `(ok, status, acldoc, message)` as follows\n *\n * * `(false, 900, errormessage)` if no link header\n * * `(true, 403, documentSymbol, fileaccesserror)` if not authorized\n * * `(true, 404, documentSymbol, fileaccesserror)` if does not exist\n * * `(true, 200, documentSymbol)` if file exists and read OK\n */\nexport function getACL (\n doc: NamedNode,\n callbackFunction: (\n ok: boolean,\n messageOrStatus: number | string,\n messageOrDoc?: NamedNode | string,\n message?: string\n ) => void\n): void {\n if (!kb.fetcher) {\n throw new Error('kb has no fetcher')\n }\n kb.fetcher.nowOrWhenFetched(doc, undefined, function (ok, body) {\n if (!ok) {\n return callbackFunction(ok, `Can't get headers to find ACL for ${doc}: ${body}`)\n }\n const aclDoc = kb.any(\n doc,\n ACL_LINK\n ) // @@ check that this get set by web.js\n if (!aclDoc) {\n callbackFunction(false, 900, `No Link rel=ACL header for ${doc}`)\n } else {\n if (!kb.fetcher) {\n throw new Error('kb has no fetcher')\n }\n if (kb.fetcher.nonexistent[aclDoc.value]) {\n return callbackFunction(\n true,\n 404,\n aclDoc as NamedNode,\n `ACL file ${aclDoc} does not exist.`\n )\n }\n kb.fetcher.nowOrWhenFetched(aclDoc as NamedNode, undefined, function (\n ok,\n message,\n response\n ) {\n if (!ok) {\n callbackFunction(\n true,\n response.status,\n aclDoc as NamedNode,\n `Can't read Access Control File ${aclDoc}: ${message}`\n )\n } else {\n callbackFunction(true, 200, aclDoc as NamedNode)\n }\n })\n }\n })\n}\n\n/**\n * Calls [[getACLorDefault]] and then (?)\n */\nexport async function getProspectiveHolder (targetDirectory: string): Promise<NamedNode | undefined> {\n return new Promise((resolve, reject) => getACLorDefault(sym(targetDirectory), (\n ok,\n isDirectACL,\n targetDoc,\n targetACLDoc,\n defaultHolder\n ) => {\n if (ok) {\n return resolve((isDirectACL ? targetDoc : defaultHolder) as NamedNode)\n }\n return reject(new Error(`Error loading ${targetDirectory}`))\n }))\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bookmarks.esm.js","names":["utils.label","ns"],"sources":["../../src/chat/bookmarks.js"],"sourcesContent":["/**\n * Functions related to chat and bookmarks\n * @packageDocumentation\n */\n\nimport * as debug from '../lib/debug'\nimport { icons } from '../lib/iconBase'\nimport { media } from '../media/index'\nimport ns from '../lib/ns'\nimport * as pad from '../lib/pad'\nimport * as $rdf from 'rdflib' // pull in first avoid cross-refs\nimport { style } from '../lib/style'\nimport * as utils from '../utils'\nimport * as widgets from '../widgets'\nimport { store, createTypeIndexLogic, authn } from 'solid-logic'\nimport { findAppInstances } from '../login/login'\n\nconst UI = { icons, ns, media, pad, style, utils, widgets }\n\nconst BOOK = $rdf.Namespace('http://www.w3.org/2002/01/bookmark#')\nconst BOOKMARK_ICON = 'noun_45961.svg'\n\nconst label = utils.label\nconst dom = window.document || null\n\n// @@@@ use the one in rdflib.js when it is avaiable and delete this\nfunction updatePromise (del, ins) {\n return new Promise(function (resolve, reject) {\n store.updater.update(del, ins, function (uri, ok, errorBody) {\n if (!ok) {\n reject(new Error(errorBody))\n } else {\n resolve()\n }\n }) // callback\n }) // promise\n}\n\n/* Bookmarking\n */\n/** Find a user's bookmarks\n */\nexport async function findBookmarkDocument (userContext) {\n const theClass = BOOK('Bookmark')\n const fileTail = 'bookmarks.ttl'\n const isPublic = true\n\n await findAppInstances(userContext, theClass, isPublic) // public -- only look for public links\n\n if (userContext.instances && userContext.instances.length > 0) {\n userContext.bookmarkDocument = userContext.instances[0]\n if (userContext.instances.length > 1) {\n debug.warn('More than one bookmark file! ' + userContext.instances) // @@ todo - deal with > 1\n // Note: should pick up community bookmarks as well\n }\n } else {\n if (userContext.publicProfile) {\n // publicProfile or preferencesFile\n const newBookmarkFile = $rdf.sym(\n userContext.publicProfile.dir().uri + fileTail\n )\n try {\n debug.log('Creating new bookmark file ' + newBookmarkFile)\n await store.fetcher.createIfNotExists(newBookmarkFile)\n } catch (e) {\n debug.warn('Can\\'t make fresh bookmark file:' + e)\n return userContext\n }\n await createTypeIndexLogic.registerInTypeIndex(\n newBookmarkFile,\n userContext.index,\n theClass\n )\n userContext.bookmarkDocument = newBookmarkFile\n } else {\n debug.warn('You seem to have no bookmark file, nor even a profile file!')\n }\n }\n return userContext\n}\n\n/** Add a bookmark\n */\n\nasync function addBookmark (context, target) {\n /* like\n @prefix terms: <http://purl.org/dc/terms/>.\n @prefix bookm: <http://www.w3.org/2002/01/bookmark#>.\n @prefix n0: <http://xmlns.com/foaf/0.1/>.\n <> terms:references <#0.5534145389246576>.\n <#0.5534145389246576>\n a bookm:Bookmark;\n terms:created \"2019-01-26T20:26:44.374Z\"^^XML:dateTime;\n terms:title \"Herons\";\n bookm:recalls wiki:Heron;\n n0:maker c:me.\n */\n let title = ''\n const me = authn.currentUser() // If already logged on\n if (!me) throw new Error('Must be logged on to add Bookmark')\n\n const author = store.any(target, ns.foaf('maker'))\n title =\n label(author) + ': ' + store.anyValue(target, ns.sioc('content')).slice(0, 80) // @@ add chat title too?\n const bookmarkDoc = context.bookmarkDocument\n const bookmark = UI.widgets.newThing(bookmarkDoc, title)\n const ins = [\n $rdf.st(bookmarkDoc, UI.ns.dct('references'), bookmark, bookmarkDoc),\n $rdf.st(bookmark, UI.ns.rdf('type'), BOOK('Bookmark'), bookmarkDoc),\n $rdf.st(bookmark, UI.ns.dct('created'), new Date(), bookmarkDoc),\n $rdf.st(bookmark, BOOK('recalls'), target, bookmarkDoc),\n $rdf.st(bookmark, UI.ns.foaf('maker'), me, bookmarkDoc),\n $rdf.st(bookmark, UI.ns.dct('title'), title, bookmarkDoc)\n ]\n try {\n await updatePromise([], ins) // 20190118A\n } catch (e) {\n const msg = 'Making bookmark: ' + e\n debug.warn(msg)\n return null\n }\n return bookmark\n}\n\nexport async function toggleBookmark (userContext, target, bookmarkButton) {\n await store.fetcher.load(userContext.bookmarkDocument)\n const bookmarks = store.each(\n null,\n BOOK('recalls'),\n target,\n userContext.bookmarkDocument\n )\n if (bookmarks.length) {\n // delete\n if (!confirm('Delete bookmark on this?' + bookmarks.length)) return\n for (let i = 0; i < bookmarks.length; i++) {\n try {\n await updatePromise(store.connectedStatements(bookmarks[i]), [])\n bookmarkButton.style.backgroundColor = 'white'\n debug.log('Bookmark deleted: ' + bookmarks[i])\n } catch (e) {\n debug.error('Cant delete bookmark:' + e)\n debug.warn('Cannot delete bookmark:' + e)\n }\n }\n } else {\n const bookmark = await addBookmark(userContext, target)\n bookmarkButton.style.backgroundColor = 'yellow'\n debug.log('Bookmark added: ' + bookmark)\n }\n}\n\nexport async function renderBookmarksButton (userContext, target) {\n async function setBookmarkButtonColor (bookmarkButton) {\n await store.fetcher.load(userContext.bookmarkDocument)\n const bookmarked = store.any(\n null,\n BOOK('recalls'),\n bookmarkButton.target,\n userContext.bookmarkDocument\n )\n bookmarkButton.style = UI.style.buttonStyle\n if (bookmarked) bookmarkButton.style.backgroundColor = 'yellow'\n }\n\n let bookmarkButton\n if (userContext.bookmarkDocument) {\n bookmarkButton = UI.widgets.button(\n dom,\n UI.icons.iconBase + BOOKMARK_ICON,\n label(BOOK('Bookmark')),\n () => {\n toggleBookmark(userContext, target, bookmarkButton)\n }\n )\n bookmarkButton.target = target\n await setBookmarkButtonColor(bookmarkButton)\n return bookmarkButton\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAiBA,IAAM,IAAK;CAAE;CAAO,IAAA;CAAI;CAAO,KAAA;CAAK;CAAO,OAAA;CAAO,SAAA;AAAQ,GAEpD,IAAO,EAAK,UAAU,qCAAqC,GAC3D,IAAgB,kBAEhB,IAAQA,GACR,IAAM,OAAO,YAAY;AAG/B,SAAS,EAAe,GAAK,GAAK;CAChC,OAAO,IAAI,QAAQ,SAAU,GAAS,GAAQ;EAC5C,EAAM,QAAQ,OAAO,GAAK,GAAK,SAAU,GAAK,GAAI,GAAW;GAC3D,AAAK,IAGH,EAAQ,IAFR,EAAW,MAAM,CAAS,CAAC;EAI/B,CAAC;CACH,CAAC;AACH;AAMA,eAAsB,EAAsB,GAAa;CACvD,IAAM,IAAW,EAAK,UAAU;CAMhC,IAFA,MAAM,EAAiB,GAAa,GAAU,EAAQ,GAElD,EAAY,aAAa,EAAY,UAAU,SAAS,GAE1D,AADA,EAAY,mBAAmB,EAAY,UAAU,IACjD,EAAY,UAAU,SAAS,KACjC,EAAW,kCAAkC,EAAY,SAAS;MAIpE,IAAI,EAAY,eAAe;EAE7B,IAAM,IAAkB,EAAK,IAC3B,EAAY,cAAc,IAAI,CAAC,CAAC,MAAM,eACxC;EACA,IAAI;GAEF,AADA,EAAU,gCAAgC,CAAe,GACzD,MAAM,EAAM,QAAQ,kBAAkB,CAAe;EACvD,SAAS,GAAG;GAEV,OADA,EAAW,oCAAqC,CAAC,GAC1C;EACT;EAMA,AALA,MAAM,EAAqB,oBACzB,GACA,EAAY,OACZ,CACF,GACA,EAAY,mBAAmB;CACjC,OACE,EAAW,6DAA6D;CAG5E,OAAO;AACT;AAKA,eAAe,EAAa,GAAS,GAAQ;CAa3C,IAAI,IAAQ,IACN,IAAK,EAAM,YAAY;CAC7B,IAAI,CAAC,GAAI,MAAU,MAAM,mCAAmC;CAG5D,IACE,EAFa,EAAM,IAAI,GAAQC,EAAG,KAAK,OAAO,CAExC,CAAM,IAAI,OAAO,EAAM,SAAS,GAAQA,EAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE;CAC/E,IAAM,IAAc,EAAQ,kBACtB,IAAW,EAAG,QAAQ,SAAS,GAAa,CAAK,GACjD,IAAM;EACV,EAAK,GAAG,GAAa,EAAG,GAAG,IAAI,YAAY,GAAG,GAAU,CAAW;EACnE,EAAK,GAAG,GAAU,EAAG,GAAG,IAAI,MAAM,GAAG,EAAK,UAAU,GAAG,CAAW;EAClE,EAAK,GAAG,GAAU,EAAG,GAAG,IAAI,SAAS,mBAAG,IAAI,KAAK,GAAG,CAAW;EAC/D,EAAK,GAAG,GAAU,EAAK,SAAS,GAAG,GAAQ,CAAW;EACtD,EAAK,GAAG,GAAU,EAAG,GAAG,KAAK,OAAO,GAAG,GAAI,CAAW;EACtD,EAAK,GAAG,GAAU,EAAG,GAAG,IAAI,OAAO,GAAG,GAAO,CAAW;CAC1D;CACA,IAAI;EACF,MAAM,EAAc,CAAC,GAAG,CAAG;CAC7B,SAAS,GAAG;
|
|
1
|
+
{"version":3,"file":"bookmarks.esm.js","names":["utils.label","ns"],"sources":["../../src/chat/bookmarks.js"],"sourcesContent":["/**\n * Functions related to chat and bookmarks\n * @packageDocumentation\n */\n\nimport * as debug from '../lib/debug'\nimport { icons } from '../lib/iconBase'\nimport { media } from '../media/index'\nimport ns from '../lib/ns'\nimport * as pad from '../lib/pad'\nimport * as $rdf from 'rdflib' // pull in first avoid cross-refs\nimport { style } from '../lib/style'\nimport * as utils from '../utils'\nimport * as widgets from '../widgets'\nimport { store, createTypeIndexLogic, authn } from 'solid-logic'\nimport { findAppInstances } from '../login/login'\n\nconst UI = { icons, ns, media, pad, style, utils, widgets }\n\nconst BOOK = $rdf.Namespace('http://www.w3.org/2002/01/bookmark#')\nconst BOOKMARK_ICON = 'noun_45961.svg'\n\nconst label = utils.label\nconst dom = window.document || null\n\n// @@@@ use the one in rdflib.js when it is avaiable and delete this\nfunction updatePromise (del, ins) {\n return new Promise(function (resolve, reject) {\n store.updater.update(del, ins, function (uri, ok, errorBody) {\n if (!ok) {\n reject(new Error(errorBody))\n } else {\n resolve()\n }\n }) // callback\n }) // promise\n}\n\n/* Bookmarking\n */\n/** Find a user's bookmarks\n */\nexport async function findBookmarkDocument (userContext) {\n const theClass = BOOK('Bookmark')\n const fileTail = 'bookmarks.ttl'\n const isPublic = true\n\n await findAppInstances(userContext, theClass, isPublic) // public -- only look for public links\n\n if (userContext.instances && userContext.instances.length > 0) {\n userContext.bookmarkDocument = userContext.instances[0]\n if (userContext.instances.length > 1) {\n debug.warn('More than one bookmark file! ' + userContext.instances) // @@ todo - deal with > 1\n // Note: should pick up community bookmarks as well\n }\n } else {\n if (userContext.publicProfile) {\n // publicProfile or preferencesFile\n const newBookmarkFile = $rdf.sym(\n userContext.publicProfile.dir().uri + fileTail\n )\n try {\n debug.log('Creating new bookmark file ' + newBookmarkFile)\n await store.fetcher.createIfNotExists(newBookmarkFile)\n } catch (e) {\n debug.warn('Can\\'t make fresh bookmark file:' + e)\n return userContext\n }\n await createTypeIndexLogic.registerInTypeIndex(\n newBookmarkFile,\n userContext.index,\n theClass\n )\n userContext.bookmarkDocument = newBookmarkFile\n } else {\n debug.warn('You seem to have no bookmark file, nor even a profile file!')\n }\n }\n return userContext\n}\n\n/** Add a bookmark\n */\n\nasync function addBookmark (context, target) {\n /* like\n @prefix terms: <http://purl.org/dc/terms/>.\n @prefix bookm: <http://www.w3.org/2002/01/bookmark#>.\n @prefix n0: <http://xmlns.com/foaf/0.1/>.\n <> terms:references <#0.5534145389246576>.\n <#0.5534145389246576>\n a bookm:Bookmark;\n terms:created \"2019-01-26T20:26:44.374Z\"^^XML:dateTime;\n terms:title \"Herons\";\n bookm:recalls wiki:Heron;\n n0:maker c:me.\n */\n let title = ''\n const me = authn.currentUser() // If already logged on\n if (!me) throw new Error('Must be logged on to add Bookmark')\n\n const author = store.any(target, ns.foaf('maker'))\n title =\n label(author) + ': ' + store.anyValue(target, ns.sioc('content')).slice(0, 80) // @@ add chat title too?\n const bookmarkDoc = context.bookmarkDocument\n const bookmark = UI.widgets.newThing(bookmarkDoc, title)\n const ins = [\n $rdf.st(bookmarkDoc, UI.ns.dct('references'), bookmark, bookmarkDoc),\n $rdf.st(bookmark, UI.ns.rdf('type'), BOOK('Bookmark'), bookmarkDoc),\n $rdf.st(bookmark, UI.ns.dct('created'), new Date(), bookmarkDoc),\n $rdf.st(bookmark, BOOK('recalls'), target, bookmarkDoc),\n $rdf.st(bookmark, UI.ns.foaf('maker'), me, bookmarkDoc),\n $rdf.st(bookmark, UI.ns.dct('title'), title, bookmarkDoc)\n ]\n try {\n await updatePromise([], ins) // 20190118A\n } catch (e) {\n const msg = 'Making bookmark: ' + e\n debug.warn(msg)\n return null\n }\n return bookmark\n}\n\nexport async function toggleBookmark (userContext, target, bookmarkButton) {\n await store.fetcher.load(userContext.bookmarkDocument)\n const bookmarks = store.each(\n null,\n BOOK('recalls'),\n target,\n userContext.bookmarkDocument\n )\n if (bookmarks.length) {\n // delete\n if (!confirm('Delete bookmark on this?' + bookmarks.length)) return\n for (let i = 0; i < bookmarks.length; i++) {\n try {\n await updatePromise(store.connectedStatements(bookmarks[i]), [])\n bookmarkButton.style.backgroundColor = 'white'\n debug.log('Bookmark deleted: ' + bookmarks[i])\n } catch (e) {\n debug.error('Cant delete bookmark:' + e)\n debug.warn('Cannot delete bookmark:' + e)\n }\n }\n } else {\n const bookmark = await addBookmark(userContext, target)\n bookmarkButton.style.backgroundColor = 'yellow'\n debug.log('Bookmark added: ' + bookmark)\n }\n}\n\nexport async function renderBookmarksButton (userContext, target) {\n async function setBookmarkButtonColor (bookmarkButton) {\n await store.fetcher.load(userContext.bookmarkDocument)\n const bookmarked = store.any(\n null,\n BOOK('recalls'),\n bookmarkButton.target,\n userContext.bookmarkDocument\n )\n bookmarkButton.style = UI.style.buttonStyle\n if (bookmarked) bookmarkButton.style.backgroundColor = 'yellow'\n }\n\n let bookmarkButton\n if (userContext.bookmarkDocument) {\n bookmarkButton = UI.widgets.button(\n dom,\n UI.icons.iconBase + BOOKMARK_ICON,\n label(BOOK('Bookmark')),\n () => {\n toggleBookmark(userContext, target, bookmarkButton)\n }\n )\n bookmarkButton.target = target\n await setBookmarkButtonColor(bookmarkButton)\n return bookmarkButton\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
const e=require("../_virtual/_rolldown/runtime.cjs.js"),t=require("../lib/ns.cjs.js");require("../utils/index.cjs.js");const n=require("../lib/debug.cjs.js"),r=require("./dateFolder.cjs.js"),i=require("./signature.cjs.js"),a=require("./keys.cjs.js");let o=require("rdflib");o=e.__toESM(o);let s=require("solid-logic");var c=class{constructor(e,t){this.channel=e,this.channelRoot=e.doc(),this.options=t,this.dateFolder=new r.DateFolder(this.channelRoot,`chat.ttl`),this.div=null}async createMessage(e){return this.updateMessage(e)}async updateMessage(e,r=null,c,l=null){let u=[],f=new Date,p=``+f.getTime(),m=o.term(f),h=r?r.doc():this.dateFolder.leafDocumentFromDate(f),g=s.store.sym(h.uri+`#Msg`+p),_=s.authn.currentUser(),v=i.getBlankMsg();if(v.id=g.uri,r){let e=s.store.any(r,t.default.foaf(`maker`));if(e.uri===_.uri){let e=await d(r);u.push(o.st(e,t.default.dct(`isReplacedBy`),g,h));let n=s.store.any(e,t.default.sioc(`has_reply`));n&&u.push(o.st(g,t.default.sioc(`has_reply`),n,h)),c&&u.push(o.st(g,t.default.schema(`dateDeleted`),m,h))}else{let t=`Error you cannot delete/edit a message from someone else :
|
|
2
|
-
`+e.uri;throw n.warn(t),alert(t),Error(t)}}else u.push(o.st(this.channel,t.default.wf(`message`),g,h));if(u.push(o.st(g,t.default.sioc(`content`),s.store.literal(e),h)),v.content=e,u.push(o.st(g,t.default.dct(`created`),m,h)),v.created=m.value,_){u.push(o.st(g,t.default.foaf(`maker`),_,h)),v.maker=_.uri;let e=
|
|
2
|
+
`+e.uri;throw n.warn(t),alert(t),Error(t)}}else u.push(o.st(this.channel,t.default.wf(`message`),g,h));if(u.push(o.st(g,t.default.sioc(`content`),s.store.literal(e),h)),v.content=e,u.push(o.st(g,t.default.dct(`created`),m,h)),v.created=m.value,_){u.push(o.st(g,t.default.foaf(`maker`),_,h)),v.maker=_.uri;let e=await a.getPrivateKey(_),n=i.signMsg(v,e);u.push(o.st(g,o.sym(`${i.SEC}proofValue`),o.lit(n),h))}l&&(u.push(o.st(l,t.default.sioc(`has_member`),g,h)),l.doc().sameTerm(g.doc())||u.push(o.st(l,t.default.sioc(`has_member`),g,l.doc())));try{await s.store.updater.updateMany([],u)}catch(e){let t=`Error saving chat message: `+e;throw n.warn(t),alert(t),Error(t)}return g}async deleteMessage(e){return this.updateMessage(`(message deleted)`,e,!0)}async createThread(e){let n=s.store.each(e,t.default.sioc(`has_reply`),null,e.doc()).filter(e=>s.store.holds(e,t.default.rdf(`type`),t.default.sioc(`Thread`),e.doc()));if(n.length>0)return n[0];let r=o.sym(e.uri+`-thread`),i=[o.st(r,t.default.rdf(`type`),t.default.sioc(`Thread`),r.doc()),o.st(e,t.default.sioc(`has_reply`),r,r.doc())];return await s.store.updater.update([],i),r}};async function l(e){let n=[e],r={};r[e.uri]=!0;let i=e;for(;;){let e=s.store.any(null,t.default.dct(`isReplacedBy`),i,i.doc());if(!e||r[e.uri])break;await s.store.fetcher.load(e),n.unshift(e),r[e.uri]=!0,i=e}for(i=e;;){let e=s.store.any(i,t.default.dct(`isReplacedBy`),null,i.doc());if(!e||r[e.uri])break;n.push(e),r[e.uri]=!0,i=e}return n}async function u(e){let r=e,i={};for(;r;){if(i[r.uri])return n.error(`originalVersion: verion loop`+e),e;i[r.uri]=!0,e=r,await s.store.fetcher.load(e),r=s.store.any(null,t.default.dct(`isReplacedBy`),e,e.doc())}return e}async function d(e){let r=e,i={};for(;r;){if(i[r.uri])return n.error(`mostRecentVersion: verion loop`+e),e;i[r.uri]=!0,e=r,await s.store.fetcher.load(e),r=s.store.any(e,t.default.dct(`isReplacedBy`),null,e.doc())}return e}function f(e){return s.store.holds(e,t.default.schema(`dateDeleted`),null,e.doc())}exports.ChatChannel=c,exports.allVersions=l,exports.isDeleted=f,exports.mostRecentVersion=d,exports.originalVersion=u;
|
|
3
3
|
//# sourceMappingURL=chatLogic.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatLogic.cjs.js","names":["DateFolder","$rdf","store","authn","getBlankMsg","ns","signMsg","getPrivateKey","SEC"],"sources":["../../src/chat/chatLogic.js"],"sourcesContent":["/**\n * Contains the [[ChatChannel]] class and logic for Solid Chat\n * @packageDocumentation\n */\n\nimport * as debug from '../lib/debug'\nimport { DateFolder } from './dateFolder'\nimport { store, authn } from 'solid-logic'\nimport ns from '../lib/ns'\nimport * as $rdf from 'rdflib' // pull in first avoid cross-refs\nimport * as utils from '../utils'\nimport { getBlankMsg, signMsg, SEC } from './signature'\nimport { getPrivateKey } from './keys'\n\n/* The Solid logic for a 'LongChat'\n*/\n/**\n * Common code for a chat (discussion area of messages about something)\n * This version runs over a series of files for different time periods\n *\n * Parameters for the whole chat like its title are stored on\n * index.ttl#this and the chats messages are stored in YYYY/MM/DD/chat.ttl\n *\n */\n\nexport class ChatChannel {\n constructor (channel, options) {\n this.channel = channel\n this.channelRoot = channel.doc()\n this.options = options\n this.dateFolder = new DateFolder(this.channelRoot, 'chat.ttl')\n this.div = null // : HTMLElement\n }\n\n /* Store a new message in the web,\n */\n async createMessage (text) {\n return this.updateMessage(text)\n }\n\n /* Store a new message in the web,\n as a replacement for an existing one.\n The old one iis left, and the two are linked\n */\n async updateMessage (text, oldMsg = null, deleteIt, thread = null) {\n const sts = []\n const now = new Date()\n const timestamp = '' + now.getTime()\n const dateStamp = $rdf.term(now)\n const chatDocument = oldMsg ? oldMsg.doc() : this.dateFolder.leafDocumentFromDate(now)\n const message = store.sym(chatDocument.uri + '#' + 'Msg' + timestamp)\n // const content = store.literal(text)\n\n const me = authn.currentUser() // If already logged on\n\n const msg = getBlankMsg()\n msg.id = message.uri\n if (oldMsg) { // edit message replaces old one\n const oldMsgMaker = store.any(oldMsg, ns.foaf('maker')) // may not be needed here, but needed on READ\n if (oldMsgMaker.uri === me.uri) {\n const oldMsgMostRecentVersion = await mostRecentVersion(oldMsg)\n sts.push($rdf.st(oldMsgMostRecentVersion, ns.dct('isReplacedBy'), message, chatDocument))\n // if oldMsg has_reply => add has_reply to message\n const oldMsgThread = store.any(oldMsgMostRecentVersion, ns.sioc('has_reply'))\n if (oldMsgThread) {\n sts.push($rdf.st(message, ns.sioc('has_reply'), oldMsgThread, chatDocument))\n }\n if (deleteIt) { // we need to add a specific signature, else anyone can delete a msg ?\n sts.push($rdf.st(message, ns.schema('dateDeleted'), dateStamp, chatDocument))\n }\n } else {\n const errMsg = 'Error you cannot delete/edit a message from someone else : \\n' + oldMsgMaker.uri\n debug.warn(errMsg)\n alert(errMsg)\n throw new Error(errMsg)\n }\n } else { // link new message to channel\n sts.push($rdf.st(this.channel, ns.wf('message'), message, chatDocument))\n }\n sts.push(\n $rdf.st(message, ns.sioc('content'), store.literal(text), chatDocument)\n )\n msg.content = text\n\n sts.push(\n $rdf.st(message, ns.dct('created'), dateStamp, chatDocument)\n )\n msg.created = dateStamp.value\n if (me) {\n sts.push($rdf.st(message, ns.foaf('maker'), me, chatDocument))\n msg.maker = me.uri\n // privateKey the cached private key of me, cached in store\n const privateKey = await getPrivateKey(me) // me.uri)\n\n const sig = signMsg(msg, privateKey)\n sts.push($rdf.st(message, $rdf.sym(`${SEC}proofValue`), $rdf.lit(sig), chatDocument))\n }\n if (thread) {\n sts.push($rdf.st(thread, ns.sioc('has_member'), message, chatDocument))\n if (!thread.doc().sameTerm(message.doc())) {\n sts.push($rdf.st(thread, ns.sioc('has_member'), message, thread.doc()))\n }\n }\n\n try {\n await store.updater.updateMany([], sts)\n } catch (err) {\n const errMsg = 'Error saving chat message: ' + err\n debug.warn(errMsg)\n alert(errMsg)\n throw new Error(errMsg)\n }\n return message\n }\n\n /* Mark a message as deleted\n * Wee add a new version of the message,m witha deletion flag (deletion date)\n * so that the deletion can be revoked by adding another non-deleted update\n */\n async deleteMessage (message) {\n return this.updateMessage('(message deleted)', message, true)\n }\n\n // Create a new thread of replies to the thread root message\n // or return one which already exists\n\n async createThread (threadRoot) {\n const already = store.each(threadRoot, ns.sioc('has_reply'), null, threadRoot.doc())\n .filter(thread => store.holds(thread, ns.rdf('type'), ns.sioc('Thread'), thread.doc()))\n if (already.length > 0) return already[0]\n\n const thread = $rdf.sym(threadRoot.uri + '-thread')\n const insert = [\n $rdf.st(thread, ns.rdf('type'), ns.sioc('Thread'), thread.doc()),\n $rdf.st(threadRoot, ns.sioc('has_reply'), thread, thread.doc())\n ]\n await store.updater.update([], insert)\n return thread\n }\n} // class ChatChannel\n\n// ////////// Utility functions\n\n// Have to not loop forever if fed loops\nexport async function allVersions (message) {\n const versions = [message]\n const done = {}\n done[message.uri] = true\n let m = message\n while (true) { // earlier?\n const prev = store.any(null, ns.dct('isReplacedBy'), m, m.doc())\n if (!prev || done[prev.uri]) break\n await store.fetcher.load(prev)\n versions.unshift(prev)\n done[prev.uri] = true\n m = prev\n }\n m = message\n while (true) { // later?\n const next = store.any(m, ns.dct('isReplacedBy'), null, m.doc())\n if (!next || done[next.uri]) break\n versions.push(next)\n done[next.uri] = true\n m = next\n }\n return versions\n}\n\nexport async function originalVersion (message) {\n let msg = message\n const done = {}\n // done[message.uri] = true\n while (msg) {\n if (done[msg.uri]) {\n debug.error('originalVersion: verion loop' + message)\n return message\n }\n done[msg.uri] = true\n message = msg\n await store.fetcher.load(message)\n msg = store.any(null, ns.dct('isReplacedBy'), message, message.doc())\n }\n return message\n}\n\nexport async function mostRecentVersion (message) {\n let msg = message\n const done = {}\n while (msg) {\n if (done[msg.uri]) {\n debug.error('mostRecentVersion: verion loop' + message)\n return message\n }\n done[msg.uri] = true\n message = msg\n await store.fetcher.load(message)\n msg = store.any(message, ns.dct('isReplacedBy'), null, message.doc())\n }\n return message\n}\n\nexport function isDeleted (message) {\n return store.holds(message, ns.schema('dateDeleted'), null, message.doc())\n}\n\nexport function isReplaced (message) {\n return store.holds(message, ns.dct('isReplacedBy'), null, message.doc())\n}\n\nexport function isHidden (message) {\n return this.isDeleted(message) || this.isReplaced(message)\n}\n\n// A Nickname for a person\n\nexport function nick (person) {\n const s = store.any(person, ns.foaf('nick'))\n if (s) return '' + s.value\n return '' + utils.label(person)\n}\n// ends\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chatLogic.cjs.js","names":["DateFolder","$rdf","store","authn","getBlankMsg","ns","getPrivateKey","signMsg","SEC"],"sources":["../../src/chat/chatLogic.js"],"sourcesContent":["/**\n * Contains the [[ChatChannel]] class and logic for Solid Chat\n * @packageDocumentation\n */\n\nimport * as debug from '../lib/debug'\nimport { DateFolder } from './dateFolder'\nimport { store, authn } from 'solid-logic'\nimport ns from '../lib/ns'\nimport * as $rdf from 'rdflib' // pull in first avoid cross-refs\nimport * as utils from '../utils'\nimport { getBlankMsg, signMsg, SEC } from './signature'\nimport { getPrivateKey } from './keys'\n\n/* The Solid logic for a 'LongChat'\n*/\n/**\n * Common code for a chat (discussion area of messages about something)\n * This version runs over a series of files for different time periods\n *\n * Parameters for the whole chat like its title are stored on\n * index.ttl#this and the chats messages are stored in YYYY/MM/DD/chat.ttl\n *\n */\n\nexport class ChatChannel {\n constructor (channel, options) {\n this.channel = channel\n this.channelRoot = channel.doc()\n this.options = options\n this.dateFolder = new DateFolder(this.channelRoot, 'chat.ttl')\n this.div = null // : HTMLElement\n }\n\n /* Store a new message in the web,\n */\n async createMessage (text) {\n return this.updateMessage(text)\n }\n\n /* Store a new message in the web,\n as a replacement for an existing one.\n The old one iis left, and the two are linked\n */\n async updateMessage (text, oldMsg = null, deleteIt, thread = null) {\n const sts = []\n const now = new Date()\n const timestamp = '' + now.getTime()\n const dateStamp = $rdf.term(now)\n const chatDocument = oldMsg ? oldMsg.doc() : this.dateFolder.leafDocumentFromDate(now)\n const message = store.sym(chatDocument.uri + '#' + 'Msg' + timestamp)\n // const content = store.literal(text)\n\n const me = authn.currentUser() // If already logged on\n\n const msg = getBlankMsg()\n msg.id = message.uri\n if (oldMsg) { // edit message replaces old one\n const oldMsgMaker = store.any(oldMsg, ns.foaf('maker')) // may not be needed here, but needed on READ\n if (oldMsgMaker.uri === me.uri) {\n const oldMsgMostRecentVersion = await mostRecentVersion(oldMsg)\n sts.push($rdf.st(oldMsgMostRecentVersion, ns.dct('isReplacedBy'), message, chatDocument))\n // if oldMsg has_reply => add has_reply to message\n const oldMsgThread = store.any(oldMsgMostRecentVersion, ns.sioc('has_reply'))\n if (oldMsgThread) {\n sts.push($rdf.st(message, ns.sioc('has_reply'), oldMsgThread, chatDocument))\n }\n if (deleteIt) { // we need to add a specific signature, else anyone can delete a msg ?\n sts.push($rdf.st(message, ns.schema('dateDeleted'), dateStamp, chatDocument))\n }\n } else {\n const errMsg = 'Error you cannot delete/edit a message from someone else : \\n' + oldMsgMaker.uri\n debug.warn(errMsg)\n alert(errMsg)\n throw new Error(errMsg)\n }\n } else { // link new message to channel\n sts.push($rdf.st(this.channel, ns.wf('message'), message, chatDocument))\n }\n sts.push(\n $rdf.st(message, ns.sioc('content'), store.literal(text), chatDocument)\n )\n msg.content = text\n\n sts.push(\n $rdf.st(message, ns.dct('created'), dateStamp, chatDocument)\n )\n msg.created = dateStamp.value\n if (me) {\n sts.push($rdf.st(message, ns.foaf('maker'), me, chatDocument))\n msg.maker = me.uri\n // privateKey the cached private key of me, cached in store\n const privateKey = await getPrivateKey(me) // me.uri)\n\n const sig = signMsg(msg, privateKey)\n sts.push($rdf.st(message, $rdf.sym(`${SEC}proofValue`), $rdf.lit(sig), chatDocument))\n }\n if (thread) {\n sts.push($rdf.st(thread, ns.sioc('has_member'), message, chatDocument))\n if (!thread.doc().sameTerm(message.doc())) {\n sts.push($rdf.st(thread, ns.sioc('has_member'), message, thread.doc()))\n }\n }\n\n try {\n await store.updater.updateMany([], sts)\n } catch (err) {\n const errMsg = 'Error saving chat message: ' + err\n debug.warn(errMsg)\n alert(errMsg)\n throw new Error(errMsg)\n }\n return message\n }\n\n /* Mark a message as deleted\n * Wee add a new version of the message,m witha deletion flag (deletion date)\n * so that the deletion can be revoked by adding another non-deleted update\n */\n async deleteMessage (message) {\n return this.updateMessage('(message deleted)', message, true)\n }\n\n // Create a new thread of replies to the thread root message\n // or return one which already exists\n\n async createThread (threadRoot) {\n const already = store.each(threadRoot, ns.sioc('has_reply'), null, threadRoot.doc())\n .filter(thread => store.holds(thread, ns.rdf('type'), ns.sioc('Thread'), thread.doc()))\n if (already.length > 0) return already[0]\n\n const thread = $rdf.sym(threadRoot.uri + '-thread')\n const insert = [\n $rdf.st(thread, ns.rdf('type'), ns.sioc('Thread'), thread.doc()),\n $rdf.st(threadRoot, ns.sioc('has_reply'), thread, thread.doc())\n ]\n await store.updater.update([], insert)\n return thread\n }\n} // class ChatChannel\n\n// ////////// Utility functions\n\n// Have to not loop forever if fed loops\nexport async function allVersions (message) {\n const versions = [message]\n const done = {}\n done[message.uri] = true\n let m = message\n while (true) { // earlier?\n const prev = store.any(null, ns.dct('isReplacedBy'), m, m.doc())\n if (!prev || done[prev.uri]) break\n await store.fetcher.load(prev)\n versions.unshift(prev)\n done[prev.uri] = true\n m = prev\n }\n m = message\n while (true) { // later?\n const next = store.any(m, ns.dct('isReplacedBy'), null, m.doc())\n if (!next || done[next.uri]) break\n versions.push(next)\n done[next.uri] = true\n m = next\n }\n return versions\n}\n\nexport async function originalVersion (message) {\n let msg = message\n const done = {}\n // done[message.uri] = true\n while (msg) {\n if (done[msg.uri]) {\n debug.error('originalVersion: verion loop' + message)\n return message\n }\n done[msg.uri] = true\n message = msg\n await store.fetcher.load(message)\n msg = store.any(null, ns.dct('isReplacedBy'), message, message.doc())\n }\n return message\n}\n\nexport async function mostRecentVersion (message) {\n let msg = message\n const done = {}\n while (msg) {\n if (done[msg.uri]) {\n debug.error('mostRecentVersion: verion loop' + message)\n return message\n }\n done[msg.uri] = true\n message = msg\n await store.fetcher.load(message)\n msg = store.any(message, ns.dct('isReplacedBy'), null, message.doc())\n }\n return message\n}\n\nexport function isDeleted (message) {\n return store.holds(message, ns.schema('dateDeleted'), null, message.doc())\n}\n\nexport function isReplaced (message) {\n return store.holds(message, ns.dct('isReplacedBy'), null, message.doc())\n}\n\nexport function isHidden (message) {\n return this.isDeleted(message) || this.isReplaced(message)\n}\n\n// A Nickname for a person\n\nexport function nick (person) {\n const s = store.any(person, ns.foaf('nick'))\n if (s) return '' + s.value\n return '' + utils.label(person)\n}\n// ends\n"],"mappings":"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"}
|
|
@@ -30,8 +30,8 @@ var d = class {
|
|
|
30
30
|
} else p.push(c.st(this.channel, e.wf("message"), y, v));
|
|
31
31
|
if (p.push(c.st(y, e.sioc("content"), u.literal(t), v)), x.content = t, p.push(c.st(y, e.dct("created"), _, v)), x.created = _.value, b) {
|
|
32
32
|
p.push(c.st(y, e.foaf("maker"), b, v)), x.maker = b.uri;
|
|
33
|
-
let t =
|
|
34
|
-
p.push(c.st(y, c.sym(`${i}proofValue`), c.lit(
|
|
33
|
+
let t = await s(b), n = o(x, t);
|
|
34
|
+
p.push(c.st(y, c.sym(`${i}proofValue`), c.lit(n), v));
|
|
35
35
|
}
|
|
36
36
|
f && (p.push(c.st(f, e.sioc("has_member"), y, v)), f.doc().sameTerm(y.doc()) || p.push(c.st(f, e.sioc("has_member"), y, f.doc())));
|
|
37
37
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatLogic.esm.js","names":["ns"],"sources":["../../src/chat/chatLogic.js"],"sourcesContent":["/**\n * Contains the [[ChatChannel]] class and logic for Solid Chat\n * @packageDocumentation\n */\n\nimport * as debug from '../lib/debug'\nimport { DateFolder } from './dateFolder'\nimport { store, authn } from 'solid-logic'\nimport ns from '../lib/ns'\nimport * as $rdf from 'rdflib' // pull in first avoid cross-refs\nimport * as utils from '../utils'\nimport { getBlankMsg, signMsg, SEC } from './signature'\nimport { getPrivateKey } from './keys'\n\n/* The Solid logic for a 'LongChat'\n*/\n/**\n * Common code for a chat (discussion area of messages about something)\n * This version runs over a series of files for different time periods\n *\n * Parameters for the whole chat like its title are stored on\n * index.ttl#this and the chats messages are stored in YYYY/MM/DD/chat.ttl\n *\n */\n\nexport class ChatChannel {\n constructor (channel, options) {\n this.channel = channel\n this.channelRoot = channel.doc()\n this.options = options\n this.dateFolder = new DateFolder(this.channelRoot, 'chat.ttl')\n this.div = null // : HTMLElement\n }\n\n /* Store a new message in the web,\n */\n async createMessage (text) {\n return this.updateMessage(text)\n }\n\n /* Store a new message in the web,\n as a replacement for an existing one.\n The old one iis left, and the two are linked\n */\n async updateMessage (text, oldMsg = null, deleteIt, thread = null) {\n const sts = []\n const now = new Date()\n const timestamp = '' + now.getTime()\n const dateStamp = $rdf.term(now)\n const chatDocument = oldMsg ? oldMsg.doc() : this.dateFolder.leafDocumentFromDate(now)\n const message = store.sym(chatDocument.uri + '#' + 'Msg' + timestamp)\n // const content = store.literal(text)\n\n const me = authn.currentUser() // If already logged on\n\n const msg = getBlankMsg()\n msg.id = message.uri\n if (oldMsg) { // edit message replaces old one\n const oldMsgMaker = store.any(oldMsg, ns.foaf('maker')) // may not be needed here, but needed on READ\n if (oldMsgMaker.uri === me.uri) {\n const oldMsgMostRecentVersion = await mostRecentVersion(oldMsg)\n sts.push($rdf.st(oldMsgMostRecentVersion, ns.dct('isReplacedBy'), message, chatDocument))\n // if oldMsg has_reply => add has_reply to message\n const oldMsgThread = store.any(oldMsgMostRecentVersion, ns.sioc('has_reply'))\n if (oldMsgThread) {\n sts.push($rdf.st(message, ns.sioc('has_reply'), oldMsgThread, chatDocument))\n }\n if (deleteIt) { // we need to add a specific signature, else anyone can delete a msg ?\n sts.push($rdf.st(message, ns.schema('dateDeleted'), dateStamp, chatDocument))\n }\n } else {\n const errMsg = 'Error you cannot delete/edit a message from someone else : \\n' + oldMsgMaker.uri\n debug.warn(errMsg)\n alert(errMsg)\n throw new Error(errMsg)\n }\n } else { // link new message to channel\n sts.push($rdf.st(this.channel, ns.wf('message'), message, chatDocument))\n }\n sts.push(\n $rdf.st(message, ns.sioc('content'), store.literal(text), chatDocument)\n )\n msg.content = text\n\n sts.push(\n $rdf.st(message, ns.dct('created'), dateStamp, chatDocument)\n )\n msg.created = dateStamp.value\n if (me) {\n sts.push($rdf.st(message, ns.foaf('maker'), me, chatDocument))\n msg.maker = me.uri\n // privateKey the cached private key of me, cached in store\n const privateKey = await getPrivateKey(me) // me.uri)\n\n const sig = signMsg(msg, privateKey)\n sts.push($rdf.st(message, $rdf.sym(`${SEC}proofValue`), $rdf.lit(sig), chatDocument))\n }\n if (thread) {\n sts.push($rdf.st(thread, ns.sioc('has_member'), message, chatDocument))\n if (!thread.doc().sameTerm(message.doc())) {\n sts.push($rdf.st(thread, ns.sioc('has_member'), message, thread.doc()))\n }\n }\n\n try {\n await store.updater.updateMany([], sts)\n } catch (err) {\n const errMsg = 'Error saving chat message: ' + err\n debug.warn(errMsg)\n alert(errMsg)\n throw new Error(errMsg)\n }\n return message\n }\n\n /* Mark a message as deleted\n * Wee add a new version of the message,m witha deletion flag (deletion date)\n * so that the deletion can be revoked by adding another non-deleted update\n */\n async deleteMessage (message) {\n return this.updateMessage('(message deleted)', message, true)\n }\n\n // Create a new thread of replies to the thread root message\n // or return one which already exists\n\n async createThread (threadRoot) {\n const already = store.each(threadRoot, ns.sioc('has_reply'), null, threadRoot.doc())\n .filter(thread => store.holds(thread, ns.rdf('type'), ns.sioc('Thread'), thread.doc()))\n if (already.length > 0) return already[0]\n\n const thread = $rdf.sym(threadRoot.uri + '-thread')\n const insert = [\n $rdf.st(thread, ns.rdf('type'), ns.sioc('Thread'), thread.doc()),\n $rdf.st(threadRoot, ns.sioc('has_reply'), thread, thread.doc())\n ]\n await store.updater.update([], insert)\n return thread\n }\n} // class ChatChannel\n\n// ////////// Utility functions\n\n// Have to not loop forever if fed loops\nexport async function allVersions (message) {\n const versions = [message]\n const done = {}\n done[message.uri] = true\n let m = message\n while (true) { // earlier?\n const prev = store.any(null, ns.dct('isReplacedBy'), m, m.doc())\n if (!prev || done[prev.uri]) break\n await store.fetcher.load(prev)\n versions.unshift(prev)\n done[prev.uri] = true\n m = prev\n }\n m = message\n while (true) { // later?\n const next = store.any(m, ns.dct('isReplacedBy'), null, m.doc())\n if (!next || done[next.uri]) break\n versions.push(next)\n done[next.uri] = true\n m = next\n }\n return versions\n}\n\nexport async function originalVersion (message) {\n let msg = message\n const done = {}\n // done[message.uri] = true\n while (msg) {\n if (done[msg.uri]) {\n debug.error('originalVersion: verion loop' + message)\n return message\n }\n done[msg.uri] = true\n message = msg\n await store.fetcher.load(message)\n msg = store.any(null, ns.dct('isReplacedBy'), message, message.doc())\n }\n return message\n}\n\nexport async function mostRecentVersion (message) {\n let msg = message\n const done = {}\n while (msg) {\n if (done[msg.uri]) {\n debug.error('mostRecentVersion: verion loop' + message)\n return message\n }\n done[msg.uri] = true\n message = msg\n await store.fetcher.load(message)\n msg = store.any(message, ns.dct('isReplacedBy'), null, message.doc())\n }\n return message\n}\n\nexport function isDeleted (message) {\n return store.holds(message, ns.schema('dateDeleted'), null, message.doc())\n}\n\nexport function isReplaced (message) {\n return store.holds(message, ns.dct('isReplacedBy'), null, message.doc())\n}\n\nexport function isHidden (message) {\n return this.isDeleted(message) || this.isReplaced(message)\n}\n\n// A Nickname for a person\n\nexport function nick (person) {\n const s = store.any(person, ns.foaf('nick'))\n if (s) return '' + s.value\n return '' + utils.label(person)\n}\n// ends\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chatLogic.esm.js","names":["ns"],"sources":["../../src/chat/chatLogic.js"],"sourcesContent":["/**\n * Contains the [[ChatChannel]] class and logic for Solid Chat\n * @packageDocumentation\n */\n\nimport * as debug from '../lib/debug'\nimport { DateFolder } from './dateFolder'\nimport { store, authn } from 'solid-logic'\nimport ns from '../lib/ns'\nimport * as $rdf from 'rdflib' // pull in first avoid cross-refs\nimport * as utils from '../utils'\nimport { getBlankMsg, signMsg, SEC } from './signature'\nimport { getPrivateKey } from './keys'\n\n/* The Solid logic for a 'LongChat'\n*/\n/**\n * Common code for a chat (discussion area of messages about something)\n * This version runs over a series of files for different time periods\n *\n * Parameters for the whole chat like its title are stored on\n * index.ttl#this and the chats messages are stored in YYYY/MM/DD/chat.ttl\n *\n */\n\nexport class ChatChannel {\n constructor (channel, options) {\n this.channel = channel\n this.channelRoot = channel.doc()\n this.options = options\n this.dateFolder = new DateFolder(this.channelRoot, 'chat.ttl')\n this.div = null // : HTMLElement\n }\n\n /* Store a new message in the web,\n */\n async createMessage (text) {\n return this.updateMessage(text)\n }\n\n /* Store a new message in the web,\n as a replacement for an existing one.\n The old one iis left, and the two are linked\n */\n async updateMessage (text, oldMsg = null, deleteIt, thread = null) {\n const sts = []\n const now = new Date()\n const timestamp = '' + now.getTime()\n const dateStamp = $rdf.term(now)\n const chatDocument = oldMsg ? oldMsg.doc() : this.dateFolder.leafDocumentFromDate(now)\n const message = store.sym(chatDocument.uri + '#' + 'Msg' + timestamp)\n // const content = store.literal(text)\n\n const me = authn.currentUser() // If already logged on\n\n const msg = getBlankMsg()\n msg.id = message.uri\n if (oldMsg) { // edit message replaces old one\n const oldMsgMaker = store.any(oldMsg, ns.foaf('maker')) // may not be needed here, but needed on READ\n if (oldMsgMaker.uri === me.uri) {\n const oldMsgMostRecentVersion = await mostRecentVersion(oldMsg)\n sts.push($rdf.st(oldMsgMostRecentVersion, ns.dct('isReplacedBy'), message, chatDocument))\n // if oldMsg has_reply => add has_reply to message\n const oldMsgThread = store.any(oldMsgMostRecentVersion, ns.sioc('has_reply'))\n if (oldMsgThread) {\n sts.push($rdf.st(message, ns.sioc('has_reply'), oldMsgThread, chatDocument))\n }\n if (deleteIt) { // we need to add a specific signature, else anyone can delete a msg ?\n sts.push($rdf.st(message, ns.schema('dateDeleted'), dateStamp, chatDocument))\n }\n } else {\n const errMsg = 'Error you cannot delete/edit a message from someone else : \\n' + oldMsgMaker.uri\n debug.warn(errMsg)\n alert(errMsg)\n throw new Error(errMsg)\n }\n } else { // link new message to channel\n sts.push($rdf.st(this.channel, ns.wf('message'), message, chatDocument))\n }\n sts.push(\n $rdf.st(message, ns.sioc('content'), store.literal(text), chatDocument)\n )\n msg.content = text\n\n sts.push(\n $rdf.st(message, ns.dct('created'), dateStamp, chatDocument)\n )\n msg.created = dateStamp.value\n if (me) {\n sts.push($rdf.st(message, ns.foaf('maker'), me, chatDocument))\n msg.maker = me.uri\n // privateKey the cached private key of me, cached in store\n const privateKey = await getPrivateKey(me) // me.uri)\n\n const sig = signMsg(msg, privateKey)\n sts.push($rdf.st(message, $rdf.sym(`${SEC}proofValue`), $rdf.lit(sig), chatDocument))\n }\n if (thread) {\n sts.push($rdf.st(thread, ns.sioc('has_member'), message, chatDocument))\n if (!thread.doc().sameTerm(message.doc())) {\n sts.push($rdf.st(thread, ns.sioc('has_member'), message, thread.doc()))\n }\n }\n\n try {\n await store.updater.updateMany([], sts)\n } catch (err) {\n const errMsg = 'Error saving chat message: ' + err\n debug.warn(errMsg)\n alert(errMsg)\n throw new Error(errMsg)\n }\n return message\n }\n\n /* Mark a message as deleted\n * Wee add a new version of the message,m witha deletion flag (deletion date)\n * so that the deletion can be revoked by adding another non-deleted update\n */\n async deleteMessage (message) {\n return this.updateMessage('(message deleted)', message, true)\n }\n\n // Create a new thread of replies to the thread root message\n // or return one which already exists\n\n async createThread (threadRoot) {\n const already = store.each(threadRoot, ns.sioc('has_reply'), null, threadRoot.doc())\n .filter(thread => store.holds(thread, ns.rdf('type'), ns.sioc('Thread'), thread.doc()))\n if (already.length > 0) return already[0]\n\n const thread = $rdf.sym(threadRoot.uri + '-thread')\n const insert = [\n $rdf.st(thread, ns.rdf('type'), ns.sioc('Thread'), thread.doc()),\n $rdf.st(threadRoot, ns.sioc('has_reply'), thread, thread.doc())\n ]\n await store.updater.update([], insert)\n return thread\n }\n} // class ChatChannel\n\n// ////////// Utility functions\n\n// Have to not loop forever if fed loops\nexport async function allVersions (message) {\n const versions = [message]\n const done = {}\n done[message.uri] = true\n let m = message\n while (true) { // earlier?\n const prev = store.any(null, ns.dct('isReplacedBy'), m, m.doc())\n if (!prev || done[prev.uri]) break\n await store.fetcher.load(prev)\n versions.unshift(prev)\n done[prev.uri] = true\n m = prev\n }\n m = message\n while (true) { // later?\n const next = store.any(m, ns.dct('isReplacedBy'), null, m.doc())\n if (!next || done[next.uri]) break\n versions.push(next)\n done[next.uri] = true\n m = next\n }\n return versions\n}\n\nexport async function originalVersion (message) {\n let msg = message\n const done = {}\n // done[message.uri] = true\n while (msg) {\n if (done[msg.uri]) {\n debug.error('originalVersion: verion loop' + message)\n return message\n }\n done[msg.uri] = true\n message = msg\n await store.fetcher.load(message)\n msg = store.any(null, ns.dct('isReplacedBy'), message, message.doc())\n }\n return message\n}\n\nexport async function mostRecentVersion (message) {\n let msg = message\n const done = {}\n while (msg) {\n if (done[msg.uri]) {\n debug.error('mostRecentVersion: verion loop' + message)\n return message\n }\n done[msg.uri] = true\n message = msg\n await store.fetcher.load(message)\n msg = store.any(message, ns.dct('isReplacedBy'), null, message.doc())\n }\n return message\n}\n\nexport function isDeleted (message) {\n return store.holds(message, ns.schema('dateDeleted'), null, message.doc())\n}\n\nexport function isReplaced (message) {\n return store.holds(message, ns.dct('isReplacedBy'), null, message.doc())\n}\n\nexport function isHidden (message) {\n return this.isDeleted(message) || this.isReplaced(message)\n}\n\n// A Nickname for a person\n\nexport function nick (person) {\n const s = store.any(person, ns.foaf('nick'))\n if (s) return '' + s.value\n return '' + utils.label(person)\n}\n// ends\n"],"mappings":"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"}
|
package/dist/chat/keys.cjs.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
const e=require("../_virtual/_rolldown/runtime.cjs.js"),t=require("../lib/ns.cjs.js"),n=require("../lib/debug.cjs.js"),r=require("../utils/keyHelpers/accessData.cjs.js"),i=require("../utils/keyHelpers/acl.cjs.js");let a=require("rdflib");a=e.__toESM(a);let o=require("solid-logic"),s=require("@noble/curves/secp256k1.js"),c=require("@noble/hashes/utils.js");function l(){return(0,c.bytesToHex)(s.schnorr.utils.randomSecretKey())}function u(e){return(0,c.bytesToHex)(s.schnorr.getPublicKey((0,c.hexToBytes)(e)))}async function d(e){await o.store.fetcher.load(e);let n=await r.pubKeyUrl(e);try{return await o.store.fetcher.load(n),o.store.any(e,t.default.solid(`publicKey`))?.value}catch{return}}async function f(e){await o.store.fetcher.load(e);let s=await r.pubKeyUrl(e),c=await r.privKeyUrl(e),d=await r.getExistingPublicKey(e,s),f=await r.getExistingPrivateKey(e,c),p=!0;if(f&&d!==u(f)&&confirm(`This is strange the publicKey is not valid for
|
|
2
|
-
`+e?.uri+`'shall we repair keeping the private key ?`)&&(p=!1),!f||!d||!p){let r=[],h=[];if(f||(f=l(),h=[a.st(e,t.default.solid(`privateKey`),a.literal(f),o.store.sym(c))],await m(c,[],h,e.uri)),!d||!p){r=[],d&&(r=[a.st(e,t.default.solid(`publicKey`),a.lit(d),o.store.sym(s))],n.log(`delete invalid publicKey `+r));let i=u(f);h=[a.st(e,t.default.solid(`publicKey`),a.literal(i),o.store.sym(s))],await m(s,r,h)}
|
|
2
|
+
`+e?.uri+`'shall we repair keeping the private key ?`)&&(p=!1),!f||!d||!p){let r=[],h=[];if(f||(f=l(),h=[a.st(e,t.default.solid(`privateKey`),a.literal(f),o.store.sym(c))],await m(c,[],h,e.uri)),!d||!p){r=[],d&&(r=[a.st(e,t.default.solid(`publicKey`),a.lit(d),o.store.sym(s))],n.log(`delete invalid publicKey `+r));let i=u(f);h=[a.st(e,t.default.solid(`publicKey`),a.literal(i),o.store.sym(s))],await m(s,r,h)}let g=c.substring(0,c.lastIndexOf(`/`)+1);await i.setAcl(g,i.keyContainerAclBody(e.uri))}return f}var p=async e=>{await o.store.fetcher.load(e);let t=o.store.any(o.store.sym(e),o.store.sym(`http://www.iana.org/assignments/link-relations/acl`));if(t)try{let e=await o.store.fetcher.webOperation(`DELETE`,t.value);n.log(`delete keyAcl`+t.value+` `+e.status)}catch(e){if(e.response.status!==404)throw Error(e);n.log(`delete keyAcl`+t.value+` `+e.response.status)}};async function m(e,t,n,r=``){await p(e),await o.store.updater.updateMany(t,n);let a=i.keyAclBody(e,r);await i.setAcl(e,a)}exports.generatePrivateKey=l,exports.generatePublicKey=u,exports.getPrivateKey=f,exports.getPublicKey=d;
|
|
3
3
|
//# sourceMappingURL=keys.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.cjs.js","names":[],"sources":["../../src/chat/keys.ts"],"sourcesContent":["import * as debug from '../lib/debug'\r\nimport { schnorr } from '@noble/curves/secp256k1.js'\r\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\r\nimport ns from '../lib/ns'\r\nimport { store } from 'solid-logic'\r\nimport { NamedNode } from 'rdflib'\r\nimport * as $rdf from 'rdflib'\r\nimport { getExistingPublicKey, pubKeyUrl, privKeyUrl, getExistingPrivateKey } from '../utils/keyHelpers/accessData'\r\nimport { setAcl, keyContainerAclBody, keyAclBody } from '../utils/keyHelpers/acl'\r\n\r\nexport function generatePrivateKey (): string {\r\n return bytesToHex(schnorr.utils.randomSecretKey())\r\n}\r\n\r\nexport function generatePublicKey (privateKey: string): string {\r\n return bytesToHex(schnorr.getPublicKey(hexToBytes(privateKey)))\r\n}\r\n\r\n/**\r\n * getPublicKey\r\n * used for displaying messages in chat, therefore does not\r\n * create a new key if not found\r\n * @param webId\r\n * @returns string | undefined\r\n */\r\nexport async function getPublicKey (webId: NamedNode) {\r\n await store.fetcher.load(webId)\r\n const publicKeyDoc = await pubKeyUrl(webId)\r\n try {\r\n await store.fetcher.load(publicKeyDoc) // url.href)\r\n const key = store.any(webId, ns.solid('publicKey'))\r\n return key?.value // as NamedNode\r\n } catch (_err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport async function getPrivateKey (webId: NamedNode) {\r\n await store.fetcher.load(webId)\r\n // find keys url's\r\n const publicKeyDoc = await pubKeyUrl(webId)\r\n const privateKeyDoc = await privKeyUrl(webId)\r\n\r\n // find key pair\r\n const publicKey = await getExistingPublicKey(webId, publicKeyDoc)\r\n let privateKey = await getExistingPrivateKey(webId, privateKeyDoc)\r\n\r\n // is publicKey valid ?\r\n let validPublicKey = true\r\n if (privateKey && (publicKey !== generatePublicKey(privateKey as string))) {\r\n if (confirm('This is strange the publicKey is not valid for\\n' + webId?.uri +\r\n '\\'shall we repair keeping the private key ?')) validPublicKey = false\r\n }\r\n\r\n // create key pair or repair publicKey\r\n if (!privateKey || !publicKey || !validPublicKey) {\r\n let del: any[] = []\r\n let add: any[] = []\r\n\r\n if (!privateKey) {\r\n // add = []\r\n privateKey = generatePrivateKey()\r\n add = [$rdf.st(webId, ns.solid('privateKey'), $rdf.literal(privateKey), store.sym(privateKeyDoc))]\r\n await saveKey(privateKeyDoc, [], add, webId.uri)\r\n }\r\n if (!publicKey || !validPublicKey) {\r\n del = []\r\n // delete invalid public key\r\n if (publicKey) {\r\n del = [$rdf.st(webId, ns.solid('publicKey'), $rdf.lit(publicKey), store.sym(publicKeyDoc))]\r\n debug.log('delete invalid publicKey ' + del)\r\n }\r\n // update new valid key\r\n const newPublicKey = generatePublicKey(privateKey)\r\n add = [$rdf.st(webId, ns.solid('publicKey'), $rdf.literal(newPublicKey), store.sym(publicKeyDoc))]\r\n await saveKey(publicKeyDoc, del, add)\r\n }\r\n const keyContainer = privateKeyDoc.substring(0, privateKeyDoc.lastIndexOf('/') + 1)\r\n await setAcl(keyContainer, keyContainerAclBody(webId.uri)) // includes DELETE and PUT\r\n }\r\n return privateKey as string\r\n}\r\n\r\nconst deleteKeyAcl = async (keyDoc: string) => {\r\n await store.fetcher.load(keyDoc)\r\n\r\n const keyAclDoc = store.any(store.sym(keyDoc), store.sym('http://www.iana.org/assignments/link-relations/acl'))\r\n if (keyAclDoc) {\r\n // delete READ only keyAclDoc. This is possible if the webId is an owner\r\n try {\r\n const response = await store.fetcher.webOperation('DELETE', keyAclDoc.value) // this may fail if webId is not an owner\r\n debug.log('delete keyAcl' + keyAclDoc.value + ' ' + response.status) // should test 404 and 2xx\r\n } catch (err) {\r\n if (err.response.status !== 404) { throw new Error(err) }\r\n debug.log('delete keyAcl' + keyAclDoc.value + ' ' + err.response.status) // should test 404 and 2xx\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * delete acl if keydoc exists\r\n * create/edit keyDoc\r\n * set keyDoc acl\r\n */\r\nasync function saveKey (keyDoc: string, del, add, me: string = '') {\r\n await deleteKeyAcl(keyDoc)\r\n // save key\r\n await store.updater.updateMany(del, add) // or a promise store.updater.update ?\r\n\r\n // create READ only ACL\r\n const aclBody = keyAclBody(keyDoc, me)\r\n await setAcl(keyDoc, aclBody)\r\n}\r\n"],"mappings":"sWAUA,SAAgB,GAA8B,CAC5C,OAAA,
|
|
1
|
+
{"version":3,"file":"keys.cjs.js","names":[],"sources":["../../src/chat/keys.ts"],"sourcesContent":["import * as debug from '../lib/debug'\r\nimport { schnorr } from '@noble/curves/secp256k1.js'\r\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\r\nimport ns from '../lib/ns'\r\nimport { store } from 'solid-logic'\r\nimport { NamedNode } from 'rdflib'\r\nimport * as $rdf from 'rdflib'\r\nimport { getExistingPublicKey, pubKeyUrl, privKeyUrl, getExistingPrivateKey } from '../utils/keyHelpers/accessData'\r\nimport { setAcl, keyContainerAclBody, keyAclBody } from '../utils/keyHelpers/acl'\r\n\r\nexport function generatePrivateKey (): string {\r\n return bytesToHex(schnorr.utils.randomSecretKey())\r\n}\r\n\r\nexport function generatePublicKey (privateKey: string): string {\r\n return bytesToHex(schnorr.getPublicKey(hexToBytes(privateKey)))\r\n}\r\n\r\n/**\r\n * getPublicKey\r\n * used for displaying messages in chat, therefore does not\r\n * create a new key if not found\r\n * @param webId\r\n * @returns string | undefined\r\n */\r\nexport async function getPublicKey (webId: NamedNode) {\r\n await store.fetcher.load(webId)\r\n const publicKeyDoc = await pubKeyUrl(webId)\r\n try {\r\n await store.fetcher.load(publicKeyDoc) // url.href)\r\n const key = store.any(webId, ns.solid('publicKey'))\r\n return key?.value // as NamedNode\r\n } catch (_err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport async function getPrivateKey (webId: NamedNode) {\r\n await store.fetcher.load(webId)\r\n // find keys url's\r\n const publicKeyDoc = await pubKeyUrl(webId)\r\n const privateKeyDoc = await privKeyUrl(webId)\r\n\r\n // find key pair\r\n const publicKey = await getExistingPublicKey(webId, publicKeyDoc)\r\n let privateKey = await getExistingPrivateKey(webId, privateKeyDoc)\r\n\r\n // is publicKey valid ?\r\n let validPublicKey = true\r\n if (privateKey && (publicKey !== generatePublicKey(privateKey as string))) {\r\n if (confirm('This is strange the publicKey is not valid for\\n' + webId?.uri +\r\n '\\'shall we repair keeping the private key ?')) validPublicKey = false\r\n }\r\n\r\n // create key pair or repair publicKey\r\n if (!privateKey || !publicKey || !validPublicKey) {\r\n let del: any[] = []\r\n let add: any[] = []\r\n\r\n if (!privateKey) {\r\n // add = []\r\n privateKey = generatePrivateKey()\r\n add = [$rdf.st(webId, ns.solid('privateKey'), $rdf.literal(privateKey), store.sym(privateKeyDoc))]\r\n await saveKey(privateKeyDoc, [], add, webId.uri)\r\n }\r\n if (!publicKey || !validPublicKey) {\r\n del = []\r\n // delete invalid public key\r\n if (publicKey) {\r\n del = [$rdf.st(webId, ns.solid('publicKey'), $rdf.lit(publicKey), store.sym(publicKeyDoc))]\r\n debug.log('delete invalid publicKey ' + del)\r\n }\r\n // update new valid key\r\n const newPublicKey = generatePublicKey(privateKey)\r\n add = [$rdf.st(webId, ns.solid('publicKey'), $rdf.literal(newPublicKey), store.sym(publicKeyDoc))]\r\n await saveKey(publicKeyDoc, del, add)\r\n }\r\n const keyContainer = privateKeyDoc.substring(0, privateKeyDoc.lastIndexOf('/') + 1)\r\n await setAcl(keyContainer, keyContainerAclBody(webId.uri)) // includes DELETE and PUT\r\n }\r\n return privateKey as string\r\n}\r\n\r\nconst deleteKeyAcl = async (keyDoc: string) => {\r\n await store.fetcher.load(keyDoc)\r\n\r\n const keyAclDoc = store.any(store.sym(keyDoc), store.sym('http://www.iana.org/assignments/link-relations/acl'))\r\n if (keyAclDoc) {\r\n // delete READ only keyAclDoc. This is possible if the webId is an owner\r\n try {\r\n const response = await store.fetcher.webOperation('DELETE', keyAclDoc.value) // this may fail if webId is not an owner\r\n debug.log('delete keyAcl' + keyAclDoc.value + ' ' + response.status) // should test 404 and 2xx\r\n } catch (err) {\r\n if (err.response.status !== 404) { throw new Error(err) }\r\n debug.log('delete keyAcl' + keyAclDoc.value + ' ' + err.response.status) // should test 404 and 2xx\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * delete acl if keydoc exists\r\n * create/edit keyDoc\r\n * set keyDoc acl\r\n */\r\nasync function saveKey (keyDoc: string, del, add, me: string = '') {\r\n await deleteKeyAcl(keyDoc)\r\n // save key\r\n await store.updater.updateMany(del, add) // or a promise store.updater.update ?\r\n\r\n // create READ only ACL\r\n const aclBody = keyAclBody(keyDoc, me)\r\n await setAcl(keyDoc, aclBody)\r\n}\r\n"],"mappings":"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"}
|
package/dist/chat/keys.d.ts
CHANGED
|
@@ -8,6 +8,6 @@ export declare function generatePublicKey(privateKey: string): string;
|
|
|
8
8
|
* @param webId
|
|
9
9
|
* @returns string | undefined
|
|
10
10
|
*/
|
|
11
|
-
export declare function getPublicKey(webId: NamedNode): Promise<
|
|
11
|
+
export declare function getPublicKey(webId: NamedNode): Promise<any>;
|
|
12
12
|
export declare function getPrivateKey(webId: NamedNode): Promise<string>;
|
|
13
13
|
//# sourceMappingURL=keys.d.ts.map
|
package/dist/chat/keys.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/chat/keys.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAKlC,wBAAgB,kBAAkB,IAAK,MAAM,CAE5C;AAED,wBAAgB,iBAAiB,CAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAE,KAAK,EAAE,SAAS
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/chat/keys.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAKlC,wBAAgB,kBAAkB,IAAK,MAAM,CAE5C;AAED,wBAAgB,iBAAiB,CAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAE,KAAK,EAAE,SAAS,gBAUnD;AAED,wBAAsB,aAAa,CAAE,KAAK,EAAE,SAAS,mBA4CpD"}
|
package/dist/chat/keys.esm.js
CHANGED
|
@@ -32,7 +32,8 @@ async function _(o) {
|
|
|
32
32
|
let i = h(g);
|
|
33
33
|
r = [l.st(o, e.solid("publicKey"), l.literal(i), u.sym(d))], await y(d, n, r);
|
|
34
34
|
}
|
|
35
|
-
|
|
35
|
+
let i = f.substring(0, f.lastIndexOf("/") + 1);
|
|
36
|
+
await c(i, s(o.uri));
|
|
36
37
|
}
|
|
37
38
|
return g;
|
|
38
39
|
}
|
|
@@ -48,7 +49,9 @@ var v = async (e) => {
|
|
|
48
49
|
}
|
|
49
50
|
};
|
|
50
51
|
async function y(e, t, n, r = "") {
|
|
51
|
-
await v(e), await u.updater.updateMany(t, n)
|
|
52
|
+
await v(e), await u.updater.updateMany(t, n);
|
|
53
|
+
let i = o(e, r);
|
|
54
|
+
await c(e, i);
|
|
52
55
|
}
|
|
53
56
|
//#endregion
|
|
54
57
|
export { m as generatePrivateKey, h as generatePublicKey, _ as getPrivateKey, g as getPublicKey };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.esm.js","names":[],"sources":["../../src/chat/keys.ts"],"sourcesContent":["import * as debug from '../lib/debug'\r\nimport { schnorr } from '@noble/curves/secp256k1.js'\r\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\r\nimport ns from '../lib/ns'\r\nimport { store } from 'solid-logic'\r\nimport { NamedNode } from 'rdflib'\r\nimport * as $rdf from 'rdflib'\r\nimport { getExistingPublicKey, pubKeyUrl, privKeyUrl, getExistingPrivateKey } from '../utils/keyHelpers/accessData'\r\nimport { setAcl, keyContainerAclBody, keyAclBody } from '../utils/keyHelpers/acl'\r\n\r\nexport function generatePrivateKey (): string {\r\n return bytesToHex(schnorr.utils.randomSecretKey())\r\n}\r\n\r\nexport function generatePublicKey (privateKey: string): string {\r\n return bytesToHex(schnorr.getPublicKey(hexToBytes(privateKey)))\r\n}\r\n\r\n/**\r\n * getPublicKey\r\n * used for displaying messages in chat, therefore does not\r\n * create a new key if not found\r\n * @param webId\r\n * @returns string | undefined\r\n */\r\nexport async function getPublicKey (webId: NamedNode) {\r\n await store.fetcher.load(webId)\r\n const publicKeyDoc = await pubKeyUrl(webId)\r\n try {\r\n await store.fetcher.load(publicKeyDoc) // url.href)\r\n const key = store.any(webId, ns.solid('publicKey'))\r\n return key?.value // as NamedNode\r\n } catch (_err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport async function getPrivateKey (webId: NamedNode) {\r\n await store.fetcher.load(webId)\r\n // find keys url's\r\n const publicKeyDoc = await pubKeyUrl(webId)\r\n const privateKeyDoc = await privKeyUrl(webId)\r\n\r\n // find key pair\r\n const publicKey = await getExistingPublicKey(webId, publicKeyDoc)\r\n let privateKey = await getExistingPrivateKey(webId, privateKeyDoc)\r\n\r\n // is publicKey valid ?\r\n let validPublicKey = true\r\n if (privateKey && (publicKey !== generatePublicKey(privateKey as string))) {\r\n if (confirm('This is strange the publicKey is not valid for\\n' + webId?.uri +\r\n '\\'shall we repair keeping the private key ?')) validPublicKey = false\r\n }\r\n\r\n // create key pair or repair publicKey\r\n if (!privateKey || !publicKey || !validPublicKey) {\r\n let del: any[] = []\r\n let add: any[] = []\r\n\r\n if (!privateKey) {\r\n // add = []\r\n privateKey = generatePrivateKey()\r\n add = [$rdf.st(webId, ns.solid('privateKey'), $rdf.literal(privateKey), store.sym(privateKeyDoc))]\r\n await saveKey(privateKeyDoc, [], add, webId.uri)\r\n }\r\n if (!publicKey || !validPublicKey) {\r\n del = []\r\n // delete invalid public key\r\n if (publicKey) {\r\n del = [$rdf.st(webId, ns.solid('publicKey'), $rdf.lit(publicKey), store.sym(publicKeyDoc))]\r\n debug.log('delete invalid publicKey ' + del)\r\n }\r\n // update new valid key\r\n const newPublicKey = generatePublicKey(privateKey)\r\n add = [$rdf.st(webId, ns.solid('publicKey'), $rdf.literal(newPublicKey), store.sym(publicKeyDoc))]\r\n await saveKey(publicKeyDoc, del, add)\r\n }\r\n const keyContainer = privateKeyDoc.substring(0, privateKeyDoc.lastIndexOf('/') + 1)\r\n await setAcl(keyContainer, keyContainerAclBody(webId.uri)) // includes DELETE and PUT\r\n }\r\n return privateKey as string\r\n}\r\n\r\nconst deleteKeyAcl = async (keyDoc: string) => {\r\n await store.fetcher.load(keyDoc)\r\n\r\n const keyAclDoc = store.any(store.sym(keyDoc), store.sym('http://www.iana.org/assignments/link-relations/acl'))\r\n if (keyAclDoc) {\r\n // delete READ only keyAclDoc. This is possible if the webId is an owner\r\n try {\r\n const response = await store.fetcher.webOperation('DELETE', keyAclDoc.value) // this may fail if webId is not an owner\r\n debug.log('delete keyAcl' + keyAclDoc.value + ' ' + response.status) // should test 404 and 2xx\r\n } catch (err) {\r\n if (err.response.status !== 404) { throw new Error(err) }\r\n debug.log('delete keyAcl' + keyAclDoc.value + ' ' + err.response.status) // should test 404 and 2xx\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * delete acl if keydoc exists\r\n * create/edit keyDoc\r\n * set keyDoc acl\r\n */\r\nasync function saveKey (keyDoc: string, del, add, me: string = '') {\r\n await deleteKeyAcl(keyDoc)\r\n // save key\r\n await store.updater.updateMany(del, add) // or a promise store.updater.update ?\r\n\r\n // create READ only ACL\r\n const aclBody = keyAclBody(keyDoc, me)\r\n await setAcl(keyDoc, aclBody)\r\n}\r\n"],"mappings":";;;;;;;;;AAUA,SAAgB,IAA8B;CAC5C,OAAO,EAAW,EAAQ,MAAM,gBAAgB,CAAC;AACnD;AAEA,SAAgB,EAAmB,GAA4B;CAC7D,OAAO,EAAW,EAAQ,aAAa,EAAW,CAAU,CAAC,CAAC;AAChE;AASA,eAAsB,EAAc,GAAkB;CACpD,MAAM,EAAM,QAAQ,KAAK,CAAK;CAC9B,IAAM,IAAe,MAAM,EAAU,CAAK;CAC1C,IAAI;EAGF,OAFA,MAAM,EAAM,QAAQ,KAAK,CAAY,GACzB,EAAM,IAAI,GAAO,EAAG,MAAM,WAAW,CAC1C,CAAA,EAAK;CACd,QAAe;EACb;CACF;AACF;AAEA,eAAsB,EAAe,GAAkB;CACrD,MAAM,EAAM,QAAQ,KAAK,CAAK;CAE9B,IAAM,IAAe,MAAM,EAAU,CAAK,GACpC,IAAgB,MAAM,EAAW,CAAK,GAGtC,IAAY,MAAM,EAAqB,GAAO,CAAY,GAC5D,IAAa,MAAM,EAAsB,GAAO,CAAa,GAG7D,IAAiB;CAOrB,IANI,KAAe,MAAc,EAAkB,CAAoB,KACjE,QAAQ,qDAAqD,GAAO,MACvE,4CAA6C,MAAG,IAAiB,KAIhE,CAAC,KAAc,CAAC,KAAa,CAAC,GAAgB;EAChD,IAAI,IAAa,CAAC,GACd,IAAa,CAAC;EAQlB,IANK,MAEH,IAAa,EAAmB,GAChC,IAAM,CAAC,EAAK,GAAG,GAAO,EAAG,MAAM,YAAY,GAAG,EAAK,QAAQ,CAAU,GAAG,EAAM,IAAI,CAAa,CAAC,CAAC,GACjG,MAAM,EAAQ,GAAe,CAAC,GAAG,GAAK,EAAM,GAAG,IAE7C,CAAC,KAAa,CAAC,GAAgB;GAGjC,AAFA,IAAM,CAAC,GAEH,MACF,IAAM,CAAC,EAAK,GAAG,GAAO,EAAG,MAAM,WAAW,GAAG,EAAK,IAAI,CAAS,GAAG,EAAM,IAAI,CAAY,CAAC,CAAC,GAC1F,EAAU,8BAA8B,CAAG;GAG7C,IAAM,IAAe,EAAkB,CAAU;GAEjD,AADA,IAAM,CAAC,EAAK,GAAG,GAAO,EAAG,MAAM,WAAW,GAAG,EAAK,QAAQ,CAAY,GAAG,EAAM,IAAI,CAAY,CAAC,CAAC,GACjG,MAAM,EAAQ,GAAc,GAAK,CAAG;EACtC;
|
|
1
|
+
{"version":3,"file":"keys.esm.js","names":[],"sources":["../../src/chat/keys.ts"],"sourcesContent":["import * as debug from '../lib/debug'\r\nimport { schnorr } from '@noble/curves/secp256k1.js'\r\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\r\nimport ns from '../lib/ns'\r\nimport { store } from 'solid-logic'\r\nimport { NamedNode } from 'rdflib'\r\nimport * as $rdf from 'rdflib'\r\nimport { getExistingPublicKey, pubKeyUrl, privKeyUrl, getExistingPrivateKey } from '../utils/keyHelpers/accessData'\r\nimport { setAcl, keyContainerAclBody, keyAclBody } from '../utils/keyHelpers/acl'\r\n\r\nexport function generatePrivateKey (): string {\r\n return bytesToHex(schnorr.utils.randomSecretKey())\r\n}\r\n\r\nexport function generatePublicKey (privateKey: string): string {\r\n return bytesToHex(schnorr.getPublicKey(hexToBytes(privateKey)))\r\n}\r\n\r\n/**\r\n * getPublicKey\r\n * used for displaying messages in chat, therefore does not\r\n * create a new key if not found\r\n * @param webId\r\n * @returns string | undefined\r\n */\r\nexport async function getPublicKey (webId: NamedNode) {\r\n await store.fetcher.load(webId)\r\n const publicKeyDoc = await pubKeyUrl(webId)\r\n try {\r\n await store.fetcher.load(publicKeyDoc) // url.href)\r\n const key = store.any(webId, ns.solid('publicKey'))\r\n return key?.value // as NamedNode\r\n } catch (_err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport async function getPrivateKey (webId: NamedNode) {\r\n await store.fetcher.load(webId)\r\n // find keys url's\r\n const publicKeyDoc = await pubKeyUrl(webId)\r\n const privateKeyDoc = await privKeyUrl(webId)\r\n\r\n // find key pair\r\n const publicKey = await getExistingPublicKey(webId, publicKeyDoc)\r\n let privateKey = await getExistingPrivateKey(webId, privateKeyDoc)\r\n\r\n // is publicKey valid ?\r\n let validPublicKey = true\r\n if (privateKey && (publicKey !== generatePublicKey(privateKey as string))) {\r\n if (confirm('This is strange the publicKey is not valid for\\n' + webId?.uri +\r\n '\\'shall we repair keeping the private key ?')) validPublicKey = false\r\n }\r\n\r\n // create key pair or repair publicKey\r\n if (!privateKey || !publicKey || !validPublicKey) {\r\n let del: any[] = []\r\n let add: any[] = []\r\n\r\n if (!privateKey) {\r\n // add = []\r\n privateKey = generatePrivateKey()\r\n add = [$rdf.st(webId, ns.solid('privateKey'), $rdf.literal(privateKey), store.sym(privateKeyDoc))]\r\n await saveKey(privateKeyDoc, [], add, webId.uri)\r\n }\r\n if (!publicKey || !validPublicKey) {\r\n del = []\r\n // delete invalid public key\r\n if (publicKey) {\r\n del = [$rdf.st(webId, ns.solid('publicKey'), $rdf.lit(publicKey), store.sym(publicKeyDoc))]\r\n debug.log('delete invalid publicKey ' + del)\r\n }\r\n // update new valid key\r\n const newPublicKey = generatePublicKey(privateKey)\r\n add = [$rdf.st(webId, ns.solid('publicKey'), $rdf.literal(newPublicKey), store.sym(publicKeyDoc))]\r\n await saveKey(publicKeyDoc, del, add)\r\n }\r\n const keyContainer = privateKeyDoc.substring(0, privateKeyDoc.lastIndexOf('/') + 1)\r\n await setAcl(keyContainer, keyContainerAclBody(webId.uri)) // includes DELETE and PUT\r\n }\r\n return privateKey as string\r\n}\r\n\r\nconst deleteKeyAcl = async (keyDoc: string) => {\r\n await store.fetcher.load(keyDoc)\r\n\r\n const keyAclDoc = store.any(store.sym(keyDoc), store.sym('http://www.iana.org/assignments/link-relations/acl'))\r\n if (keyAclDoc) {\r\n // delete READ only keyAclDoc. This is possible if the webId is an owner\r\n try {\r\n const response = await store.fetcher.webOperation('DELETE', keyAclDoc.value) // this may fail if webId is not an owner\r\n debug.log('delete keyAcl' + keyAclDoc.value + ' ' + response.status) // should test 404 and 2xx\r\n } catch (err) {\r\n if (err.response.status !== 404) { throw new Error(err) }\r\n debug.log('delete keyAcl' + keyAclDoc.value + ' ' + err.response.status) // should test 404 and 2xx\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * delete acl if keydoc exists\r\n * create/edit keyDoc\r\n * set keyDoc acl\r\n */\r\nasync function saveKey (keyDoc: string, del, add, me: string = '') {\r\n await deleteKeyAcl(keyDoc)\r\n // save key\r\n await store.updater.updateMany(del, add) // or a promise store.updater.update ?\r\n\r\n // create READ only ACL\r\n const aclBody = keyAclBody(keyDoc, me)\r\n await setAcl(keyDoc, aclBody)\r\n}\r\n"],"mappings":";;;;;;;;;AAUA,SAAgB,IAA8B;CAC5C,OAAO,EAAW,EAAQ,MAAM,gBAAgB,CAAC;AACnD;AAEA,SAAgB,EAAmB,GAA4B;CAC7D,OAAO,EAAW,EAAQ,aAAa,EAAW,CAAU,CAAC,CAAC;AAChE;AASA,eAAsB,EAAc,GAAkB;CACpD,MAAM,EAAM,QAAQ,KAAK,CAAK;CAC9B,IAAM,IAAe,MAAM,EAAU,CAAK;CAC1C,IAAI;EAGF,OAFA,MAAM,EAAM,QAAQ,KAAK,CAAY,GACzB,EAAM,IAAI,GAAO,EAAG,MAAM,WAAW,CAC1C,CAAA,EAAK;CACd,QAAe;EACb;CACF;AACF;AAEA,eAAsB,EAAe,GAAkB;CACrD,MAAM,EAAM,QAAQ,KAAK,CAAK;CAE9B,IAAM,IAAe,MAAM,EAAU,CAAK,GACpC,IAAgB,MAAM,EAAW,CAAK,GAGtC,IAAY,MAAM,EAAqB,GAAO,CAAY,GAC5D,IAAa,MAAM,EAAsB,GAAO,CAAa,GAG7D,IAAiB;CAOrB,IANI,KAAe,MAAc,EAAkB,CAAoB,KACjE,QAAQ,qDAAqD,GAAO,MACvE,4CAA6C,MAAG,IAAiB,KAIhE,CAAC,KAAc,CAAC,KAAa,CAAC,GAAgB;EAChD,IAAI,IAAa,CAAC,GACd,IAAa,CAAC;EAQlB,IANK,MAEH,IAAa,EAAmB,GAChC,IAAM,CAAC,EAAK,GAAG,GAAO,EAAG,MAAM,YAAY,GAAG,EAAK,QAAQ,CAAU,GAAG,EAAM,IAAI,CAAa,CAAC,CAAC,GACjG,MAAM,EAAQ,GAAe,CAAC,GAAG,GAAK,EAAM,GAAG,IAE7C,CAAC,KAAa,CAAC,GAAgB;GAGjC,AAFA,IAAM,CAAC,GAEH,MACF,IAAM,CAAC,EAAK,GAAG,GAAO,EAAG,MAAM,WAAW,GAAG,EAAK,IAAI,CAAS,GAAG,EAAM,IAAI,CAAY,CAAC,CAAC,GAC1F,EAAU,8BAA8B,CAAG;GAG7C,IAAM,IAAe,EAAkB,CAAU;GAEjD,AADA,IAAM,CAAC,EAAK,GAAG,GAAO,EAAG,MAAM,WAAW,GAAG,EAAK,QAAQ,CAAY,GAAG,EAAM,IAAI,CAAY,CAAC,CAAC,GACjG,MAAM,EAAQ,GAAc,GAAK,CAAG;EACtC;EACA,IAAM,IAAe,EAAc,UAAU,GAAG,EAAc,YAAY,GAAG,IAAI,CAAC;EAClF,MAAM,EAAO,GAAc,EAAoB,EAAM,GAAG,CAAC;CAC3D;CACA,OAAO;AACT;AAEA,IAAM,IAAe,OAAO,MAAmB;CAC7C,MAAM,EAAM,QAAQ,KAAK,CAAM;CAE/B,IAAM,IAAY,EAAM,IAAI,EAAM,IAAI,CAAM,GAAG,EAAM,IAAI,oDAAoD,CAAC;CAC9G,IAAI,GAEF,IAAI;EACF,IAAM,IAAW,MAAM,EAAM,QAAQ,aAAa,UAAU,EAAU,KAAK;EAC3E,EAAU,kBAAkB,EAAU,QAAQ,MAAM,EAAS,MAAM;CACrE,SAAS,GAAK;EACZ,IAAI,EAAI,SAAS,WAAW,KAAO,MAAU,MAAM,CAAG;EACtD,EAAU,kBAAkB,EAAU,QAAQ,MAAM,EAAI,SAAS,MAAM;CACzE;AAEJ;AAOA,eAAe,EAAS,GAAgB,GAAK,GAAK,IAAa,IAAI;CAGjE,AAFA,MAAM,EAAa,CAAM,GAEzB,MAAM,EAAM,QAAQ,WAAW,GAAK,CAAG;CAGvC,IAAM,IAAU,EAAW,GAAQ,CAAE;CACrC,MAAM,EAAO,GAAQ,CAAO;AAC9B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
let e=require("@noble/curves/secp256k1.js"),t=require("@noble/hashes/utils.js"),n=require("@noble/hashes/sha2.js");new TextDecoder(`utf-8`);var r=new TextEncoder,i=`https://w3id.org/security#`;function a(){return{id:``,created:``,dateDeleted:``,content:``,maker:``,sig:``}}function o(e){return JSON.stringify(e)}function s(e){
|
|
1
|
+
let e=require("@noble/curves/secp256k1.js"),t=require("@noble/hashes/utils.js"),n=require("@noble/hashes/sha2.js");new TextDecoder(`utf-8`);var r=new TextEncoder,i=`https://w3id.org/security#`;function a(){return{id:``,created:``,dateDeleted:``,content:``,maker:``,sig:``}}function o(e){return JSON.stringify(e)}function s(e){let i=(0,n.sha256)(r.encode(o(e)));return(0,t.bytesToHex)(i)}function c(n,r,i){return e.schnorr.verify((0,t.hexToBytes)(n),(0,t.hexToBytes)(s(r)),(0,t.hexToBytes)(i))}function l(n,r){return(0,t.bytesToHex)(e.schnorr.sign((0,t.hexToBytes)(s(n)),(0,t.hexToBytes)(r)))}exports.SEC=i,exports.getBlankMsg=a,exports.getMsgHash=s,exports.serializeMsg=o,exports.signMsg=l,exports.utf8Encoder=r,exports.verifySignature=c;
|
|
2
2
|
//# sourceMappingURL=signature.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signature.cjs.js","names":[],"sources":["../../src/chat/signature.ts"],"sourcesContent":["import { schnorr } from '@noble/curves/secp256k1.js'\r\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\r\nimport { sha256 } from '@noble/hashes/sha2.js'\r\n\r\n// import {utf8Encoder} from './utils'\r\n// import { getPublicKey } from './keys'\r\n\r\nexport const utf8Decoder = new TextDecoder('utf-8')\r\nexport const utf8Encoder = new TextEncoder()\r\n\r\nexport const SEC = 'https://w3id.org/security#' // Proof, VerificationMethod\r\n// export const CERT = 'http://www.w3.org/ns/auth/cert#' // PrivateKey, PublicKey, key\r\n\r\n/* export enum Kind {\r\n Metadata = 0,\r\n Text = 1,\r\n RecommendRelay = 2,\r\n Contacts = 3,\r\n EncryptedDirectMessage = 4,\r\n EventDeletion = 5,\r\n Reaction = 7,\r\n BadgeAward = 8,\r\n ChannelCreation = 40,\r\n ChannelMetadata = 41,\r\n ChannelMessage = 42,\r\n ChannelHideMessage = 43,\r\n ChannelMuteUser = 44,\r\n Report = 1984,\r\n ZapRequest = 9734,\r\n Zap = 9735,\r\n RelayList = 10002,\r\n ClientAuth = 22242,\r\n BadgeDefinition = 30008,\r\n ProfileBadge = 30009,\r\n Article = 30023\r\n} */\r\n\r\nexport type MsgTemplate = {\r\n id: string\r\n created: string\r\n dateDeleted: string\r\n content: string\r\n maker: string\r\n sig: string\r\n}\r\n\r\nexport type UnsignedMsg = MsgTemplate & {\r\n pubkey: string\r\n}\r\n\r\nexport type Message = UnsignedMsg & {\r\n id: string\r\n sig: string\r\n}\r\n\r\nexport function getBlankMsg (): MsgTemplate {\r\n return {\r\n id: '',\r\n created: '',\r\n dateDeleted: '', // TODO to remove if not used\r\n content: '',\r\n maker: '',\r\n sig: '' // TODO to remove if not used\r\n }\r\n}\r\n\r\n/* export function finishMsg (t: MsgTemplate, privateKey: string): Message {\r\n // to update to chat message triples\r\n const message = t as Message\r\n // message.pubkey = getPublicKey(privateKey)\r\n message.id = getMsgHash(message)\r\n message.sig = signMsg(message, privateKey)\r\n return message\r\n} */\r\n\r\nexport function serializeMsg (msg: UnsignedMsg): string {\r\n // to update to chat messages triples\r\n /* if (!validateMsg(msg))\r\n throw new Error(\"can't serialize message with wrong or missing properties\") */\r\n\r\n return JSON.stringify(msg)\r\n}\r\n\r\nexport function getMsgHash (message: UnsignedMsg) {\r\n const msgHash = sha256(utf8Encoder.encode(serializeMsg(message)))\r\n return bytesToHex(msgHash)\r\n}\r\n\r\n// const isRecord = (obj: unknown): obj is Record<string, unknown> => obj instanceof Object\r\n\r\n/* export function validateMsg<T> (message: T): message is T & UnsignedMsg {\r\n if (!isRecord(message)) return false\r\n if (typeof message.kind !== 'number') return false\r\n if (typeof message.content !== 'string') return false\r\n if (typeof message.created_at !== 'number') return false\r\n if (typeof message.pubkey !== 'string') return false\r\n if (!message.pubkey.match(/^[a-f0-9]{64}$/)) return false\r\n\r\n if (!Array.isArray(message.tags)) return false\r\n for (let i = 0; i < message.tags.length; i++) {\r\n let tag = message.tags[i]\r\n if (!Array.isArray(tag)) return false\r\n for (let j = 0; j < tag.length; j++) {\r\n if (typeof tag[j] === 'object') return false\r\n }\r\n }\r\n\r\n return true\r\n} */\r\n\r\nexport function verifySignature (sig: string, message: Message, pubKey: string): boolean {\r\n return schnorr.verify(\r\n hexToBytes(sig),\r\n hexToBytes(getMsgHash(message)),\r\n hexToBytes(pubKey)\r\n )\r\n}\r\n\r\nexport function signMsg (message: UnsignedMsg, key: string): string {\r\n return bytesToHex(\r\n schnorr.sign(hexToBytes(getMsgHash(message)), hexToBytes(key))\r\n )\r\n}\r\n"],"mappings":"mHAO2B,IAAI,YAAY,OAAO,EAClD,IAAa,EAAc,IAAI,YAElB,EAAM,6BA6CnB,SAAgB,GAA4B,CAC1C,MAAO,CACL,GAAI,GACJ,QAAS,GACT,YAAa,GACb,QAAS,GACT,MAAO,GACP,IAAK,EACP,CACF,CAWA,SAAgB,EAAc,EAA0B,CAKtD,OAAO,KAAK,UAAU,CAAG,CAC3B,CAEA,SAAgB,EAAY,EAAsB,
|
|
1
|
+
{"version":3,"file":"signature.cjs.js","names":[],"sources":["../../src/chat/signature.ts"],"sourcesContent":["import { schnorr } from '@noble/curves/secp256k1.js'\r\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\r\nimport { sha256 } from '@noble/hashes/sha2.js'\r\n\r\n// import {utf8Encoder} from './utils'\r\n// import { getPublicKey } from './keys'\r\n\r\nexport const utf8Decoder = new TextDecoder('utf-8')\r\nexport const utf8Encoder = new TextEncoder()\r\n\r\nexport const SEC = 'https://w3id.org/security#' // Proof, VerificationMethod\r\n// export const CERT = 'http://www.w3.org/ns/auth/cert#' // PrivateKey, PublicKey, key\r\n\r\n/* export enum Kind {\r\n Metadata = 0,\r\n Text = 1,\r\n RecommendRelay = 2,\r\n Contacts = 3,\r\n EncryptedDirectMessage = 4,\r\n EventDeletion = 5,\r\n Reaction = 7,\r\n BadgeAward = 8,\r\n ChannelCreation = 40,\r\n ChannelMetadata = 41,\r\n ChannelMessage = 42,\r\n ChannelHideMessage = 43,\r\n ChannelMuteUser = 44,\r\n Report = 1984,\r\n ZapRequest = 9734,\r\n Zap = 9735,\r\n RelayList = 10002,\r\n ClientAuth = 22242,\r\n BadgeDefinition = 30008,\r\n ProfileBadge = 30009,\r\n Article = 30023\r\n} */\r\n\r\nexport type MsgTemplate = {\r\n id: string\r\n created: string\r\n dateDeleted: string\r\n content: string\r\n maker: string\r\n sig: string\r\n}\r\n\r\nexport type UnsignedMsg = MsgTemplate & {\r\n pubkey: string\r\n}\r\n\r\nexport type Message = UnsignedMsg & {\r\n id: string\r\n sig: string\r\n}\r\n\r\nexport function getBlankMsg (): MsgTemplate {\r\n return {\r\n id: '',\r\n created: '',\r\n dateDeleted: '', // TODO to remove if not used\r\n content: '',\r\n maker: '',\r\n sig: '' // TODO to remove if not used\r\n }\r\n}\r\n\r\n/* export function finishMsg (t: MsgTemplate, privateKey: string): Message {\r\n // to update to chat message triples\r\n const message = t as Message\r\n // message.pubkey = getPublicKey(privateKey)\r\n message.id = getMsgHash(message)\r\n message.sig = signMsg(message, privateKey)\r\n return message\r\n} */\r\n\r\nexport function serializeMsg (msg: UnsignedMsg): string {\r\n // to update to chat messages triples\r\n /* if (!validateMsg(msg))\r\n throw new Error(\"can't serialize message with wrong or missing properties\") */\r\n\r\n return JSON.stringify(msg)\r\n}\r\n\r\nexport function getMsgHash (message: UnsignedMsg) {\r\n const msgHash = sha256(utf8Encoder.encode(serializeMsg(message)))\r\n return bytesToHex(msgHash)\r\n}\r\n\r\n// const isRecord = (obj: unknown): obj is Record<string, unknown> => obj instanceof Object\r\n\r\n/* export function validateMsg<T> (message: T): message is T & UnsignedMsg {\r\n if (!isRecord(message)) return false\r\n if (typeof message.kind !== 'number') return false\r\n if (typeof message.content !== 'string') return false\r\n if (typeof message.created_at !== 'number') return false\r\n if (typeof message.pubkey !== 'string') return false\r\n if (!message.pubkey.match(/^[a-f0-9]{64}$/)) return false\r\n\r\n if (!Array.isArray(message.tags)) return false\r\n for (let i = 0; i < message.tags.length; i++) {\r\n let tag = message.tags[i]\r\n if (!Array.isArray(tag)) return false\r\n for (let j = 0; j < tag.length; j++) {\r\n if (typeof tag[j] === 'object') return false\r\n }\r\n }\r\n\r\n return true\r\n} */\r\n\r\nexport function verifySignature (sig: string, message: Message, pubKey: string): boolean {\r\n return schnorr.verify(\r\n hexToBytes(sig),\r\n hexToBytes(getMsgHash(message)),\r\n hexToBytes(pubKey)\r\n )\r\n}\r\n\r\nexport function signMsg (message: UnsignedMsg, key: string): string {\r\n return bytesToHex(\r\n schnorr.sign(hexToBytes(getMsgHash(message)), hexToBytes(key))\r\n )\r\n}\r\n"],"mappings":"mHAO2B,IAAI,YAAY,OAAO,EAClD,IAAa,EAAc,IAAI,YAElB,EAAM,6BA6CnB,SAAgB,GAA4B,CAC1C,MAAO,CACL,GAAI,GACJ,QAAS,GACT,YAAa,GACb,QAAS,GACT,MAAO,GACP,IAAK,EACP,CACF,CAWA,SAAgB,EAAc,EAA0B,CAKtD,OAAO,KAAK,UAAU,CAAG,CAC3B,CAEA,SAAgB,EAAY,EAAsB,CAChD,IAAM,GAAA,EAAU,EAAA,OAAA,CAAO,EAAY,OAAO,EAAa,CAAO,CAAC,CAAC,EAChE,OAAA,EAAO,EAAA,WAAA,CAAW,CAAO,CAC3B,CAwBA,SAAgB,EAAiB,EAAa,EAAkB,EAAyB,CACvF,OAAO,EAAA,QAAQ,QAAA,EACb,EAAA,WAAA,CAAW,CAAG,GAAA,EACd,EAAA,WAAA,CAAW,EAAW,CAAO,CAAC,GAAA,EAC9B,EAAA,WAAA,CAAW,CAAM,CACnB,CACF,CAEA,SAAgB,EAAS,EAAsB,EAAqB,CAClE,OAAA,EAAO,EAAA,WAAA,CACL,EAAA,QAAQ,MAAA,EAAK,EAAA,WAAA,CAAW,EAAW,CAAO,CAAC,GAAA,EAAG,EAAA,WAAA,CAAW,CAAG,CAAC,CAC/D,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signature.esm.js","names":[],"sources":["../../src/chat/signature.ts"],"sourcesContent":["import { schnorr } from '@noble/curves/secp256k1.js'\r\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\r\nimport { sha256 } from '@noble/hashes/sha2.js'\r\n\r\n// import {utf8Encoder} from './utils'\r\n// import { getPublicKey } from './keys'\r\n\r\nexport const utf8Decoder = new TextDecoder('utf-8')\r\nexport const utf8Encoder = new TextEncoder()\r\n\r\nexport const SEC = 'https://w3id.org/security#' // Proof, VerificationMethod\r\n// export const CERT = 'http://www.w3.org/ns/auth/cert#' // PrivateKey, PublicKey, key\r\n\r\n/* export enum Kind {\r\n Metadata = 0,\r\n Text = 1,\r\n RecommendRelay = 2,\r\n Contacts = 3,\r\n EncryptedDirectMessage = 4,\r\n EventDeletion = 5,\r\n Reaction = 7,\r\n BadgeAward = 8,\r\n ChannelCreation = 40,\r\n ChannelMetadata = 41,\r\n ChannelMessage = 42,\r\n ChannelHideMessage = 43,\r\n ChannelMuteUser = 44,\r\n Report = 1984,\r\n ZapRequest = 9734,\r\n Zap = 9735,\r\n RelayList = 10002,\r\n ClientAuth = 22242,\r\n BadgeDefinition = 30008,\r\n ProfileBadge = 30009,\r\n Article = 30023\r\n} */\r\n\r\nexport type MsgTemplate = {\r\n id: string\r\n created: string\r\n dateDeleted: string\r\n content: string\r\n maker: string\r\n sig: string\r\n}\r\n\r\nexport type UnsignedMsg = MsgTemplate & {\r\n pubkey: string\r\n}\r\n\r\nexport type Message = UnsignedMsg & {\r\n id: string\r\n sig: string\r\n}\r\n\r\nexport function getBlankMsg (): MsgTemplate {\r\n return {\r\n id: '',\r\n created: '',\r\n dateDeleted: '', // TODO to remove if not used\r\n content: '',\r\n maker: '',\r\n sig: '' // TODO to remove if not used\r\n }\r\n}\r\n\r\n/* export function finishMsg (t: MsgTemplate, privateKey: string): Message {\r\n // to update to chat message triples\r\n const message = t as Message\r\n // message.pubkey = getPublicKey(privateKey)\r\n message.id = getMsgHash(message)\r\n message.sig = signMsg(message, privateKey)\r\n return message\r\n} */\r\n\r\nexport function serializeMsg (msg: UnsignedMsg): string {\r\n // to update to chat messages triples\r\n /* if (!validateMsg(msg))\r\n throw new Error(\"can't serialize message with wrong or missing properties\") */\r\n\r\n return JSON.stringify(msg)\r\n}\r\n\r\nexport function getMsgHash (message: UnsignedMsg) {\r\n const msgHash = sha256(utf8Encoder.encode(serializeMsg(message)))\r\n return bytesToHex(msgHash)\r\n}\r\n\r\n// const isRecord = (obj: unknown): obj is Record<string, unknown> => obj instanceof Object\r\n\r\n/* export function validateMsg<T> (message: T): message is T & UnsignedMsg {\r\n if (!isRecord(message)) return false\r\n if (typeof message.kind !== 'number') return false\r\n if (typeof message.content !== 'string') return false\r\n if (typeof message.created_at !== 'number') return false\r\n if (typeof message.pubkey !== 'string') return false\r\n if (!message.pubkey.match(/^[a-f0-9]{64}$/)) return false\r\n\r\n if (!Array.isArray(message.tags)) return false\r\n for (let i = 0; i < message.tags.length; i++) {\r\n let tag = message.tags[i]\r\n if (!Array.isArray(tag)) return false\r\n for (let j = 0; j < tag.length; j++) {\r\n if (typeof tag[j] === 'object') return false\r\n }\r\n }\r\n\r\n return true\r\n} */\r\n\r\nexport function verifySignature (sig: string, message: Message, pubKey: string): boolean {\r\n return schnorr.verify(\r\n hexToBytes(sig),\r\n hexToBytes(getMsgHash(message)),\r\n hexToBytes(pubKey)\r\n )\r\n}\r\n\r\nexport function signMsg (message: UnsignedMsg, key: string): string {\r\n return bytesToHex(\r\n schnorr.sign(hexToBytes(getMsgHash(message)), hexToBytes(key))\r\n )\r\n}\r\n"],"mappings":";;;AAO2B,IAAI,YAAY,OAAO;AAClD,IAAa,IAAc,IAAI,YAAY,GAE9B,IAAM;AA6CnB,SAAgB,IAA4B;CAC1C,OAAO;EACL,IAAI;EACJ,SAAS;EACT,aAAa;EACb,SAAS;EACT,OAAO;EACP,KAAK;CACP;AACF;AAWA,SAAgB,EAAc,GAA0B;CAKtD,OAAO,KAAK,UAAU,CAAG;AAC3B;AAEA,SAAgB,EAAY,GAAsB;
|
|
1
|
+
{"version":3,"file":"signature.esm.js","names":[],"sources":["../../src/chat/signature.ts"],"sourcesContent":["import { schnorr } from '@noble/curves/secp256k1.js'\r\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\r\nimport { sha256 } from '@noble/hashes/sha2.js'\r\n\r\n// import {utf8Encoder} from './utils'\r\n// import { getPublicKey } from './keys'\r\n\r\nexport const utf8Decoder = new TextDecoder('utf-8')\r\nexport const utf8Encoder = new TextEncoder()\r\n\r\nexport const SEC = 'https://w3id.org/security#' // Proof, VerificationMethod\r\n// export const CERT = 'http://www.w3.org/ns/auth/cert#' // PrivateKey, PublicKey, key\r\n\r\n/* export enum Kind {\r\n Metadata = 0,\r\n Text = 1,\r\n RecommendRelay = 2,\r\n Contacts = 3,\r\n EncryptedDirectMessage = 4,\r\n EventDeletion = 5,\r\n Reaction = 7,\r\n BadgeAward = 8,\r\n ChannelCreation = 40,\r\n ChannelMetadata = 41,\r\n ChannelMessage = 42,\r\n ChannelHideMessage = 43,\r\n ChannelMuteUser = 44,\r\n Report = 1984,\r\n ZapRequest = 9734,\r\n Zap = 9735,\r\n RelayList = 10002,\r\n ClientAuth = 22242,\r\n BadgeDefinition = 30008,\r\n ProfileBadge = 30009,\r\n Article = 30023\r\n} */\r\n\r\nexport type MsgTemplate = {\r\n id: string\r\n created: string\r\n dateDeleted: string\r\n content: string\r\n maker: string\r\n sig: string\r\n}\r\n\r\nexport type UnsignedMsg = MsgTemplate & {\r\n pubkey: string\r\n}\r\n\r\nexport type Message = UnsignedMsg & {\r\n id: string\r\n sig: string\r\n}\r\n\r\nexport function getBlankMsg (): MsgTemplate {\r\n return {\r\n id: '',\r\n created: '',\r\n dateDeleted: '', // TODO to remove if not used\r\n content: '',\r\n maker: '',\r\n sig: '' // TODO to remove if not used\r\n }\r\n}\r\n\r\n/* export function finishMsg (t: MsgTemplate, privateKey: string): Message {\r\n // to update to chat message triples\r\n const message = t as Message\r\n // message.pubkey = getPublicKey(privateKey)\r\n message.id = getMsgHash(message)\r\n message.sig = signMsg(message, privateKey)\r\n return message\r\n} */\r\n\r\nexport function serializeMsg (msg: UnsignedMsg): string {\r\n // to update to chat messages triples\r\n /* if (!validateMsg(msg))\r\n throw new Error(\"can't serialize message with wrong or missing properties\") */\r\n\r\n return JSON.stringify(msg)\r\n}\r\n\r\nexport function getMsgHash (message: UnsignedMsg) {\r\n const msgHash = sha256(utf8Encoder.encode(serializeMsg(message)))\r\n return bytesToHex(msgHash)\r\n}\r\n\r\n// const isRecord = (obj: unknown): obj is Record<string, unknown> => obj instanceof Object\r\n\r\n/* export function validateMsg<T> (message: T): message is T & UnsignedMsg {\r\n if (!isRecord(message)) return false\r\n if (typeof message.kind !== 'number') return false\r\n if (typeof message.content !== 'string') return false\r\n if (typeof message.created_at !== 'number') return false\r\n if (typeof message.pubkey !== 'string') return false\r\n if (!message.pubkey.match(/^[a-f0-9]{64}$/)) return false\r\n\r\n if (!Array.isArray(message.tags)) return false\r\n for (let i = 0; i < message.tags.length; i++) {\r\n let tag = message.tags[i]\r\n if (!Array.isArray(tag)) return false\r\n for (let j = 0; j < tag.length; j++) {\r\n if (typeof tag[j] === 'object') return false\r\n }\r\n }\r\n\r\n return true\r\n} */\r\n\r\nexport function verifySignature (sig: string, message: Message, pubKey: string): boolean {\r\n return schnorr.verify(\r\n hexToBytes(sig),\r\n hexToBytes(getMsgHash(message)),\r\n hexToBytes(pubKey)\r\n )\r\n}\r\n\r\nexport function signMsg (message: UnsignedMsg, key: string): string {\r\n return bytesToHex(\r\n schnorr.sign(hexToBytes(getMsgHash(message)), hexToBytes(key))\r\n )\r\n}\r\n"],"mappings":";;;AAO2B,IAAI,YAAY,OAAO;AAClD,IAAa,IAAc,IAAI,YAAY,GAE9B,IAAM;AA6CnB,SAAgB,IAA4B;CAC1C,OAAO;EACL,IAAI;EACJ,SAAS;EACT,aAAa;EACb,SAAS;EACT,OAAO;EACP,KAAK;CACP;AACF;AAWA,SAAgB,EAAc,GAA0B;CAKtD,OAAO,KAAK,UAAU,CAAG;AAC3B;AAEA,SAAgB,EAAY,GAAsB;CAChD,IAAM,IAAU,EAAO,EAAY,OAAO,EAAa,CAAO,CAAC,CAAC;CAChE,OAAO,EAAW,CAAO;AAC3B;AAwBA,SAAgB,EAAiB,GAAa,GAAkB,GAAyB;CACvF,OAAO,EAAQ,OACb,EAAW,CAAG,GACd,EAAW,EAAW,CAAO,CAAC,GAC9B,EAAW,CAAM,CACnB;AACF;AAEA,SAAgB,EAAS,GAAsB,GAAqB;CAClE,OAAO,EACL,EAAQ,KAAK,EAAW,EAAW,CAAO,CAAC,GAAG,EAAW,CAAG,CAAC,CAC/D;AACF"}
|