@gtkx/runtime 1.2.2 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +6 -4
  2. package/dist/arg.d.ts +6 -1
  3. package/dist/arg.d.ts.map +1 -1
  4. package/dist/arg.js +2 -1
  5. package/dist/arg.js.map +1 -1
  6. package/dist/closure.d.ts.map +1 -1
  7. package/dist/closure.js +2 -11
  8. package/dist/closure.js.map +1 -1
  9. package/dist/descriptors.d.ts +21 -3
  10. package/dist/descriptors.d.ts.map +1 -1
  11. package/dist/descriptors.js +50 -21
  12. package/dist/descriptors.js.map +1 -1
  13. package/dist/field.d.ts +42 -0
  14. package/dist/field.d.ts.map +1 -0
  15. package/dist/field.js +41 -0
  16. package/dist/field.js.map +1 -0
  17. package/dist/fn.d.ts +2 -0
  18. package/dist/fn.d.ts.map +1 -1
  19. package/dist/fn.js +50 -10
  20. package/dist/fn.js.map +1 -1
  21. package/dist/index.d.ts +14 -6
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +13 -5
  24. package/dist/index.js.map +1 -1
  25. package/dist/mixin.d.ts +2 -1
  26. package/dist/mixin.d.ts.map +1 -1
  27. package/dist/mixin.js +1 -1
  28. package/dist/mixin.js.map +1 -1
  29. package/dist/native-value.d.ts +9 -3
  30. package/dist/native-value.d.ts.map +1 -1
  31. package/dist/native-value.js +86 -9
  32. package/dist/native-value.js.map +1 -1
  33. package/dist/object.d.ts +14 -6
  34. package/dist/object.d.ts.map +1 -1
  35. package/dist/object.js +21 -10
  36. package/dist/object.js.map +1 -1
  37. package/dist/param-spec.d.ts +32 -1
  38. package/dist/param-spec.d.ts.map +1 -1
  39. package/dist/param-spec.js +67 -5
  40. package/dist/param-spec.js.map +1 -1
  41. package/dist/promisify.d.ts +13 -1
  42. package/dist/promisify.d.ts.map +1 -1
  43. package/dist/promisify.js +14 -1
  44. package/dist/promisify.js.map +1 -1
  45. package/dist/properties.d.ts +48 -5
  46. package/dist/properties.d.ts.map +1 -1
  47. package/dist/properties.js +191 -20
  48. package/dist/properties.js.map +1 -1
  49. package/dist/regex.d.ts +25 -0
  50. package/dist/regex.d.ts.map +1 -0
  51. package/dist/regex.js +59 -0
  52. package/dist/regex.js.map +1 -0
  53. package/dist/register-class.d.ts +165 -15
  54. package/dist/register-class.d.ts.map +1 -1
  55. package/dist/register-class.js +175 -19
  56. package/dist/register-class.js.map +1 -1
  57. package/dist/registry.d.ts +48 -4
  58. package/dist/registry.d.ts.map +1 -1
  59. package/dist/registry.js +147 -3
  60. package/dist/registry.js.map +1 -1
  61. package/dist/signal.d.ts +11 -1
  62. package/dist/signal.d.ts.map +1 -1
  63. package/dist/signal.js +66 -6
  64. package/dist/signal.js.map +1 -1
  65. package/dist/t.d.ts +11 -0
  66. package/dist/t.d.ts.map +1 -1
  67. package/dist/t.js +3 -0
  68. package/dist/t.js.map +1 -1
  69. package/dist/type.d.ts +2 -1
  70. package/dist/type.d.ts.map +1 -1
  71. package/dist/type.js +5 -1
  72. package/dist/type.js.map +1 -1
  73. package/dist/value.d.ts +48 -4
  74. package/dist/value.d.ts.map +1 -1
  75. package/dist/value.js +172 -16
  76. package/dist/value.js.map +1 -1
  77. package/dist/variant.d.ts +75 -26
  78. package/dist/variant.d.ts.map +1 -1
  79. package/dist/variant.js +44 -29
  80. package/dist/variant.js.map +1 -1
  81. package/package.json +5 -5
  82. package/src/arg.ts +6 -1
  83. package/src/closure.ts +2 -14
  84. package/src/descriptors.ts +74 -21
  85. package/src/field.ts +76 -0
  86. package/src/fn.ts +73 -17
  87. package/src/index.ts +46 -5
  88. package/src/mixin.ts +1 -1
  89. package/src/native-value.ts +146 -14
  90. package/src/object.ts +23 -11
  91. package/src/param-spec.ts +96 -8
  92. package/src/promisify.ts +27 -1
  93. package/src/properties.ts +280 -32
  94. package/src/regex.ts +92 -0
  95. package/src/register-class.ts +485 -42
  96. package/src/registry.ts +219 -4
  97. package/src/signal.ts +117 -4
  98. package/src/t.ts +13 -0
  99. package/src/type.ts +7 -0
  100. package/src/value.ts +268 -14
  101. package/src/variant.ts +184 -53
