Title: General-purpose value bridging and JSON support · Issue #509 · swiftwasm/JavaScriptKit · GitHub
Open Graph Title: General-purpose value bridging and JSON support · Issue #509 · swiftwasm/JavaScriptKit
X Title: General-purpose value bridging and JSON support · Issue #509 · swiftwasm/JavaScriptKit
Description: BridgeJS supports passing structs and classes around from and to JS as long as function stubs were generated (derived from .d.ts types). It will be very useful to drive this feature completely out of Swift code, and convert to and from J...
Open Graph Description: BridgeJS supports passing structs and classes around from and to JS as long as function stubs were generated (derived from .d.ts types). It will be very useful to drive this feature completely out ...
X Description: BridgeJS supports passing structs and classes around from and to JS as long as function stubs were generated (derived from .d.ts types). It will be very useful to drive this feature completely out ...
Opengraph URL: https://github.com/swiftwasm/JavaScriptKit/issues/509
X: @github
Domain: patch-diff.githubusercontent.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"General-purpose value bridging and JSON support","articleBody":"BridgeJS supports passing structs and classes around from and to JS as long as function stubs were generated (derived from .d.ts types).\n\nIt will be very useful to drive this feature completely out of Swift code, and convert to and from JS values at will for \"general-purpose\" APIs.\n\nThis will allow us to write Swift-only code that can use the `JSON.parse` and `JSON.stringify` from annotated Swift structs.\n\nroughly like:\n```swift\n@JSClass(from: .global)\nstruct JSON {\n @JSFunction static func parse(_ input: String) throws(JSException) -\u003e JSValue\n @JSFunction static func stringify(_ input: JSValue) throws(JSException) -\u003e String\n}\n\n@JSClass\nstruct LocalStorage {\n @JSFunction getItem(_ key: String) throws(JSException) -\u003e String\n @JSFunction setItem(_ key: String, _ value: String) throws(JSException)\n}\n\n@JSGetter(from: .global)\nvar localStorage: LocalStorage\n\n@JS struct MyState {\n var text: String\n var number: Int?\n}\n\nlet value: JSString = try? JSON.stringify(MyState(text: \"hello\"))\nlocalStorage.setItem(\"my-item\", value)\n\nif let item = localStorage.getItem(\"my-item\"),\n let state = try? JSON.parse(item, as: MyState.self)\n{\n print(\"Read my state \\(state)\" \n}\n```\n\nEssentially, there should be an easy way for Swift types (value and reference types) to get a `init(fromJSValue:)` and a `.toJSValue()` or similar.\nIIUC for classes, a \"backed by JSObject\" mechanism exists, and the JSBridge functionally to copy over JS values into a struct exist as well.\n\nImportant caveats:\n+ reference types can have JSObject backing -\u003e memory stays is JS-land and does not have to be copied\n+ value types (structs, enums) -\u003e JSObject backing would break this, suggestion: always copy value over into \"clean\" swift type\n+ non-copyable structs could use JS backing? is that even preferred?","author":{"url":"https://github.com/sliemeobn","@type":"Person","name":"sliemeobn"},"datePublished":"2026-01-22T09:15:56.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/509/JavaScriptKit/issues/509"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:beb3d91e-2b54-f4ee-a5bf-224c4672b564 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | EBD8:38DEA9:746A44:9772CC:69803870 |
| html-safe-nonce | 7bc96902fbd6ddb361b0c8f0c92048cbd82d3c0122b0e6ea4ce6ededbed7976f |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFQkQ4OjM4REVBOTo3NDZBNDQ6OTc3MkNDOjY5ODAzODcwIiwidmlzaXRvcl9pZCI6IjI3MjM5NzU2NzgwMjUyODM2OTYiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 3d9070d7eb7fcdd9957ae0f25a5331e545b67f24f2bb4ccf6d7efa70d7b53e38 |
| hovercard-subject-tag | issue:3841991360 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/swiftwasm/JavaScriptKit/509/issue_layout |
| twitter:image | https://opengraph.githubassets.com/200d431438fff9fac8baf2a474c54e661b13af792bc174d4dc5408bc5225bf86/swiftwasm/JavaScriptKit/issues/509 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/200d431438fff9fac8baf2a474c54e661b13af792bc174d4dc5408bc5225bf86/swiftwasm/JavaScriptKit/issues/509 |
| og:image:alt | BridgeJS supports passing structs and classes around from and to JS as long as function stubs were generated (derived from .d.ts types). It will be very useful to drive this feature completely out ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | sliemeobn |
| hostname | github.com |
| expected-hostname | github.com |
| None | 60279d4097367e16897439d16d6bbe4180663db828c666eeed2656988ffe59f6 |
| turbo-cache-control | no-preview |
| go-import | github.com/swiftwasm/JavaScriptKit git https://github.com/swiftwasm/JavaScriptKit.git |
| octolytics-dimension-user_id | 49500752 |
| octolytics-dimension-user_login | swiftwasm |
| octolytics-dimension-repository_id | 244832006 |
| octolytics-dimension-repository_nwo | swiftwasm/JavaScriptKit |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 244832006 |
| octolytics-dimension-repository_network_root_nwo | swiftwasm/JavaScriptKit |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 7c85641c598ad130c74f7bcc27f58575cac69551 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width