@@ -1 +1 @@
1
- {"version":3,"file":"variant.js","sourceRoot":"","sources":["../src/variant.ts"],"names":[],"mappings":"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","sourcesContent":["import * as GLib from \"@gtkx/gi/glib\";\n\n/** JavaScript type every GVariant basic type code unpacks to. */\ntype BasicValueMap = {\n /** Boolean, held as a single byte reading 0 or 1. */\n b: boolean;\n /** Unsigned byte. */\n y: number;\n /** Signed 16-bit integer. */\n n: number;\n /** Unsigned 16-bit integer. */\n q: number;\n /** Signed 32-bit integer. */\n i: number;\n /** Unsigned 32-bit integer. */\n u: number;\n /** Index into the file descriptor list a message carries. */\n h: number;\n /** Double precision floating point number. */\n d: number;\n /** Signed 64-bit integer. */\n x: bigint;\n /** Unsigned 64-bit integer. */\n t: bigint;\n /** UTF-8 string, under no further constraint on what it holds. */\n s: string;\n /** D-Bus object path. */\n o: string;\n /** GVariant type signature. */\n g: string;\n /** Boxed variant holding a value of any type. */\n v: GLib.Variant;\n};\n\n/** Single-character code of one of the GVariant basic types in {@link BasicValueMap}. */\ntype BasicCode = keyof BasicValueMap;\n/** Parses the element type of an array, yielding the array type it produces and the rest of the string. */\ntype ParseArray<S extends string> = Parse<S> extends [infer V, infer R extends string] ? [V[], R] : never;\n/** Parses the element type of a maybe, yielding the nullable type it produces and the rest of the string. */\ntype ParseMaybe<S extends string> = Parse<S> extends [infer V, infer R extends string] ? [V | null, R] : never;\n\n/** Collects tuple member types into `Acc` up to the closing parenthesis, yielding them and the rest of the string. */\ntype ParseTuple<S extends string, Acc extends unknown[]> = S extends `)${infer Rest}`\n ? [Acc, Rest]\n : [Parse<S>] extends [never]\n ? never\n : Parse<S> extends [infer V, infer R extends string]\n ? ParseTuple<R, [...Acc, V]>\n : never;\n\n/** Types a dictionary entry key can hold. */\ntype DictKey = string | number | bigint | boolean;\n\n/** Parses the key and value types of a dictionary entry, yielding them and the rest of the string after its brace. */\ntype ParsePair<S extends string> =\n Parse<S> extends [infer K, infer R1 extends string]\n ? Parse<R1> extends [infer V, infer R2 extends string]\n ? R2 extends `}${infer R3}`\n ? [K] extends [DictKey]\n ? [K, V, R3]\n : never\n : never\n : never\n : never;\n\n/**\n * Parses a dictionary entry into the collection an array of those entries unpacks to, a record for string keys and a\n * `Map` otherwise, plus the rest of the string.\n */\ntype ParseDict<S extends string> =\n ParsePair<S> extends [infer K, infer V, infer R extends string]\n ? [[K] extends [string] ? Record<string, V> : Map<K, V>, R]\n : never;\n\n/** Parses a standalone dictionary entry into a key and value pair, yielding it and the rest of the string. */\ntype ParseEntry<S extends string> =\n ParsePair<S> extends [infer K, infer V, infer R extends string] ? [[K, V], R] : never;\n\n/** Parses what follows an `a` as a dictionary when it opens an entry, and as a plain array otherwise. */\ntype ParseArrayOrDict<S extends string> = S extends `{${infer Rest}` ? ParseDict<Rest> : ParseArray<S>;\n\n/**\n * Parses the type at the head of `S`, yielding the JavaScript type it unpacks to and the rest of the string, or\n * `never` when the string is malformed.\n */\ntype Parse<S extends string> = S extends `a${infer Rest}`\n ? ParseArrayOrDict<Rest>\n : S extends `m${infer Rest}`\n ? ParseMaybe<Rest>\n : S extends `(${infer Rest}`\n ? ParseTuple<Rest, []>\n : S extends `{${infer Rest}`\n ? ParseEntry<Rest>\n : S extends `${infer C}${infer Rest}`\n ? C extends BasicCode\n ? [BasicValueMap[C], Rest]\n : never\n : never;\n\n/** JavaScript type a variant of type string `S` unpacks to, or `unknown` when `S` is not one complete type. */\ntype VariantValue<S extends string> = [Parse<S>] extends [never]\n ? unknown\n : Parse<S> extends [infer V, \"\"]\n ? V\n : unknown;\n\ntype VariantTypeNode =\n | { kind: \"basic\"; code: BasicCode } |\n { kind: \"array\"; elementTypeString: string; element: VariantTypeNode } |\n { kind: \"dict\"; entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode } |\n { kind: \"entry\"; key: VariantTypeNode; value: VariantTypeNode } |\n { kind: \"tuple\"; items: VariantTypeNode[] } |\n { kind: \"maybe\"; elementTypeString: string; element: VariantTypeNode };\n\nconst BASIC_CODES = \"bynqiuxthdsogv\";\nconst STRING_KEY_CODES: Set<string> = new Set([\"s\", \"o\", \"g\"]);\n\nconst CONTAINER_PARSERS: Record<string, (source: string, start: number) => [VariantTypeNode, number]> = {\n a: parseArrayNode,\n m: parseMaybeNode,\n \"(\": parseTupleNode,\n \"{\": parseEntryNode,\n};\n\nconst parsedTypes: Map<string, VariantTypeNode> = new Map();\n\nconst unpackBasic: Record<BasicCode, (variant: GLib.Variant) => unknown> = {\n b: (variant) => variant.getBoolean(),\n y: (variant) => variant.getByte(),\n n: (variant) => variant.getInt16(),\n q: (variant) => variant.getUint16(),\n i: (variant) => variant.getInt32(),\n u: (variant) => variant.getUint32(),\n h: (variant) => variant.getHandle(),\n d: (variant) => variant.getDouble(),\n x: (variant) => variant.getInt64(),\n t: (variant) => variant.getUint64(),\n s: (variant) => variant.getString()[0],\n o: (variant) => variant.getString()[0],\n g: (variant) => variant.getString()[0],\n v: (variant) => variant.getVariant(),\n};\n\nconst packBasic: Record<BasicCode, (value: unknown) => GLib.Variant> = {\n b: (value) => GLib.Variant.newBoolean(value as boolean),\n y: (value) => GLib.Variant.newByte(value as number),\n n: (value) => GLib.Variant.newInt16(value as number),\n q: (value) => GLib.Variant.newUint16(value as number),\n i: (value) => GLib.Variant.newInt32(value as number),\n u: (value) => GLib.Variant.newUint32(value as number),\n h: (value) => GLib.Variant.newHandle(value as number),\n d: (value) => GLib.Variant.newDouble(value as number),\n x: (value) => GLib.Variant.newInt64(value as bigint),\n t: (value) => GLib.Variant.newUint64(value as bigint),\n s: (value) => GLib.Variant.newString(value as string),\n o: packObjectPath,\n g: packSignature,\n v: (value) => GLib.Variant.newVariant(value as GLib.Variant),\n};\n\nconst isBasicCode = (code: string): code is BasicCode => BASIC_CODES.includes(code);\nconst isStringKeyed = (key: VariantTypeNode): boolean => key.kind === \"basic\" && STRING_KEY_CODES.has(key.code);\nconst invalidType = (source: string): Error => new Error(`Invalid GVariant type string \"${source}\"`);\n\nconst parsePair = (source: string, start: number): [VariantTypeNode, VariantTypeNode, number] => {\n const [key, keyEnd] = parseNode(source, start);\n\n if (key.kind !== \"basic\" || key.code === \"v\") {\n throw invalidType(source);\n }\n\n const [value, valueEnd] = parseNode(source, keyEnd);\n\n if (source[valueEnd] !== \"}\") {\n throw invalidType(source);\n }\n\n return [key, value, valueEnd + 1];\n};\n\nfunction parseArrayNode(source: string, start: number): [VariantTypeNode, number] {\n if (source[start] === \"{\") {\n const [key, value, end] = parsePair(source, start + 1);\n\n return [{ kind: \"dict\", entryTypeString: source.slice(start, end), key, value }, end];\n }\n\n const [element, end] = parseNode(source, start);\n\n return [{ kind: \"array\", elementTypeString: source.slice(start, end), element }, end];\n}\n\nfunction parseMaybeNode(source: string, start: number): [VariantTypeNode, number] {\n const [element, end] = parseNode(source, start);\n\n return [{ kind: \"maybe\", elementTypeString: source.slice(start, end), element }, end];\n}\n\nfunction parseTupleNode(source: string, start: number): [VariantTypeNode, number] {\n const items: VariantTypeNode[] = [];\n let position = start;\n\n while (source[position] !== \")\") {\n if (position >= source.length) {\n throw invalidType(source);\n }\n\n const [item, end] = parseNode(source, position);\n items.push(item);\n position = end;\n }\n\n return [{ kind: \"tuple\", items }, position + 1];\n}\n\nfunction parseEntryNode(source: string, start: number): [VariantTypeNode, number] {\n const [key, value, end] = parsePair(source, start);\n\n return [{ kind: \"entry\", key, value }, end];\n}\n\nconst parseNode = (source: string, start: number): [VariantTypeNode, number] => {\n const code = source[start];\n\n if (code === undefined) {\n throw invalidType(source);\n }\n\n const container = CONTAINER_PARSERS[code];\n\n if (container !== undefined) {\n return container(source, start + 1);\n }\n\n if (isBasicCode(code)) {\n return [{ kind: \"basic\", code }, start + 1];\n }\n\n throw invalidType(source);\n};\n\nconst parseVariantType = (typeString: string): VariantTypeNode => {\n const cached = parsedTypes.get(typeString);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const [node, end] = parseNode(typeString, 0);\n\n if (end !== typeString.length) {\n throw invalidType(typeString);\n }\n\n parsedTypes.set(typeString, node);\n\n return node;\n};\n\nconst unpackChildren = (variant: GLib.Variant, unpackChild: (child: GLib.Variant) => unknown): unknown[] => {\n const children: unknown[] = [];\n const count = variant.nChildren();\n\n for (let index = 0; index < count; index += 1) {\n children.push(unpackChild(variant.getChildValue(index)));\n }\n\n return children;\n};\n\nconst unpackPair = (key: VariantTypeNode, value: VariantTypeNode, entry: GLib.Variant): [unknown, unknown] => [\n unpackNode(key, entry.getChildValue(0)),\n unpackNode(value, entry.getChildValue(1)),\n];\n\nconst unpackDict = (\n node: { key: VariantTypeNode; value: VariantTypeNode },\n variant: GLib.Variant,\n): Record<string, unknown> | Map<unknown, unknown> => {\n const entries = unpackChildren(variant, (entry) => unpackPair(node.key, node.value, entry)) as [unknown, unknown][];\n\n if (!isStringKeyed(node.key)) {\n return new Map(entries);\n }\n\n const stringEntries: [string, unknown][] = entries.map(([key, value]) => [key as string, value]);\n\n return Object.fromEntries(stringEntries);\n};\n\nconst unpackMaybe = (element: VariantTypeNode, variant: GLib.Variant): unknown => {\n const child = variant.getMaybe();\n\n return child === null ? null : unpackNode(element, child);\n};\n\nconst unpackNode = (node: VariantTypeNode, variant: GLib.Variant): unknown => {\n switch (node.kind) {\n case \"basic\": {\n return unpackBasic[node.code](variant);\n }\n case \"array\": {\n return unpackChildren(variant, (child) => unpackNode(node.element, child));\n }\n case \"dict\": {\n return unpackDict(node, variant);\n }\n case \"entry\": {\n return unpackPair(node.key, node.value, variant);\n }\n case \"tuple\": {\n return node.items.map((item, index) => unpackNode(item, variant.getChildValue(index)));\n }\n case \"maybe\": {\n return unpackMaybe(node.element, variant);\n }\n }\n};\n\nconst packValidatedString = (\n value: unknown,\n isValid: (value: string) => boolean,\n description: string,\n construct: (value: string) => GLib.Variant,\n): GLib.Variant => {\n if (typeof value !== \"string\" || !isValid(value)) {\n throw new Error(`\"${String(value)}\" is not a valid GVariant ${description}`);\n }\n\n return construct(value);\n};\n\nfunction packObjectPath(value: unknown): GLib.Variant {\n return packValidatedString(\n value,\n (path) => GLib.Variant.isObjectPath(path),\n \"object path\",\n (path) => GLib.Variant.newObjectPath(path),\n );\n}\n\nfunction packSignature(value: unknown): GLib.Variant {\n return packValidatedString(\n value,\n (signature) => GLib.Variant.isSignature(signature),\n \"type signature\",\n (signature) => GLib.Variant.newSignature(signature),\n );\n}\n\nconst packEntry = (key: VariantTypeNode, value: VariantTypeNode, pair: [unknown, unknown]): GLib.Variant =>\n GLib.Variant.newDictEntry(packNode(key, pair[0]), packNode(value, pair[1]));\n\nconst dictEntries = (value: unknown): [unknown, unknown][] =>\n value instanceof Map ? [...value] : Object.entries(value as Record<string, unknown>);\n\nconst packDict = (\n node: { entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode },\n value: unknown,\n): GLib.Variant =>\n GLib.Variant.newArray(\n GLib.VariantType.new(node.entryTypeString),\n dictEntries(value).map((pair) => packEntry(node.key, node.value, pair)),\n );\n\nconst packMaybe = (node: { elementTypeString: string; element: VariantTypeNode }, value: unknown): GLib.Variant =>\n GLib.Variant.newMaybe(\n GLib.VariantType.new(node.elementTypeString),\n value === null ? null : packNode(node.element, value),\n );\n\nconst packNode = (node: VariantTypeNode, value: unknown): GLib.Variant => {\n switch (node.kind) {\n case \"basic\": {\n return packBasic[node.code](value);\n }\n case \"array\": {\n return GLib.Variant.newArray(\n GLib.VariantType.new(node.elementTypeString),\n (value as unknown[]).map((item) => packNode(node.element, item)),\n );\n }\n case \"dict\": {\n return packDict(node, value);\n }\n case \"entry\": {\n return packEntry(node.key, node.value, value as [unknown, unknown]);\n }\n case \"tuple\": {\n return GLib.Variant.newTuple(\n node.items.map((item, index) => packNode(item, (value as unknown[])[index])),\n );\n }\n case \"maybe\": {\n return packMaybe(node, value);\n }\n }\n};\n\n/**\n * Packs a JavaScript value into the `GLib.Variant` a GVariant type string describes, building the\n * nested arrays, dictionaries, tuples and maybes the type calls for. A type string given as a\n * literal also types `value`, so `\"as\"` takes an array of strings, `\"a{sv}\"` a record of variants,\n * `\"(si)\"` a string and a number pair, and a 64-bit type a `bigint`.\n * @param typeString GVariant type of the variant to build, such as `\"a{sv}\"`.\n * @param value Value to pack, shaped the way `typeString` describes.\n * @returns The packed variant.\n * @throws {Error} When the type string is not one complete GVariant type, or when a value packed as\n * an object path or a type signature is not a valid one.\n */\nconst toVariant = <S extends string>(typeString: S, value: VariantValue<S>): GLib.Variant =>\n packNode(parseVariantType(typeString), value);\n\n/**\n * Unpacks a `GLib.Variant` into the JavaScript value a GVariant type string describes, the inverse\n * of {@link toVariant}. A dictionary keyed by strings unpacks to a record and one keyed by anything\n * else to a `Map`, an array to an array, a tuple to an array of its members, a maybe to its value or\n * `null`, and a nested variant to the `GLib.Variant` itself.\n * @param typeString GVariant type the variant holds, such as `\"a{sv}\"`.\n * @param variant Variant to read, which has to hold that type.\n * @returns The unpacked value, typed from `typeString` when it is given as a literal.\n * @throws {Error} When the type string is not one complete GVariant type.\n */\nconst fromVariant = <S extends string>(typeString: S, variant: GLib.Variant): VariantValue<S> =>\n unpackNode(parseVariantType(typeString), variant) as VariantValue<S>;\n\nexport { fromVariant, toVariant, type VariantValue };\n"]}
1
+ {"version":3,"file":"variant.js","sourceRoot":"","sources":["../src/variant.ts"],"names":[],"mappings":"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","sourcesContent":["import * as GLib from \"@gtkx/gi/glib\";\n\n/** JavaScript type every GVariant basic type code unpacks to, with a nested variant held as `Nested`. */\ntype BasicValueMap<Nested> = {\n /** Boolean, held as a single byte reading 0 or 1. */\n b: boolean;\n /** Unsigned byte. */\n y: number;\n /** Signed 16-bit integer. */\n n: number;\n /** Unsigned 16-bit integer. */\n q: number;\n /** Signed 32-bit integer. */\n i: number;\n /** Unsigned 32-bit integer. */\n u: number;\n /** Index into the file descriptor list a message carries. */\n h: number;\n /** Double precision floating point number. */\n d: number;\n /** Signed 64-bit integer. */\n x: bigint;\n /** Unsigned 64-bit integer. */\n t: bigint;\n /** UTF-8 string, under no further constraint on what it holds. */\n s: string;\n /** D-Bus object path. */\n o: string;\n /** GVariant type signature. */\n g: string;\n /** Boxed variant holding a value of any type. */\n v: Nested;\n};\n\n/** Single-character code of one of the GVariant basic types in {@link BasicValueMap}. */\ntype BasicCode = keyof BasicValueMap<unknown>;\n/**\n * JavaScript type a byte array (`ay`) unpacks to: the same one the generated bindings use for byte sequences, so a\n * `Uint8Array` under the `v2ByteArrays` future flag and a `number[]` otherwise.\n */\ntype ByteArray = ReturnType<GLib.Bytes[\"unrefToArray\"]>;\n/** Values a byte array (`ay`) packs from. */\ntype ByteArrayInput = Uint8Array | number[];\n\n/**\n * Parses the element type of an array, yielding the array type it produces and the rest of the string. An array of\n * bytes yields the byte array type instead of `number[]`.\n */\ntype ParseArray<S extends string, Bytes, Nested> = S extends `y${infer Rest}`\n ? [Bytes, Rest]\n : Parse<S, Bytes, Nested> extends [infer V, infer R extends string]\n ? [V[], R]\n : never;\n\n/** Parses the element type of a maybe, yielding the nullable type it produces and the rest of the string. */\ntype ParseMaybe<S extends string, Bytes, Nested> =\n Parse<S, Bytes, Nested> extends [infer V, infer R extends string] ? [V | null, R] : never;\n\n/** Collects tuple member types into `Acc` up to the closing parenthesis, yielding them and the rest of the string. */\ntype ParseTuple<S extends string, Bytes, Nested, Acc extends unknown[]> = S extends `)${infer Rest}`\n ? [Acc, Rest]\n : [Parse<S, Bytes, Nested>] extends [never]\n ? never\n : Parse<S, Bytes, Nested> extends [infer V, infer R extends string]\n ? ParseTuple<R, Bytes, Nested, [...Acc, V]>\n : never;\n\n/** Types a dictionary entry key can hold. */\ntype DictKey = string | number | bigint | boolean;\n\n/** Parses the key and value types of a dictionary entry, yielding them and the rest of the string after its brace. */\ntype ParsePair<S extends string, Bytes, Nested> =\n Parse<S, Bytes, Nested> extends [infer K, infer R1 extends string]\n ? Parse<R1, Bytes, Nested> extends [infer V, infer R2 extends string]\n ? R2 extends `}${infer R3}`\n ? [K] extends [DictKey]\n ? [K, V, R3]\n : never\n : never\n : never\n : never;\n\n/**\n * Parses a dictionary entry into the collection an array of those entries unpacks to, a record for string keys and a\n * `Map` otherwise, plus the rest of the string.\n */\ntype ParseDict<S extends string, Bytes, Nested> =\n ParsePair<S, Bytes, Nested> extends [infer K, infer V, infer R extends string]\n ? [[K] extends [string] ? Record<string, V> : Map<K, V>, R]\n : never;\n\n/** Parses a standalone dictionary entry into a key and value pair, yielding it and the rest of the string. */\ntype ParseEntry<S extends string, Bytes, Nested> =\n ParsePair<S, Bytes, Nested> extends [infer K, infer V, infer R extends string] ? [[K, V], R] : never;\n\n/** Parses what follows an `a` as a dictionary when it opens an entry, and as a plain array otherwise. */\ntype ParseArrayOrDict<S extends string, Bytes, Nested> = S extends `{${infer Rest}`\n ? ParseDict<Rest, Bytes, Nested>\n : ParseArray<S, Bytes, Nested>;\n\n/**\n * Parses the type at the head of `S`, yielding the JavaScript type it unpacks to and the rest of the string, or\n * `never` when the string is malformed.\n */\ntype Parse<S extends string, Bytes, Nested> = S extends `a${infer Rest}`\n ? ParseArrayOrDict<Rest, Bytes, Nested>\n : S extends `m${infer Rest}`\n ? ParseMaybe<Rest, Bytes, Nested>\n : S extends `(${infer Rest}`\n ? ParseTuple<Rest, Bytes, Nested, []>\n : S extends `{${infer Rest}`\n ? ParseEntry<Rest, Bytes, Nested>\n : S extends `${infer C}${infer Rest}`\n ? C extends BasicCode\n ? [BasicValueMap<Nested>[C], Rest]\n : never\n : never;\n\n/** JavaScript type a type string `S` describes, or `unknown` when `S` is not one complete type. */\ntype ParsedValue<S extends string, Bytes, Nested> = [Parse<S, Bytes, Nested>] extends [never]\n ? unknown\n : Parse<S, Bytes, Nested> extends [infer V, \"\"]\n ? V\n : unknown;\n\n/**\n * JavaScript type a variant of type string `S` unpacks to, or `unknown` when `S` is not one complete type. A byte\n * array (`ay`) unpacks to {@link ByteArray} and a nested variant (`v`) to the `GLib.Variant` itself.\n */\ntype VariantValue<S extends string> = ParsedValue<S, ByteArray, GLib.Variant>;\n/**\n * JavaScript type {@link toVariant} packs into a variant of type string `S`, or `unknown` when `S` is not one\n * complete type. The same as {@link VariantValue}, except that a byte array (`ay`) also packs from a `number[]`.\n */\ntype VariantInput<S extends string> = ParsedValue<S, ByteArrayInput, GLib.Variant>;\n/**\n * JavaScript type a variant of type string `S` unpacks to when every nested variant is unwrapped as well, so a `v`\n * reads as `unknown`.\n */\ntype RecursiveVariantValue<S extends string> = ParsedValue<S, ByteArray, unknown>;\n\n/** Options {@link fromVariant} reads. */\ntype FromVariantOptions = {\n /**\n * Whether to unwrap every nested variant (`v`) into the value it holds, all the way down, instead of handing back\n * the `GLib.Variant` itself. Discards the type information those variants carry.\n */\n recursive?: boolean;\n};\n\n/** {@link FromVariantOptions} with recursive unwrapping selected, typing the result accordingly. */\ntype RecursiveFromVariantOptions = {\n /** Unwraps every nested variant (`v`) into the value it holds, all the way down. */\n recursive: true;\n};\n\ntype VariantTypeNode =\n | { kind: \"basic\"; code: BasicCode } |\n { kind: \"array\"; elementTypeString: string; element: VariantTypeNode } |\n { kind: \"dict\"; entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode } |\n { kind: \"entry\"; key: VariantTypeNode; value: VariantTypeNode } |\n { kind: \"tuple\"; items: VariantTypeNode[] } |\n { kind: \"maybe\"; elementTypeString: string; element: VariantTypeNode };\n\nconst BASIC_CODES = \"bynqiuxthdsogv\";\nconst STRING_KEY_CODES: Set<string> = new Set([\"s\", \"o\", \"g\"]);\n\nconst CONTAINER_PARSERS: Record<string, (source: string, start: number) => [VariantTypeNode, number]> = {\n a: parseArrayNode,\n m: parseMaybeNode,\n \"(\": parseTupleNode,\n \"{\": parseEntryNode,\n};\n\nconst parsedTypes: Map<string, VariantTypeNode> = new Map();\nconst BYTE_ARRAY_TYPE_STRING = \"ay\";\n\nconst unpackBasic: Record<BasicCode, (variant: GLib.Variant) => unknown> = {\n b: (variant) => variant.getBoolean(),\n y: (variant) => variant.getByte(),\n n: (variant) => variant.getInt16(),\n q: (variant) => variant.getUint16(),\n i: (variant) => variant.getInt32(),\n u: (variant) => variant.getUint32(),\n h: (variant) => variant.getHandle(),\n d: (variant) => variant.getDouble(),\n x: (variant) => variant.getInt64(),\n t: (variant) => variant.getUint64(),\n s: (variant) => variant.getString()[0],\n o: (variant) => variant.getString()[0],\n g: (variant) => variant.getString()[0],\n v: (variant) => variant.getVariant(),\n};\n\nconst packBasic: Record<BasicCode, (value: unknown) => GLib.Variant> = {\n b: (value) => GLib.Variant.newBoolean(value as boolean),\n y: (value) => GLib.Variant.newByte(value as number),\n n: (value) => GLib.Variant.newInt16(value as number),\n q: (value) => GLib.Variant.newUint16(value as number),\n i: (value) => GLib.Variant.newInt32(value as number),\n u: (value) => GLib.Variant.newUint32(value as number),\n h: (value) => GLib.Variant.newHandle(value as number),\n d: (value) => GLib.Variant.newDouble(value as number),\n x: (value) => GLib.Variant.newInt64(value as bigint),\n t: (value) => GLib.Variant.newUint64(value as bigint),\n s: (value) => GLib.Variant.newString(value as string),\n o: packObjectPath,\n g: packSignature,\n v: (value) => GLib.Variant.newVariant(value as GLib.Variant),\n};\n\nconst isBasicCode = (code: string): code is BasicCode => BASIC_CODES.includes(code);\nconst isStringKeyed = (key: VariantTypeNode): boolean => key.kind === \"basic\" && STRING_KEY_CODES.has(key.code);\nconst invalidType = (source: string): Error => new Error(`Invalid GVariant type string \"${source}\"`);\n\nconst parsePair = (source: string, start: number): [VariantTypeNode, VariantTypeNode, number] => {\n const [key, keyEnd] = parseNode(source, start);\n\n if (key.kind !== \"basic\" || key.code === \"v\") {\n throw invalidType(source);\n }\n\n const [value, valueEnd] = parseNode(source, keyEnd);\n\n if (source[valueEnd] !== \"}\") {\n throw invalidType(source);\n }\n\n return [key, value, valueEnd + 1];\n};\n\nfunction parseArrayNode(source: string, start: number): [VariantTypeNode, number] {\n if (source[start] === \"{\") {\n const [key, value, end] = parsePair(source, start + 1);\n\n return [{ kind: \"dict\", entryTypeString: source.slice(start, end), key, value }, end];\n }\n\n const [element, end] = parseNode(source, start);\n\n return [{ kind: \"array\", elementTypeString: source.slice(start, end), element }, end];\n}\n\nfunction parseMaybeNode(source: string, start: number): [VariantTypeNode, number] {\n const [element, end] = parseNode(source, start);\n\n return [{ kind: \"maybe\", elementTypeString: source.slice(start, end), element }, end];\n}\n\nfunction parseTupleNode(source: string, start: number): [VariantTypeNode, number] {\n const items: VariantTypeNode[] = [];\n let position = start;\n\n while (source[position] !== \")\") {\n if (position >= source.length) {\n throw invalidType(source);\n }\n\n const [item, end] = parseNode(source, position);\n items.push(item);\n position = end;\n }\n\n return [{ kind: \"tuple\", items }, position + 1];\n}\n\nfunction parseEntryNode(source: string, start: number): [VariantTypeNode, number] {\n const [key, value, end] = parsePair(source, start);\n\n return [{ kind: \"entry\", key, value }, end];\n}\n\nconst parseNode = (source: string, start: number): [VariantTypeNode, number] => {\n const code = source[start];\n\n if (code === undefined) {\n throw invalidType(source);\n }\n\n const container = CONTAINER_PARSERS[code];\n\n if (container !== undefined) {\n return container(source, start + 1);\n }\n\n if (isBasicCode(code)) {\n return [{ kind: \"basic\", code }, start + 1];\n }\n\n throw invalidType(source);\n};\n\nconst parseVariantType = (typeString: string): VariantTypeNode => {\n const cached = parsedTypes.get(typeString);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const [node, end] = parseNode(typeString, 0);\n\n if (end !== typeString.length) {\n throw invalidType(typeString);\n }\n\n parsedTypes.set(typeString, node);\n\n return node;\n};\n\nconst isByteArray = (node: VariantTypeNode): boolean =>\n node.kind === \"array\" && node.element.kind === \"basic\" && node.element.code === \"y\";\n\nconst unpackChildren = (variant: GLib.Variant, unpackChild: (child: GLib.Variant) => unknown): unknown[] => {\n const children: unknown[] = [];\n const count = variant.nChildren();\n\n for (let index = 0; index < count; index += 1) {\n children.push(unpackChild(variant.getChildValue(index)));\n }\n\n return children;\n};\n\nconst unpackPair = (\n key: VariantTypeNode,\n value: VariantTypeNode,\n entry: GLib.Variant,\n isRecursive: boolean,\n): [unknown, unknown] => [\n unpackNode(key, entry.getChildValue(0), isRecursive),\n unpackNode(value, entry.getChildValue(1), isRecursive),\n];\n\nconst unpackDict = (\n node: { key: VariantTypeNode; value: VariantTypeNode },\n variant: GLib.Variant,\n isRecursive: boolean,\n): Record<string, unknown> | Map<unknown, unknown> => {\n const entries = unpackChildren(variant, (entry) => unpackPair(node.key, node.value, entry, isRecursive)) as [\n unknown,\n unknown,\n ][];\n\n if (!isStringKeyed(node.key)) {\n return new Map(entries);\n }\n\n const stringEntries: [string, unknown][] = entries.map(([key, value]) => [key as string, value]);\n\n return Object.fromEntries(stringEntries);\n};\n\nconst unpackMaybe = (element: VariantTypeNode, variant: GLib.Variant, isRecursive: boolean): unknown => {\n const child = variant.getMaybe();\n\n return child === null ? null : unpackNode(element, child, isRecursive);\n};\n\nconst unpackNested = (variant: GLib.Variant, isRecursive: boolean): unknown => {\n const held = variant.getVariant();\n\n return isRecursive ? unpackNode(parseVariantType(held.getTypeString()), held, true) : held;\n};\n\nconst unpackNode = (node: VariantTypeNode, variant: GLib.Variant, isRecursive: boolean): unknown => {\n switch (node.kind) {\n case \"basic\": {\n return node.code === \"v\" ? unpackNested(variant, isRecursive) : unpackBasic[node.code](variant);\n }\n case \"array\": {\n return isByteArray(node)\n ? variant.getDataAsBytes().unrefToArray()\n : unpackChildren(variant, (child) => unpackNode(node.element, child, isRecursive));\n }\n case \"dict\": {\n return unpackDict(node, variant, isRecursive);\n }\n case \"entry\": {\n return unpackPair(node.key, node.value, variant, isRecursive);\n }\n case \"tuple\": {\n return node.items.map((item, index) => unpackNode(item, variant.getChildValue(index), isRecursive));\n }\n case \"maybe\": {\n return unpackMaybe(node.element, variant, isRecursive);\n }\n }\n};\n\nconst packValidatedString = (\n value: unknown,\n isValid: (value: string) => boolean,\n description: string,\n construct: (value: string) => GLib.Variant,\n): GLib.Variant => {\n if (typeof value !== \"string\" || !isValid(value)) {\n throw new Error(`\"${String(value)}\" is not a valid GVariant ${description}`);\n }\n\n return construct(value);\n};\n\nfunction packObjectPath(value: unknown): GLib.Variant {\n return packValidatedString(\n value,\n (path) => GLib.Variant.isObjectPath(path),\n \"object path\",\n (path) => GLib.Variant.newObjectPath(path),\n );\n}\n\nfunction packSignature(value: unknown): GLib.Variant {\n return packValidatedString(\n value,\n (signature) => GLib.Variant.isSignature(signature),\n \"type signature\",\n (signature) => GLib.Variant.newSignature(signature),\n );\n}\n\nconst packEntry = (key: VariantTypeNode, value: VariantTypeNode, pair: [unknown, unknown]): GLib.Variant =>\n GLib.Variant.newDictEntry(packNode(key, pair[0]), packNode(value, pair[1]));\n\nconst dictEntries = (value: unknown): [unknown, unknown][] =>\n value instanceof Map ? [...value] : Object.entries(value as Record<string, unknown>);\n\nconst packDict = (\n node: { entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode },\n value: unknown,\n): GLib.Variant =>\n GLib.Variant.newArray(\n GLib.VariantType.new(node.entryTypeString),\n dictEntries(value).map((pair) => packEntry(node.key, node.value, pair)),\n );\n\nconst packMaybe = (node: { elementTypeString: string; element: VariantTypeNode }, value: unknown): GLib.Variant =>\n GLib.Variant.newMaybe(\n GLib.VariantType.new(node.elementTypeString),\n value === null ? null : packNode(node.element, value),\n );\n\nconst packByteArray = (value: unknown): GLib.Variant => {\n if (!(value instanceof Uint8Array) && !Array.isArray(value)) {\n throw new TypeError(\"Expected a Uint8Array or an array of byte values for a byte array (ay)\");\n }\n\n return GLib.Variant.newFromBytes(\n GLib.VariantType.new(BYTE_ARRAY_TYPE_STRING),\n GLib.Bytes.new(value as ByteArrayInput),\n true,\n );\n};\n\nconst packNode = (node: VariantTypeNode, value: unknown): GLib.Variant => {\n switch (node.kind) {\n case \"basic\": {\n return packBasic[node.code](value);\n }\n case \"array\": {\n if (isByteArray(node)) {\n return packByteArray(value);\n }\n\n return GLib.Variant.newArray(\n GLib.VariantType.new(node.elementTypeString),\n (value as unknown[]).map((item) => packNode(node.element, item)),\n );\n }\n case \"dict\": {\n return packDict(node, value);\n }\n case \"entry\": {\n return packEntry(node.key, node.value, value as [unknown, unknown]);\n }\n case \"tuple\": {\n return GLib.Variant.newTuple(\n node.items.map((item, index) => packNode(item, (value as unknown[])[index])),\n );\n }\n case \"maybe\": {\n return packMaybe(node, value);\n }\n }\n};\n\n/**\n * Packs a JavaScript value into the `GLib.Variant` a GVariant type string describes, building the\n * nested arrays, dictionaries, tuples and maybes the type calls for. A type string given as a\n * literal also types `value`, so `\"as\"` takes an array of strings, `\"a{sv}\"` a record of variants,\n * `\"(si)\"` a string and a number pair, a 64-bit type a `bigint`, and `\"ay\"` a `Uint8Array` or an\n * array of byte values.\n * @param typeString GVariant type of the variant to build, such as `\"a{sv}\"`.\n * @param value Value to pack, shaped the way `typeString` describes.\n * @returns The packed variant.\n * @throws {Error} When the type string is not one complete GVariant type, when a value packed as\n * an object path or a type signature is not a valid one, or when a byte array is packed from\n * anything but a `Uint8Array` or an array of byte values.\n */\nconst toVariant = <S extends string>(typeString: S, value: VariantInput<S>): GLib.Variant =>\n packNode(parseVariantType(typeString), value);\n\n/**\n * Unpacks a `GLib.Variant` into the JavaScript value its GVariant type describes, the inverse of\n * {@link toVariant}. A dictionary keyed by strings unpacks to a record and one keyed by anything\n * else to a `Map`, an array to an array, a byte array (`ay`) to the byte array type the generated\n * bindings use (`Uint8Array` under the `v2ByteArrays` future flag, `number[]` otherwise), a tuple\n * to an array of its members, a maybe to its value or `null`, and a nested variant to the\n * `GLib.Variant` itself unless `recursive` is set, in which case it is unwrapped all the way down.\n *\n * The type string is optional: without one the variant's own type is read, and the result is\n * `unknown`. With one given as a literal, the result is typed from it.\n * @param typeString GVariant type the variant holds, such as `\"a{sv}\"`.\n * @param variant Variant to read, which has to hold that type.\n * @param options Whether to unwrap nested variants recursively.\n * @returns The unpacked value.\n * @throws {Error} When the type string is not one complete GVariant type.\n */\nfunction fromVariant<S extends string>(typeString: S, variant: GLib.Variant): VariantValue<S>;\n\nfunction fromVariant<S extends string>(\n typeString: S,\n variant: GLib.Variant,\n options: RecursiveFromVariantOptions,\n): RecursiveVariantValue<S>;\n\nfunction fromVariant<S extends string>(\n typeString: S,\n variant: GLib.Variant,\n options: FromVariantOptions,\n): VariantValue<S> | RecursiveVariantValue<S>;\n\nfunction fromVariant(variant: GLib.Variant, options?: FromVariantOptions): unknown;\n\nfunction fromVariant(\n first: string | GLib.Variant,\n second?: GLib.Variant | FromVariantOptions,\n third?: FromVariantOptions,\n): unknown {\n if (typeof first === \"string\") {\n return unpackNode(parseVariantType(first), second as GLib.Variant, third?.recursive === true);\n }\n\n const options = second as FromVariantOptions | undefined;\n\n return unpackNode(parseVariantType(first.getTypeString()), first, options?.recursive === true);\n}\n\nexport {\n type ByteArray,\n type FromVariantOptions,\n fromVariant,\n type RecursiveFromVariantOptions,\n type RecursiveVariantValue,\n toVariant,\n type VariantInput,\n type VariantValue,\n};\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gtkx/runtime",
3
- "version": "1.2.2",
4
- "description": "FFI runtime the generated GTKX bindings call into: type descriptors, GValue marshalling, signals, GObject lifecycle",
3
+ "version": "1.4.0",
4
+ "description": "FFI runtime for the generated GTK bindings: types, GValues, signals.",
5
5
  "keywords": [
6
6
  "gtkx",
7
7
  "gtk",
@@ -55,11 +55,11 @@
55
55
  "node": ">=24"
56
56
  },
57
57
  "dependencies": {
58
- "@gtkx/native": "1.2.2",
59
- "@gtkx/utils": "1.2.2"
58
+ "@gtkx/native": "1.4.0",
59
+ "@gtkx/utils": "1.4.0"
60
60
  },
61
61
  "devDependencies": {
62
- "@gtkx/vitest": "1.2.2"
62
+ "@gtkx/vitest": "1.4.0"
63
63
  },
64
64
  "scripts": {
65
65
  "release": "tsx ../../scripts/release-package.ts"
package/src/arg.ts CHANGED
@@ -10,12 +10,17 @@ type Arg = {
10
10
  isCallerAllocated?: boolean;
11
11
  /** When true, the argument is consumed internally and left out of the packed result. */
12
12
  isConsumed?: boolean;
13
+ /** When true, the argument is a `GValue` the callee fills in, packed into the result as what it holds. */
14
+ isUnpacked?: boolean;
15
+ /** When true, the caller must provide the argument: `undefined` is rejected instead of reaching C as `NULL`. */
16
+ isRequired?: boolean;
13
17
  };
14
18
 
15
19
  const isOutputArg = (arg: Arg): boolean => arg.direction !== undefined;
16
20
  const isInoutArg = (arg: Arg): boolean => arg.direction === "inout";
17
21
  const isCallerAllocatedArg = (arg: Arg): boolean => arg.isCallerAllocated === true;
22
+ const isUnpackedArg = (arg: Arg): boolean => arg.isUnpacked === true;
18
23
  const isRefArg = (arg: Arg): boolean => arg.direction !== undefined && arg.isCallerAllocated !== true;
19
24
  const requiresInputArg = (arg: Arg): boolean => !isRefArg(arg) || isInoutArg(arg);
20
25
 
21
- export { isOutputArg, isInoutArg, isCallerAllocatedArg, isRefArg, requiresInputArg, type Arg };
26
+ export { isOutputArg, isInoutArg, isCallerAllocatedArg, isRefArg, isUnpackedArg, requiresInputArg, type Arg };
package/src/closure.ts CHANGED
@@ -3,7 +3,7 @@ import { type AnyClass } from "@gtkx/utils";
3
3
  import { bind } from "./bind.js";
4
4
  import { boxedT, callbackT, sizedArrayT, structT, uint32T, uint64T, voidT } from "./descriptors.js";
5
5
  import { CLOSURE_SIZE, LIB, VALUE_SIZE, VALUE_T } from "./library.js";
6
- import { getClassType, getHandle, getWrapperClass, instanceClassName, wrapHandle } from "./registry.js";
6
+ import { describeValueKind, getClassType, getHandle, getWrapperClass, wrapHandle } from "./registry.js";
7
7
  import { resolveBoxedType, typeIsA } from "./type.js";
8
8
  import { fromValue, getValueType, intoValue } from "./value.js";
9
9
 
@@ -70,18 +70,6 @@ const getNestedValue = (param: ExternalObject<Handle>): object | null =>
70
70
  const fromParamValue = (param: ExternalObject<Handle>): unknown =>
71
71
  getValueType(param) === resolveBoxedType(VALUE_T) ? getNestedValue(param) : fromValue(param);
72
72
 
73
- function describeValue(value: unknown): string {
74
- if (value === null) {
75
- return "null";
76
- }
77
-
78
- if (typeof value !== "object") {
79
- return typeof value;
80
- }
81
-
82
- return instanceClassName(value);
83
- }
84
-
85
73
  function marshalFor(callback: ClosureCallback): (...args: unknown[]) => void {
86
74
  return (_closure: unknown, returnValue: unknown, _count: unknown, paramValues: unknown): void => {
87
75
  const values = paramValues as ExternalObject<Handle>[];
@@ -119,7 +107,7 @@ function toClosure(value: unknown): ExternalObject<Handle> {
119
107
  return getHandle(value);
120
108
  }
121
109
 
122
- throw new ClosureMarshalError(`Cannot marshal ${describeValue(value)} into a GObject.Closure`);
110
+ throw new ClosureMarshalError(`Cannot marshal ${describeValueKind(value)} into a GObject.Closure`);
123
111
  }
124
112
 
125
113
  /** Same as {@link toClosure}, but passes a null or undefined value through as no closure at all. */
@@ -102,6 +102,11 @@ type CallbackOptions = {
102
102
  hasUserData?: boolean;
103
103
  /** Position of `user_data` among the callback's own arguments, dropped before the closure is called. */
104
104
  userDataIndex?: number;
105
+ /**
106
+ * The callback's C signature ends with a `GError**`, which receives a `GError` built from
107
+ * whatever the JavaScript function throws while the callback returns its failure value.
108
+ */
109
+ canThrow?: boolean;
105
110
  /** Lifetime of the closure; defaults to `notified` when `hasDestroy` is set and `call` otherwise. */
106
111
  scope?: CallbackDescriptor["scope"];
107
112
  };
@@ -118,6 +123,12 @@ type ArrayOptions = {
118
123
  fixedSize?: number | undefined;
119
124
  /** Whether the array carries raw bytes, and so decodes to a `Uint8Array` rather than to numbers. */
120
125
  isBytes?: boolean | undefined;
126
+ /**
127
+ * Whether the caller supplies the storage for a fixed-length out array: the runtime allocates
128
+ * a buffer of the element stride times the fixed element count, passes its pointer, and
129
+ * decodes the elements the callee wrote into it.
130
+ */
131
+ isCallerAllocated?: boolean | undefined;
121
132
  };
122
133
 
123
134
  /** Where a cursor array's base buffer and total length come from. */
@@ -136,6 +147,8 @@ type FundamentalOptions = {
136
147
  typeName?: string;
137
148
  /** Class a decoded value is wrapped in, instead of the one registered for `typeName`. */
138
149
  wrapperClass?: AnyClass;
150
+ /** The caller owns the storage the callee fills, so a decoded value is borrowed instead of acquired. */
151
+ isCallerAllocated?: boolean;
139
152
  /** The value is embedded in the containing struct rather than reached through a pointer. */
140
153
  isInline?: boolean;
141
154
  };
@@ -194,6 +207,9 @@ const unicharT: UnicharDescriptor = { kind: "unichar" };
194
207
  const bufferT: BufferDescriptor = { kind: "buffer" };
195
208
  const fundamentalLifecycles: Map<string, FundamentalLifecycle> = new Map();
196
209
 
210
+ const isGtypeDescriptor = (descriptor: Descriptor): descriptor is TypeDescriptor =>
211
+ descriptor.kind === "biguint64" && "type" in descriptor;
212
+
197
213
  /**
198
214
  * Builds a descriptor for a C string, whose optional length sizes the caller-allocated buffer
199
215
  * used when the string is passed by reference.
@@ -228,13 +244,25 @@ const enumT = (sharedLibrary: string, typeFnName: string, isSigned: boolean): En
228
244
  isSigned,
229
245
  });
230
246
 
231
- /** Builds a descriptor for a flags type, resolving its GType from the named `get_type` function. */
232
- const flagsT = (sharedLibrary: string, typeFnName: string, isSigned: boolean): FlagsDescriptor => ({
233
- kind: "flags",
234
- sharedLibrary,
235
- getTypeFnName: typeFnName,
236
- isSigned,
237
- });
247
+ /**
248
+ * Builds a descriptor for a flags type, resolving its GType from the named `get_type` function.
249
+ * For flags without a registered GType, pass empty library and function names and supply `mask`,
250
+ * the union of all valid bits, which invalid combinations are rejected against.
251
+ */
252
+ const flagsT = (sharedLibrary: string, typeFnName: string, isSigned: boolean, mask?: number): FlagsDescriptor => {
253
+ const result: FlagsDescriptor = {
254
+ kind: "flags",
255
+ sharedLibrary,
256
+ getTypeFnName: typeFnName,
257
+ isSigned,
258
+ };
259
+
260
+ if (mask !== undefined) {
261
+ result.mask = mask;
262
+ }
263
+
264
+ return result;
265
+ };
238
266
 
239
267
  const applyBoxedNames = (result: BoxedDescriptor, options: BoxedOptions): void => {
240
268
  if (options.sharedLibrary !== undefined) {
@@ -330,6 +358,10 @@ const fundamentalT = (
330
358
  result.wrapperClass = options.wrapperClass;
331
359
  }
332
360
 
361
+ if (options.isCallerAllocated) {
362
+ result.isCallerAllocated = true;
363
+ }
364
+
333
365
  if (options.isInline) {
334
366
  result.isInline = true;
335
367
  }
@@ -337,6 +369,20 @@ const fundamentalT = (
337
369
  return result;
338
370
  };
339
371
 
372
+ const applyArrayBounds = (result: ArrayDescriptor, options: ArrayOptions): void => {
373
+ if (options.baseParamIndex !== undefined) {
374
+ result.baseParamIndex = options.baseParamIndex;
375
+ }
376
+
377
+ if (options.sizeParamIndex !== undefined) {
378
+ result.sizeParamIndex = options.sizeParamIndex;
379
+ }
380
+
381
+ if (options.fixedSize !== undefined) {
382
+ result.fixedSize = options.fixedSize;
383
+ }
384
+ };
385
+
340
386
  /** Builds a descriptor for an array of items in one of the supported container layouts. */
341
387
  const arrayT = (
342
388
  itemDescriptor: Descriptor,
@@ -346,24 +392,22 @@ const arrayT = (
346
392
  ): ArrayDescriptor => {
347
393
  const result: ArrayDescriptor = { kind: "array", itemDescriptor, arrayKind, ownership };
348
394
 
349
- if (options?.elementSize !== undefined) {
350
- result.elementSize = options.elementSize;
395
+ if (options === undefined) {
396
+ return result;
351
397
  }
352
398
 
353
- if (options?.baseParamIndex !== undefined) {
354
- result.baseParamIndex = options.baseParamIndex;
355
- }
399
+ applyArrayBounds(result, options);
356
400
 
357
- if (options?.sizeParamIndex !== undefined) {
358
- result.sizeParamIndex = options.sizeParamIndex;
401
+ if (options.elementSize !== undefined) {
402
+ result.elementSize = options.elementSize;
359
403
  }
360
404
 
361
- if (options?.fixedSize !== undefined) {
362
- result.fixedSize = options.fixedSize;
405
+ if (options.isBytes === true) {
406
+ result.isBytes = true;
363
407
  }
364
408
 
365
- if (options?.isBytes === true) {
366
- result.isBytes = true;
409
+ if (options.isCallerAllocated === true) {
410
+ result.isCallerAllocated = true;
367
411
  }
368
412
 
369
413
  return result;
@@ -428,7 +472,7 @@ const fixedArrayT = (
428
472
  options: ArrayOptions = {},
429
473
  ): ArrayDescriptor => arrayT(itemDescriptor, "fixed", ownership, { ...options, fixedSize });
430
474
 
431
- const applyClosureOptions = (result: CallbackDescriptor, options: CallbackOptions): void => {
475
+ const applyClosureLifetimeOptions = (result: CallbackDescriptor, options: CallbackOptions): void => {
432
476
  if (options.hasDestroy !== undefined) {
433
477
  result.hasDestroy = options.hasDestroy;
434
478
  }
@@ -437,6 +481,14 @@ const applyClosureOptions = (result: CallbackDescriptor, options: CallbackOption
437
481
  result.destroyKind = options.destroyKind;
438
482
  }
439
483
 
484
+ if (options.scope !== undefined) {
485
+ result.scope = options.scope;
486
+ }
487
+ };
488
+
489
+ const applyClosureOptions = (result: CallbackDescriptor, options: CallbackOptions): void => {
490
+ applyClosureLifetimeOptions(result, options);
491
+
440
492
  if (options.hasUserData !== undefined) {
441
493
  result.hasUserData = options.hasUserData;
442
494
  }
@@ -445,8 +497,8 @@ const applyClosureOptions = (result: CallbackDescriptor, options: CallbackOption
445
497
  result.userDataIndex = options.userDataIndex;
446
498
  }
447
499
 
448
- if (options.scope !== undefined) {
449
- result.scope = options.scope;
500
+ if (options.canThrow !== undefined) {
501
+ result.canThrow = options.canThrow;
450
502
  }
451
503
  };
452
504
 
@@ -479,6 +531,7 @@ export {
479
531
  bigint64T,
480
532
  biguint64T,
481
533
  gtypeT,
534
+ isGtypeDescriptor,
482
535
  float32T,
483
536
  float64T,
484
537
  booleanT,
package/src/field.ts ADDED
@@ -0,0 +1,76 @@
1
+ import {
2
+ bindField,
3
+ type Descriptor,
4
+ type ExternalObject,
5
+ type FieldDescriptor,
6
+ type Handle,
7
+ readField,
8
+ writeField,
9
+ } from "@gtkx/native";
10
+
11
+ /**
12
+ * A field of a native struct at a fixed offset, bound once against the descriptor its bytes are
13
+ * marshalled through, so the descriptor is not parsed again on access.
14
+ */
15
+ type Field = {
16
+ /** Reads and decodes the field out of `handle`'s memory. */
17
+ read: (handle: ExternalObject<Handle>) => unknown;
18
+ /** Encodes `value` and writes it into the field of `handle`'s memory. */
19
+ write: (handle: ExternalObject<Handle>, value: unknown) => void;
20
+ };
21
+
22
+ /**
23
+ * A field of a native struct whose offset is supplied per access, bound once against the
24
+ * descriptor its bytes are marshalled through, for walking records stored at a stride.
25
+ */
26
+ type StridedField = {
27
+ /** Reads and decodes the field `offset` bytes into `handle`'s memory. */
28
+ read: (handle: ExternalObject<Handle>, offset: number) => unknown;
29
+ /** Encodes `value` and writes it `offset` bytes into `handle`'s memory. */
30
+ write: (handle: ExternalObject<Handle>, offset: number, value: unknown) => void;
31
+ };
32
+
33
+ /**
34
+ * Binds a struct field whose offset is only known per access, compiling `descriptor` once into an
35
+ * accessor that reads and writes it wherever it is pointed. Use it to walk records stored one
36
+ * after another in a buffer; {@link field} is the one to reach for when the offset is fixed.
37
+ *
38
+ * @param descriptor Describes how the field's bytes are marshalled.
39
+ * @returns An accessor reading and writing that field at any offset of any handle it is given.
40
+ */
41
+ const fieldAt = (descriptor: Descriptor): StridedField => {
42
+ const bound: ExternalObject<FieldDescriptor> = bindField(descriptor);
43
+
44
+ return {
45
+ read: (handle, offset) => readField(bound, handle, offset),
46
+ write: (handle, offset, value) => {
47
+ writeField(bound, handle, offset, value);
48
+ },
49
+ };
50
+ };
51
+
52
+ /**
53
+ * Binds a struct field at a fixed offset, compiling `descriptor` once into an accessor that reads
54
+ * and writes it. The `read` and `write` functions compile the descriptor on every call instead, so
55
+ * they remain the ones to reach for when a descriptor is only known per access.
56
+ *
57
+ * @param descriptor Describes how the field's bytes are marshalled.
58
+ * @param offset Byte offset of the field within its owner's memory.
59
+ * @returns An accessor reading and writing that field of any handle it is given.
60
+ */
61
+ const field = (descriptor: Descriptor, offset: number): Field => {
62
+ if (!Number.isSafeInteger(offset) || offset < 0) {
63
+ throw new RangeError(`A field offset must be a safe whole byte count, got ${String(offset)}`);
64
+ }
65
+
66
+ const bound = fieldAt(descriptor);
67
+
68
+ return {
69
+ read: (handle) => bound.read(handle, offset),
70
+ write: (handle, value) => {
71
+ bound.write(handle, offset, value);
72
+ },
73
+ };
74
+ };
75
+
76
+ export { field, type Field, fieldAt, type StridedField };